结合正交调制的改进算法可以实现不受相位未对准影响的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;
>结束
79736 篇文章