需要软件阶段锁定循环示例代码

时间:2008-09-02 13:18:19

标签: signal-processing

有谁知道我能在哪里找到软件锁相环(SPLL)的实际代码示例?

我需要一个可以跟踪PSK调制信号的SPLL,该信号介于1.1 KHz和1.3 KHz之间。谷歌搜索带来了大量的学术论文和专利,但没有任何用处。即使前往大学图书馆,其中包含一个装满硬件PLL书籍的书架,但在一本关于SPLL的书中只有一章,而且理论上更实际。

感谢您的时间。

伊恩

3 个答案:

答案 0 :(得分:13)

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

这是一个软件锁相环的高尔夫示例,我刚刚在一行C中写道,它会和你一起唱:

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

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

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

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

这个简单的例子中缺少一些东西:

  1. 没有好的方法来检测锁。如果你有静音,噪音或强烈的纯250Hz输入音,a将大致为零,b将以其默认频率振荡。根据您的应用,您可能想知道您是否找到了信号! Camenzind在Designing Analog Chips第12章中提出的建议是从真实相位检测器馈送90°异相的第二个“相位检测器”;它的平滑输出为您提供理论上锁定的信号幅度。

  2. 振荡器的固有频率是固定的,不会扫描。 PLL的捕获范围,如果当前没有锁定到一个振荡器,它将注意到振荡的频率间隔非常窄;它的锁定范围,一旦它被锁定,它将在其范围内跟随信号的范围要大得多。因此,通常会在您希望找到信号的范围内扫描PLL的频率,直到您获得锁定,然后停止扫描。

  3. 上面的高尔夫版本从我今天写的much more readable example of a software phase-locked loop in C减少了,它确实进行了锁定检测但没有扫描。在我的上网本中,Atom CPU上每个PLL的每个输入样本大约需要100个CPU周期。

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

答案 1 :(得分:2)

  

这是一个交互式设计包   用于设计数字(即软件)   锁相环(PLL)。填写   形成并按下“提交”按钮,   并将为您设计一个PLL。

     

Interactive Digital Phase Locked Loop Design

这将让你开始,但你真的需要很好地理解PLL设计的基本原理,以便自己构建它以便以后进行故障排除 - 这是数字信号处理的领域,并且虽然不是黑魔法,它肯定会在调试过程中为你赚钱。

- 亚当

答案 2 :(得分:1)

与Simulink一起使用Matlab吗? Matlab Central here提供了PLL演示文件。 Matlab的代码生成功能可能会让您从那里转到用C语言编写的PLL。