有谁知道在哪里可以找到软件锁相环(SPLL)的实际代码示例?
我需要一个可以跟踪 1.1 KHz 到 1.3 KHz 之间 PSK 调制信号的 SPLL。谷歌搜索显示了大量学术论文和专利,但没有任何可用的。即使去一趟大学图书馆,那里摆满了关于硬件 PLL 的书,一本关于 SPLL 的书中也只有一章,而且理论性多于实践性。
谢谢你的时间。
Ian
我想这可能已经太晚了,无法帮助你(你最终做了什么?),但它可能会帮助下一个人。
这是我刚刚用一行 C 语言编写的软件锁相环的高尔夫球示例,它将与您一起唱歌:
main(a,b){for(;;)a+=((b+=16+a/1024)&256?1:-1)*getchar()-a/512,putchar(b);}
我首先展示这个小型高尔夫球版本是为了让您相信软件锁相环实际上相当简单,就像软件一样,尽管它们可能很棘手。
如果您在标准输入上向其提供 8 位线性样本,它将生成锯齿波的 8 位样本,尝试在标准输出上跟踪高一个八度。以每秒 8000 个样本的速度,它跟踪 250Hz 附近的频率,位于 B 上方、C 中间下方。在 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 的原因。
Then putchar()
取低 8 位b
,形成 500Hz 左右的锯齿波,并将其作为输出音频流喷出。
这个简单的例子缺少一些东西:
它没有什么好处检测锁的方法。如果您有静音、噪音或强烈的纯 250Hz 输入音,a 将大致为零,b 将以其默认频率振荡。根据您的应用程序,您可能想知道是否找到了信号! Camenzind 在第 12 章中的建议设计模拟芯片 http://designinganalogchips.com/是向第二个“相位检测器”提供与实际相位检测器90°异相的信号;其平滑输出为您提供理论上锁定的信号的幅度。
振荡器的固有频率是固定的,不扫. The 捕获范围对于 PLL 来说,如果当前没有锁定某个频率,那么它会注意到振荡的频率间隔非常窄;它是锁定范围,一旦锁定,为了跟随信号,它的范围要大得多。因此,通常会在您期望找到信号的整个范围内扫描 PLL 频率,直到获得锁定,然后停止扫描。
上面的高尔夫版本是从更易读的 C 语言软件锁相环示例 http://lists.canonical.org/pipermail/kragen-hacks/2012-February/000534.html我今天写的,它确实进行锁定检测,但不进行扫描。在我上网本的 Atom CPU 上,每个 PLL 的每个输入样本大约需要 100 个 CPU 周期。
我认为,如果我处于您的情况,我会执行以下操作(除了明显的事情,例如寻找比我更了解信号处理的人以及生成测试数据)。我可能不会在前端对信号进行滤波和下变频,因为它的频率已经很低了。下变频到 200Hz-400Hz 频段似乎几乎没有必要。我怀疑 PSK 会带来一些新问题,因为如果信号突然移相 90° 或更多,就会失去锁相;但我怀疑这些问题很容易解决,而且这并不是一个无人涉足的领域。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)