3

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

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

任何人都可以建议使用什么算法来做到这一点简单和高效?也许Goertzel算法?

+1

http://dsp.stackexchange.com或http://electronics.stackexchange.com/ – user2485710 2014-11-08 18:13:18

+0

快速傅立叶变换。 – 2014-11-08 18:38:06

+2

@HotLicks对于这样一个简单的问题,建议FFT不是一个好建议。这就像为其他简单的问题提出了蛮力算法。 – 2014-11-08 19:54:16

回答

3

Goertzel算法是好的,用于检测预定的频率(或几个频率的频道)。
要找到未知频率的正弦波,可以使用Fourier transform

峰与最大的幅度将对应于正弦波的频率,而这种谐波的阶段 - 它的阶段。

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

上有下一个快了很多FFT实现是fftw.org(移植到任何C编译器的要求),但我怀疑你真的需要单片机如此复杂库。取码好库里 - 杜克执行任何40-线,如this one

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

+1

在此期间这个问题得到了交叉帖/重复http://dsp.stackexchange.com/questions/19057/simple-and-efficient-algorithm-to-detect-frequency-and-phase-of-a-sine-信号 – user2485710 2014-11-08 18:30:40

+0

@ user2485710当我开始写我的答案时,既没有您的重定向评论也没有交叉重复问题:-) – MBo 2014-11-08 18:34:45

+0

@MBo谢谢!你知道我的案例有哪些具体的快速和简单的实施? – jurij 2014-11-08 18:38:09