检测正弦信号的频率和相位的简单有效的算法



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

信号的值以20kHz的频率被捕获(所以我每秒得到20.000个值)——这是给定的,不能改变。我需要检测这个输入信号的频率和相位,并使用PWM生成与输入信号频率相同的MCU中断。

有人能建议用什么算法来做到这一简单高效吗?也许是Goertzel算法?

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

幅值最大的峰值对应于正弦频率,而谐波的相位对应于其相位。

根据FT结果得出的相位可能容易受到噪声的影响。更稳健的方法-使用零相位正弦波(具有相同频率)的互相关来获得相移。

C上有很多FFT实现。最快的是fftw.org(声称可以移植到任何C编译器),但我怀疑你真的需要这么复杂的微控制器库。采取任何40行代码良好的库利-图基实现,如这一

附言:如果你的信号真的是单一频率的完美正弦,没有显著的噪声,那么在平行主题中提出的过零方法会更好。

最新更新