3

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

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

谁能建议使用什么算法来做到这一点简单而有效?也许是 Goertzel 算法?

4

1 回答 1

3

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

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

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

C 上有很多 FFT 实现。快速的一个是 fftw.org(声称可移植到任何 C 编译器),但我怀疑您是否真的需要如此复杂的微控制器库。采用任何 40 行代码的良好 Cooley-Tukey 实现,例如这个

PS如果您的信号真的是单频的完美正弦信号,没有明显的噪声,那么并行主题中提出的过零方法会更好。

于 2014-11-08T18:27:40.487 回答