我需要一种算法来检测纯正弦信号的频率和相位。输入信号的频率在0到100 Hz之间变化。
以20kHz的频率捕获信号的值(因此我得到每秒20.000个值) - 这是给定的,不能改变。我需要检测此输入信号的频率和相位,并使用PWM生成与输入信号频率相同的MCU中断。
有人能建议使用什么算法来做到这一点简单有效吗?也许是Goertzel算法?
答案 0 :(得分:3)
Goertzel算法适用于检测预定频率(或几个频率) 要查找未知频率的正弦波,可以使用Fourier transform。
具有最大幅度的峰值对应于正弦频率和该谐波的相位 - 与其相位相对应。
从FT结果导出的相位可能易受噪声影响。更稳健的方法 - 使用与零相位正弦波(具有相同频率)的互相关来获得相移。
C上有很多FFT实现。快速的一个是fftw.org(对所有C编译器的可移植性声称),但我怀疑你真的需要这么复杂的微控制器库。采用任何40行代码良好的Cooley-Tukey实现,如this one
P.S。如果你的信号非常完美正弦,单频而没有明显的噪声,那么在并行主题中提出的过零方法会更好。