【问题标题】:Simple and efficient algorithm to detect frequency and phase of a sine signal [closed]检测正弦信号频率和相位的简单有效算法[关闭]
【发布时间】:2014-11-08 18:05:55
【问题描述】:

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

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

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

【问题讨论】:

标签: algorithm signal-processing dft frequency-analysis goertzel-algorithm


【解决方案1】:

Goertzel 算法适用于检测预定频率(或少数频率)。
要查找正弦波的未知频率,您可以使用Fourier transform

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

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

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

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

【讨论】:

  • 同时这个问题得到了一个交叉帖子/重复dsp.stackexchange.com/questions/19057/…
  • @user2485710 当我开始写我的答案时,既没有你的重定向评论也没有重复问题:-)
  • @MBo 谢谢!你知道我的案例有什么具体的快速简单的实现吗?
  • @jurij - 如果你想要一个固定的实现,你可能至少需要指定什么编程语言和/或硬件平台。
  • 首选语言是 C,但我可以重写的是另一种语言。代码将在德州仪器 F28069 上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多