结合正交调制的改进算法可以实现不受相位未对准影响的FSK解码。
可以通过检查通过将接收信号乘以参考信号而产生的波形的DC偏移来识别FSK符号的频率。这是一种简单有效的技术,可以在理想化的数学环境中完美运行,但我们在前一篇文章中看到它对相位对准不稳健。
当使用非相干接收器架构时,无法在发射器和接收器之间建立固定的相位关系。这意味着数据包开头的阶段将是不可预测的。仅这一点不会损害我们的解码器算法,因为我们可以使用训练序列来识别解调的基带信号的相位,然后相应地修改参考信号。(但是,我对这种 *** 没有经验,我不知道它在现实生活中会有多么有效。)
然而,当我们考虑短期相位变化时情况变得更糟,因为这些可能导致接收信号的相位在一个分组的空间内偏离参考信号的相位。因此,分组最初可以具有相位对准,但是恶化的相位关系将产生导致整个分组被丢弃的比特错误。
结合正交解调
我在上一篇文章的末尾指出了这个问题的解决方案。我们可以使用正交解调来产生I和Q基带信号,这些信号允许FSK解码算法对相位对准不敏感。
这是对系统的一个非常有益的修改,但它意味着我们需要解调电路中的附加组件(生成I / Q信号而不是单个基带信号)和数字信号处理器中的额外时钟周期(因为数学必须是在两个信号而不是一个信号上执行。
之一个问题是相当小的问题:正交解调现在非常普遍,我认为在大多数情况下,它可以在不显着增加成本,复杂性或PCB尺寸的情况下采用。第二个问题的严重性取决于系统的特征。如果您拥有功能强大的处理器和低数据速率,那么在合并其他数学运算时可能完全没有问题。但是如果您选择了低成本,低功耗的处理器并且您正在尝试更大化数据速率,那么所有新的计算都可能使解码算法无法在下一个数据包到达之前完成处理一个数据包。
Scilab中的I / Q FSK解码
让我们从建立二进制0频率,二进制1频率和每个符号的样本数开始,然后我们将根据每个符号的样本数创建索引变量(n)。
ZeroFrequency = 10e3;
OneFrequency = 30e3;
SamplingFrequency = 300e3;
Samples_per_Symbol = SamplingFrequency / ZeroFrequency;
n = 0:(Samples_per_Symbol-1);
生成I / Q信号
现在我们可以为两个频率生成I和Q符号。按照惯例,I(同相)信号是余弦波形,Q(正交)信号是正弦波形。
Symbol_Zero_I = cos(2 *%pi * n /(SamplingFrequency / ZeroFrequency));
Symbol_One_I = cos(2 *%pi * n /(SamplingFrequency / OneFrequency));
Symbol_Zero_Q = sin(2 *%pi * n /(SamplingFrequency / ZeroFrequency));
Symbol_One_Q = sin(2 *%pi * n /(SamplingFrequency / OneFrequency));
subplot(2,2,1)
plot(n,Symbol_Zero_I)
subplot(2,2,2)
plot(n,Symbol_One_I)
subplot(2,2,3)
plot(n,Symbol_Zero_Q)
subplot(2,2,4)
plot(n,Symbol_One_Q)
f = gcf();
对于k = 1:4
> f.children(k).font_size = 3;
> f.children(k).children.children.thickness = 3;
>结束
(最后的for循环改变了每个子图的刻度标记的大小和每行的粗细。你可以通过图窗口内置的图形界面做同样的事情;使用GUI更直观但变得一段时间后很烦人。)
我们的目标是探索相位错位的I / Q解决方案,因此我们需要符号的相移版本。如前一篇文章所示,接收信号和参考信号之间的最坏情况相位差为90°,因此我们将生成相位为45°的符号(即完美对齐和最差对齐之间的中间)和90° 。
Symbol_Zero_I_45deg = cos(%pi / 4 + 2 *%pi * n /(SamplingFrequency / ZeroFrequency));
Symbol_One_I_45deg = cos(%pi / 4 + 2 *%pi * n /(SamplingFrequency / OneFrequency));
Symbol_Zero_Q_45deg = sin(%pi / 4 + 2 *%pi * n /(SamplingFrequency / ZeroFrequency));
Symbol_One_Q_45deg = sin(%pi / 4 + 2 *%pi * n /(SamplingFrequency / OneFrequency));
Symbol_Zero_I_90deg = cos(%pi / 2 + 2 *%pi * n /(SamplingFrequency / ZeroFrequency));
Symbol_One_I_90deg = cos(%pi / 2 + 2 *%pi * n /(SamplingFrequency / OneFrequency));
Symbol_Zero_Q_90deg = sin(%pi / 2 + 2 *%pi * n /(SamplingFrequency / ZeroFrequency));
Symbol_One_Q_90deg = sin(%pi / 2 + 2 *%pi * n /(SamplingFrequency / OneFrequency));
现在让我们为二进制序列0101创建三组I和Q基带信号。
Baseband_I_aligned = [Symbol_Zero_I Symbol_One_I Symbol_Zero_I Symbol_One_I];
Baseband_Q_aligned = [Symbol_Zero_Q Symbol_One_Q Symbol_Zero_Q Symbol_One_Q];
Baseband_I_45deg = [Symbol_Zero_I_45deg Symbol_One_I_45deg Symbol_Zero_I_45deg Symbol_One_I_45deg];
Baseband_Q_45deg = [Symbol_Zero_Q_45deg Symbol_One_Q_45deg Symbol_Zero_Q_45deg Symbol_One_Q_45deg];
Baseband_I_90deg = [Symbol_Zero_I_90deg Symbol_One_I_90deg Symbol_Zero_I_90deg Symbol_One_I_90deg];
Baseband_Q_90deg = [Symbol_Zero_Q_90deg Symbol_One_Q_90deg Symbol_Zero_Q_90deg Symbol_One_Q_90deg];
subplot(3,2,1)
plot(Baseband_I_aligned)
subplot(3,2,2)
plot(Baseband_Q_aligned)
subplot(3,2,3)
plot(Baseband_I_45deg)
subplot(3,2,4)
plot(Baseband_Q_45deg)
subplot(-3,2,5-)
plot(Baseband_I_90deg)
subplot(3,2,6)
plot(Baseband_Q_90deg)
f = gcf();
对于k = 1:6
> f.children(k).font_size = 3;
>结束
爱情就是尊重,爱情就是忠诚,假如男人在成家后还总是去“偷腥”,那么这样的男人就不是真的爱你。因为假如是真的爱你,他就不会舍得让你伤心。上次我们说到,社会上的形形色色的 诱惑实在是太多了,而男人则是被成...
“冯女郎”出身的杨采钰凭借高级脸出圈,私服穿搭功力成功塑造法式风情。杨采钰的穿搭风格,饱含复古风情,却又显得毫不费力,在漫不经心的慵懒间散发时髦与精致,气质浑然天成。美颜圈粉的同时也带火了不少小众品牌...
淘宝开店,卖家要知道淘宝店铺后台的基本操作,卖家要知道淘宝店铺后台设置有哪些?卖家们可能也都知道,在注册淘宝店铺填写信息的时候,我们也需要给我们的淘宝店铺起一个名字,以便于我们的淘宝店铺在之后的经...
今天不经意在一个企鹅群里看到了这样一则消息: 什么!打字员1000字30元?打稿子月收入2000? 你也太小看我了好吗? 以我目前分均120+的打字速度(常用字)来计算: 我一个小时可以赚...
随着信用卡在我国的普及,越来越多的年轻人为了消费便利开始办理信用卡。面对银行琳琅满目的信用卡,不少人在初次办理时都忐忑不安:为什么要办理信用卡?办理信用卡会不会沦为卡奴?哪些信用卡适合年轻人?办理信用...
电脑怎么设置定时开机?不少用户都询问过如何在电脑上设置定时开机,那么下面就给大家分享电脑设置定时开机的操作方法,注意,不是每个主板都支持定时开机功能的。 步骤一: 启动系统进入BIOS设置界面...