当前位置:  开发笔记 > 运维 > 正文

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

如何解决《需要软件阶段锁定循环示例代码》经验,为你挑选了1个好方法。

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

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

谢谢你的时间.

伊恩



1> Kragen Javie..:

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

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

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

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

如果你在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左右的锯齿波,然后将它们作为输出音频流输出.

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

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

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

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

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

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有