关于信号处理:需要软件锁相环示例代码

关于信号处理:需要软件锁相环示例代码

Software Phase Locked Loop example code needed

有人知道我在任何地方都能找到软件锁相环(SPLL)的实际代码示例吗?

我需要一个SPLL,它可以跟踪1.1 KHz至1.3 KHz之间的PSK调制信号。 Google搜索带来了大量学术论文和专利,但没有用。即使是到大学图书馆旅行,其中包含一本关于硬件PLL的书的书架,在有关SPLL的书中也只有一章,而且理论上比实际要多。

感谢您的时间。

伊恩


我想这可能为时已晚,无法帮助您(您最终做了什么?),但可能会帮助下一个人。

这是我刚刚在C的一行中写的一个软件锁相环的例子,它将与您一起唱歌:

1
main(a,b){for(;;)a+=((b+=16+a/1024)&256?1:-1)*getchar()-a/512,putchar(b);}

我首先介绍这个小巧的高尔夫球版本,以便说服您软件锁相环实际上相当简单,尽管它们可能很棘手。

如果您在stdin上输入8位线性样本,它将生成一个锯齿波的8位样本,试图在stdout上跟踪一个Octave。它以每秒8000个样本的速度跟踪250Hz附近的频率,正好位于中间C下方的B上方。在Linux上,您可以通过键入arecord | ./pll | aplay来执行此操作。 b的低9位是振荡器(在硬件实现中可能是VCO),它产生一个方波(1或-1),该方波乘以输入波形(getchar())产生鉴相器的输出。然后将该输出低通滤波为a,以生成平滑的相位误差信号,该信号用于调整b的振荡频率以将a推向0。方波的固有频率,当,表示b每采样增加16个,每32个采样增加512个(一个完整的周期)。 32个样本(每秒8000个样本)是1/250秒,这就是固有频率为250Hz的原因。

然后putchar()占用b的低8位,它们构成500Hz左右的锯齿波,并将它们喷出作为输出音频流。

这个简单的示例缺少几件事:

  • 它没有检测锁定的好方法。如果您有静音,噪音或纯正的250Hz输入音,则a大约为零,b将以其默认频率振荡。根据您的应用程序,您可能想知道是否找到了信号! Camenzind在《设计模拟芯片的设计》第12章中的建议是,将第二个"相位检测器"馈入与实际相位检测器异相90°的位置。其平滑的输出为您提供了理论上已锁定到的信号的幅度。

  • 振荡器的固有频率是固定的,不会扫频。 PLL的捕获范围非常窄;如果当前未锁定在PLL上,它将捕获振荡的频率间隔;它的锁定范围要大得多,锁定范围会更大,以便在信号锁定后跟随信号。因此,通常会在希望找到信号的整个范围内扫描PLL的频率,直到获得锁定为止,然后停止扫描。

  • 上面的高尔夫版本比我今天编写的C语言中软件锁相环的示例更具可读性,该示例确实执行了锁定检测但不进行扫描。我的上网本中,Atom CPU上每个PLL的每个输入采样大约需要100个CPU周期。

    我认为,如果我遇到您的情况,我会做以下事情(除了显而易见的事情,例如寻找比我更了解信号处理的人,并生成测试数据)。我可能不会在前端对信号进行滤波和下变频,因为它已经处于如此低的频率。几乎没有必要下变频到200Hz-400Hz频段。我怀疑PSK会带来一些新问题,因为如果信号突然移相90°或更多,您将失去锁相;但是我怀疑这些问题将很容易解决,而且领土也并非一成不变。


    This is an interactive design package
    for designing digital (i.e. software)
    phase locked loops (PLLs). Fill in the
    form and press the ``Submit'' button,
    and a PLL will be designed for you.

    Interactive Digital Phase Locked Loop Design

    这将帮助您入门,但是您确实需要充分了解PLL设计的基础知识,以便自己进行构建,以便以后进行故障排除-这是数字信号处理的领域,尽管不是黑魔法,但它肯定会在调试过程中为您省钱。

    -亚当


    使用Simulink进行Matlab吗? Matlab Central此处提供了PLL演示文件。 Matlab的代码生成功能可能会带您进入用C编写的PLL。


    推荐阅读