有谁知道我可以在任何地方找到软件锁相环 (SPLL) 的实际代码示例?
我需要一个 SPLL,它可以跟踪介于 1.1 KHz 和 1.3 KHz 之间的 PSK 调制信号。谷歌搜索带来了大量的学术论文和专利,但没有任何可用的。即使是去一趟大学图书馆,里面装满了关于硬件 PLL 的书,一本关于 SPLL 的书也只有一章,而且理论多于实践。
谢谢你的时间。
伊恩
有谁知道我可以在任何地方找到软件锁相环 (SPLL) 的实际代码示例?
我需要一个 SPLL,它可以跟踪介于 1.1 KHz 和 1.3 KHz 之间的 PSK 调制信号。谷歌搜索带来了大量的学术论文和专利,但没有任何可用的。即使是去一趟大学图书馆,里面装满了关于硬件 PLL 的书,一本关于 SPLL 的书也只有一章,而且理论多于实践。
谢谢你的时间。
伊恩
我想这可能为时已晚,无法帮助您(您最终做了什么?)但它可能会帮助下一个人。
这是我刚刚用一行 C 语言编写的软件锁相环的打高尔夫球示例,它将与您一起唱歌:
main(a,b){for(;;)a+=((b+=16+a/1024)&256?1:-1)*getchar()-a/512,putchar(b);}
我首先介绍这个小型高尔夫版本,以使您相信软件锁相环实际上相当简单,就像软件一样,尽管它们可能很棘手。
如果您在标准输入上输入 8 位线性样本,它将产生 8 位锯齿波样本,试图在标准输出上跟踪高一个八度音程。每秒 8000 个样本,它跟踪 250Hz 附近的频率,就在中间 C 下方的 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 的原因。
然后取500Hz 左右的锯齿波putchar()
的低 8 位,并将它们作为输出音频流喷出。b
这个简单的例子缺少几件事:
它没有很好的方法来检测 lock。如果您有静音、噪音或强烈的纯 250Hz 输入音调,a 将大致为零,b 将以其默认频率振荡。根据您的应用程序,您可能想知道是否找到了信号!Camenzind 在《设计模拟芯片》第 12 章中的建议是提供第二个“相位检测器”,与实际相位检测器相差 90°;它的平滑输出为您提供了理论上锁定的信号幅度。
振荡器的固有频率是固定的,不扫频。PLL的捕获范围,即如果当前没有锁定到某个频率,它会注意到振荡的频率间隔非常窄。它的锁定范围要大得多,一旦锁定,它将在该范围内跟随信号。因此,通常会在您希望找到信号的整个范围内扫描 PLL 的频率,直到锁定,然后停止扫描。
上面的打高尔夫球的版本是从我今天写的 C 语言软件锁相环的一个更易读的例子中减少的,它确实进行锁定检测但不扫描。在我上网本的 Atom CPU 上,每个 PLL 的每个输入样本需要大约 100 个 CPU 周期。
我认为,如果我处于您的情况,我会做以下事情(除了寻找比我更了解信号处理的人以及生成测试数据等显而易见的事情)。我可能不会在前端过滤和下变频信号,因为它已经处于如此低的频率。似乎几乎没有必要下变频到 200Hz-400Hz 频段。我怀疑PSK会带来一些新的问题,因为如果信号突然相位偏移90°或更多,你就会失去锁相;但我怀疑这些问题会很容易解决,而且这几乎不是无人涉足的领域。
这是一个交互式设计包,用于设计数字(即软件)锁相环 (PLL)。填写表格并按“提交”按钮,将为您设计一个 PLL。
这将帮助您入门,但您确实需要充分了解 PLL 设计的基础知识以便自己构建它以便以后对其进行故障排除 - 这是数字信号处理的领域,虽然不是黑魔法,但它肯定会给您一个在调试期间为你的钱跑。
-亚当
有带 Simulink 的 Matlab 吗?此处的 Matlab Central 提供 PLL 演示文件。Matlab 的代码生成功能可能会让您从那里获得用 C 编写的 PLL。