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

Ian*_*anW 7 signal-processing

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

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

谢谢你的时间.

伊恩

Kra*_*ker 13

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

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

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

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

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

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

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

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

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

上面的高尔夫版本从我今天写的C软件锁相环的一个更易读的例子中减少了,它确实进行了锁定检测,但没有扫描.在我的上网本的Atom CPU上,每个PLL每个输入样本需要大约100个CPU周期.

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


Ada*_*vis 2

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

交互式数字锁相环设计

这将帮助您入门,但您确实需要充分了解 PLL 设计的基础知识,以便自己构建它,以便稍后对其进行故障排除 - 这是数字信号处理的领域,虽然不是黑魔法,但它肯定会给您带来在调试期间运行你的钱。

-亚当

  • @Keith 该网页确实已损坏,不幸的是创建它的人已于 2000 年去世,并且该网页和网站不再得到积极维护。该页面被复制到其他地方,例如http://www.piclist.com/techref/uk/ac/york/cs/www-users/http/~fisher/mkpll/index.htm,但是原始服务器脚本拒绝条目来自其他网站。您也许可以通过一些巧妙的脚本拼凑一些东西,为服务器提供它想要的东西并接收您的 PLL 代码,但是我认为此时人们需要使用这个问题中的其他答案。 (2认同)