【问题标题】:Software Phase Locked Loop example code needed需要软件锁相环示例代码
【发布时间】:2008-09-02 13:18:19
【问题描述】:

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

我需要一个 SPLL,它可以跟踪介于 1.1 KHz 和 1.3 KHz 之间的 PSK 调制信号。谷歌搜索带来了大量的学术论文和专利,但没有任何可用的。即使去一趟大学图书馆,书架上摆满了硬件 PLL 方面的书籍,一本关于 SPLL 的书也只有一章,而且理论多于实践。

感谢您的宝贵时间。

伊恩

【问题讨论】:

标签: signal-processing


【解决方案1】:

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

这是我刚刚用一行 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 来完成此操作。 b 的低 9 位是振荡器(在硬件实现中可能是 VCO),它生成一个方波(1 或 -1),该方波与输入波形 (getchar()) 相乘以产生相位检测器的输出。然后将该输出低通滤波到a 以产生平滑的相位误差信号,该信号用于调整b 的振荡频率以将a 推向0。方波的固有频率,当@987654330 @, 用于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 的频率,直到锁定,然后停止扫描。

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

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

【讨论】:

    【解决方案2】:

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

    Interactive Digital Phase Locked Loop Design

    这将使您入门,但您真的需要充分了解 PLL 设计的基础知识,以便自己构建它以便以后对其进行故障排除 - 这是数字信号处理的领域,并且虽然不是黑魔法,但它肯定会让您在调试过程中物有所值。

    -亚当

    【讨论】:

    • 此页面在我尝试过的任何浏览器中都无法正常工作 - 你是如何让它工作的?
    • @Keith 网页确实坏了,可惜创建它的人在 2000 年就去世了,网页和网站都不再积极维护了。该页面被复制到其他地方,例如piclist.com/techref/uk/ac/york/cs/www-users/http/~fisher/mkpll/…,但原始服务器脚本拒绝来自其他网站的条目。您也许可以用一些巧妙的脚本拼凑一些东西,为服务器提供它想要的东西并接收您的 PLL 代码,但是我认为此时人们需要使用这个问题中的其他答案。
    【解决方案3】:

    有带 Simulink 的 Matlab 吗? Matlab Central here 提供 PLL 演示文件。 Matlab 的代码生成功能可能会让您从那里获得用 C 编写的 PLL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2018-01-26
      • 1970-01-01
      • 2011-01-09
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多