gpt4 book ai didi

signal-processing - 需要软件锁相环示例代码

转载 作者:行者123 更新时间:2023-12-04 10:06:26 27 4
gpt4 key购买 nike

有谁知道我可以在任何地方找到软件锁相环 (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 位样本,试图在标准输出上跟踪高一个 Octave 音程。它以每秒 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 左右的锯齿波,并将它们作为输出音频流输出。

这个简单的例子缺少几件事情:
  • 它没有好处检测锁的方法 .如果您有静音、噪音或强烈的纯 250Hz 输入音调,a 将大致为零,b 将以其默认频率振荡。根据您的应用程序,您可能想知道是否找到了信号! Camenzind 在 Designing Analog Chips 第 12 章中的建议将第二个“相位检测器”馈入与实际相位检测器相差 90° 的相位;它的平滑输出为您提供了理论上锁定的信号幅度。
  • 振荡器的固有频率是固定的且不扫 . PLL 的捕获范围,即如果当前未锁定在一个频率上,它将注意到振荡的频率间隔非常窄;它的锁定范围要大得多,它会在锁定范围内跟随信号。因此,通常在您希望找到信号的整个范围内扫描 PLL 的频率,直到获得锁定,然后停止扫描。

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

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

    关于signal-processing - 需要软件锁相环示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39485/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com