一种简单高效的算法用于检测正弦信号的频率和相位。

3

我需要一个算法来检测纯正弦信号的频率和相位。输入信号的频率在0到100Hz之间变化。

该信号的值以20kHz的采样率捕获(因此每秒获得20,000个值)- 这是固定的,无法更改。我需要检测这个输入信号的频率和相位,并使用PWM生成与输入信号相同频率的MCU中断。

有人能建议使用哪种算法来完成这个简单高效的任务吗?也许是Goertzel算法?


1
http://dsp.stackexchange.com 或者 http://electronics.stackexchange.com/ - user2485710
快速傅里叶变换 - Hot Licks
2
@HotLicks 建议在这种简单问题中使用FFT并不是一个好建议。这就像为其他简单问题建议暴力算法一样。 - Nils Pipenbrinck
正如用户user2485710在下面所指出的,此问题已经在dsp.SE上重新发布 - Ilmari Karonen
根据平台的不同,FFT相当简单。例如,在iPhone上,代码已经内置,并且相当容易理解。其他平台则难以确定。 - Hot Licks
1个回答

3

Goertzel算法适用于检测预定频率(或少数频率)。
要查找正弦波的未知频率,可以使用傅里叶变换

幅度最大的波峰对应正弦频率,其相位对应该谐波的相位。

从FT结果中推导出的相位可能容易受到噪声的影响。更为可靠的方法是使用与零相位正弦波(具有相同频率)的交叉相关来获得相位偏移。

C语言中有许多FFT实现。快速的实现是fftw.org(声称可在任何C编译器上移植),但我怀疑您是否真的需要这么复杂的库来进行微控制器编程。取一个40行代码的好的Cooley-Tukey实现,比如这个

P.S. 如果您的信号真的是没有显著噪声的单一频率正弦波,则平行主题提出的零交叉方法将更好。


1
与此同时,这个问题已经被发布到了另一个帖子/重复的问题:http://dsp.stackexchange.com/questions/19057/simple-and-efficient-algorithm-to-detect-frequency-and-phase-of-a-sine-signal - user2485710
当我开始写我的答案时,既没有你的重定向评论,也没有交叉重复的问题 :-) - MBo
@MBo 谢谢!你知道我这种情况下有什么具体的快速简单实现吗? - jurij
1
@jurij - 如果您想要一个现成的实现,您可能至少需要指定编程语言和/或硬件平台。 - Hot Licks
首选语言为C,但我可以从其他语言重写。代码将在德州仪器F28069上运行。 - jurij

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接