结合正交调制的改进算法可以实现不受相位未对准影响的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;
>结束
最近玩十三号病这个游戏的玩家都在问,游戏里面医院的洗衣粉怎么放?十三号病院作为解密游戏,还是有一定难度的,很多玩家都卡在了第三章的洗衣粉这里,这里要大家正确放洗衣粉才能洗衣服,小编我特意整理了相关的资...
感冒发烧是一个人在日常生活中必然要经历的。为防止小病引发大病,很多人在家里自备了温度计来测量体温,这样不仅可以及时了解自己的身体状况,还能方便自己的生活。因此,体温计怎么看成为许多人比较关注的问题。...
社保和每个人都息息相关,理论上说社保是国家规定要强制缴纳的,似乎不存在要不要缴的问题,但是对很多人而已,虽然单位每个月都会为你缴纳社保,但是无形当中你实际到手的工资却因为社保而减少,因此很多人对缴纳社...
《缺氧》汉化补丁正确使用方法介绍 怎么汉化?《缺氧》正版英文界面对玩家来说有些看不懂,只能下载汉化补丁进行汉化。汉化补丁怎么用?下面6399小编带来了正确使用方法介绍,一起来看看吧。 方法:...
win10小娜在微软正式推出之后还是有很多网友们一直在犹豫,这是什么东东,到底应该用还是不应该用,所以我们先来了解一下什么是微软win10小娜。 直接喊小娜我要看天气或者搜索一些东西的时候就可以让小...
12月份一开始支付宝红包又火了,红包力度加大,全民开始薅支付宝羊毛。不过,支付宝耗资这么多个亿也不是做慈善,当然有它的意图,不过用户有红包赚,支付宝红包也能完成它的使命,两全其美,何乐不为? 只...