我目前正在实施声学FSK调制和解调。我不是信号处理专家,所以对于位定时恢复的任何帮助将不胜感激。目前,我对每个音调使用两个匹配的滤波器来实现解调器(非相干检测的相位差为$ 90 ^ {\ circ} $)。基本上,每个滤波器的输出都是振幅不同的峰值。我有两个问题:


如何执行位定时恢复?
对于包同步前同步码(线性调频,巴克码,黄金码等),您有什么建议?
/>
我用Google搜索了Gardner算法,但不确定它是否适用以及如何适用。考虑一下,我目前正在使用声卡处理2个频率为800 bps的比特率。

#1 楼


我目前正在执行声学FSK调制和解调。我不是信号处理专家...

由于您说您已经匹配了滤波器,并且提到了非相干检测,所以我认为您已经很像一个数字通信人员了,迈向了DSP的人非常小:)
成熟的同步器SDR方法
所以,经典的实现方法是将两个滤波器的输出(幅度)平方,低通滤波器结果超过$ 2 f_ \ text {symbol,max} $,并且在过滤过程中/之后(如果可能的话),这样我们就不会浪费每秒的操作。
我使自己成为了一个快速的真实价值带通信号FSK解调(我想如果再做一次,我将用一个组合的频率转换和一个低通滤波器替换两个带通滤波器,给我带来复杂的基带,或者针对这个问题扔了一个多相滤波器组,但是无论如何)在GNU Radio随播广告的帮助下的GNU Radio(此处为流程图文件):

重点是我们可能想要符号定时在除法和阈值块之间同步。之后我们可以做–经典的“微控制器和数字硬件设计”方法实际上是Muller&Mueller时钟接收器,并且在那也可以工作–但我们不要浪费斜坡信息。 d在此处添加多相时钟同步;我必须承认,我不能比哈里斯的门徒汤姆(Tom)在同名的GNU Radio模块的文档中做的更好:

使用多相滤波器组的定时同步器。
此模块执行计时通过最小化滤波信号的导数来实现PAM信号的同步,这反过来又使SNR最大化并使ISI最小化。
这种方法通过建立两个滤波器组来起作用。一个滤波器组包含信号的脉冲整形匹配滤波器(例如根升余弦滤波器),其中滤波器组的每个分支都包含滤波器的不同相位。第二个滤波器组包含第一个滤波器组中滤波器的导数。考虑到时域,第一个滤波器组包含具有正弦形状的滤波器。我们希望将要采样的输出信号对准正弦形状的峰值。 sinc的导数在$ \ text {sinc} $的最大值处包含零($ \ text {sinc}(0)= 1,\,\ text {sinc}'(0)= 0 $)。此外,零点附近的区域是相对线性的。我们利用这一事实来生成误差信号。
如果第i个滤波器的输出信号是微分滤波器的信号$ d_i [n] $,而匹配滤波器的输出是$ x_i [ n] $,我们将错误计算为:
$$ e [n] = \ frac {\ Re \ {x_i [n] \} \ cdot \ Re \ {d_i [n] \} + \ Im \ {x_i [n] \} \ cdot \ Im \ {d_i [n] \}} {2.0} \ text {。} $$
此等式平均化了实部和虚部的误差。我们乘以信号本身有两个原因。首先,符号可能是正向还是负向,但是我们希望误差项始终告诉我们朝着相同的方向前进,具体取决于零点位于哪一侧。 $ x_i [n] $的符号会调整误差项来执行此操作。其次,$ x_i [n] $的大小取决于符号的幅度来缩放误差项,因此较大的信号为我们提供了更强的误差项,因为我们对该符号的值更有信心。对于低SNR的信号,使用$ x_i [n] $的大小而不是仅使用符号特别有用。
误差信号$ e [n] $给我们一个值,该值与微分信号中距零点的距离成比例。我们希望将此值驱动为零,因此我们设置了一个二阶循环。这个循环有两个变量: $ d_k $是我们所在的过滤器组中的过滤器编号,$ d_ \ text {rate} $是我们在稳态下通过过滤器的速率。也就是说,由于发送器和接收器之间的自然时钟差异,$ d_ \ text {rate} $表示该差异,并且会遍历滤波器的相位路径以使接收器保持锁定状态。将其视为二阶PLL,$ d_ \ text {rate} $是频率,而$ d_k $是相位。因此,我们使用基于两个误差信号$ d_ \ alpha $和$ d_ \ beta $的标准循环方程式更新$ d_ \ text {rate} $和$ d_k $。我们为临界阻尼系统设置了两个基于彼此的值,因此在块构造器中,我们只要求“增益”,即$ d_ \ alpha $而$ d_ \ beta $等于$ \ frac { \ text {gain} ^ 2} {4} $。

意识到这是音频
,因此,适当地参数化此块(并可能减小bpf_decimlpf_decim可以使同步器有更大的余量移相),您可以建立一个非常稳定的符号定时恢复,这对于您的应用程序来说完全是过大了。😁
由于您正在使用两端的声卡进行采样,并且由于我想您不必在处理多普勒时,符号率与载波频率具有固定的关系(例如,发送方具有较高的载波,其周期为8个声卡样本,而一个符号通常需要128个样本,因此比率是固定的),您可以采取捷径:
如果您知道载波频率与符号率之间的比率,则只需估算其中一个即可免费获得另一个!在这种情况下,FSK尤为容易:只需等待一段时间,例如高频带处于活动状态,并使用正交解调器(即,实际上是$ \ frac {d \ arctan} {dt} [n] $)在抽取带通滤波器之后估算载波频率,并使用结果值作为频率校正因子–您可以立即解决载波频率恢复和符号率恢复问题。我什至都不认为之后需要定时恢复–在阈值化之后,如果您对样本进行了过多采样(以这些速率,这不是问题),则可以在一个窗口中做出多数决定,或者转移
关于Packet Sync
好吧,因为您有一个正常工作的解调器,当没有信号时,解调器可能会运行得太不同步,只需使用已知的固定数据序列即可找到您的数据包。