检测特定频率的算法? [关闭]
Posted
技术标签:
【中文标题】检测特定频率的算法? [关闭]【英文标题】:An algorithm to detect a certain frequency? [closed] 【发布时间】:2013-01-01 15:15:27 【问题描述】:使用 Goertzel 算法,我正在检测进入 iphone 麦克风的某个频率(我使用缓冲区样本)。
它可以工作,但是当值改变时它会出现许多奇怪的稳定性问题。 (它们在同一设备上的频谱应用程序中是恒定的,但不是使用 Goertzel 算法)
我想用另一种方式,在C
,检测某个频率,或者某个频率范围内的能量,(不知道FFT好不好准确,如果是,我需要一个好的算法)。
如果你有一个函数只能获取样本和长度,并在某个频谱或某个已知频率返回能量,那会有所帮助。
我需要一个严肃的,也许是二阶过滤器。
这是我的格策尔:
float goertzel_mag(int16_t* data ,int SAMPLING_RATE ,double TARGET_FREQUENCY,int numSamples )
int k,i;
float floatnumSamples;
float omega,sine,cosine,coeff,q0,q1,q2,magnitude,real,imag;
float scalingFactor = numSamples / 2.0; // -2
floatnumSamples = (float) numSamples;
k = (int) (0.5 + ((floatnumSamples * TARGET_FREQUENCY) / SAMPLING_RATE));
omega = (2.0 * M_PI * k) / floatnumSamples;
sine = sin(omega);
cosine = cos(omega);
coeff = 2.0 * cosine;
q0=0;
q1=0;
q2=0;
for(i=0; i<numSamples; i++)
q0 = coeff * q1 - q2 + data[i];
q2 = q1;
q1 = q0;
real = (q1 - q2 * cosine) / scalingFactor;
imag = (q2 * sine) / scalingFactor;
//double theta = atan2 ( imag, real); //PHASE
magnitude = sqrtf(real*real + imag*imag);
return magnitude;
【问题讨论】:
您的具体问题是什么? FFT 很好;准确性取决于您的要求、对算法的理解以及问题的物理性质。 我的问题是,要获得一个函数,一个函数,它会获取样本并产生 FFT。不只是建议我 FFT,而是我在这里展示的同类型函数的代码示例。我找不到这样的。 @rant 如果您要采用 FFT 方法,则需要对结果进行大量下游处理。这很好地描述了如何使用 SFFT 来估计每个 bin 中的频率。它还有很多东西 - 例如处理垃圾箱和本底噪声之间的出血。您还会发现缺少基本信号的真实世界信号,您需要从部分信号中重建它——就像人类听觉系统能够做到的那样。 如果您知道要测量的频率的幅度,那么 Goertzel 算法是正确的选择:FFT 计算过度。但是,从您的描述中我不清楚问题是什么。您也可以使用带通滤波器,但滤波器的顺序(和类型)取决于您的要求。这篇文章可能对您有帮助,也可能对您没有帮助:blog.bjornroche.com/2012/07/… 【参考方案1】:This is a good description of the various approaches to frequency detection。
当您在 MacOSX 或 ios 上进行开发时,请查看Accelerate Framework,它提供了 [在 iOS 和 MacOSX 内] 的便携性和 DFT 的优化实现。
如果您打算在 AppStore 中以应用程序的形式发布您的作品,则应特别注意许可。 FFTW 许可证是否与您的使用兼容?
【讨论】:
【参考方案2】:Apple 提供 Accelerate 框架。Accelerate Framework hereFFT here
它包括 vDSP 和几个 FFT 例程,包括以下类别: 一维快速傅里叶变换(固定长度) 一维快速傅里叶变换(就地复数) 一维快速傅里叶变换(就地实数) 一维快速傅里叶变换(异地复数) 一维快速傅里叶变换(异地实数) 一维快速傅里叶变换(支持函数) 2D 快速傅里叶变换(就地复杂) 2D 快速傅里叶变换(就地真实) 二维快速傅里叶变换(异地复数) 2D 快速傅里叶变换(异地实数) 离散傅里叶变换
Accelerate 框架经常被忽视。
【讨论】:
按峰值功率计算频率的最佳方法是什么? 我帮不上忙。 好的,你知道我需要传递 AVAudioRecorder 的哪些参数来计算频率的 FFT 吗? 问题是几年前我只使用过一次这些例程,我的经验是几年前的,我必须根据数字食谱一书编写自己的。此外,虽然我在使用 FFT 时拥有丰富的音频经验,但它是在医学领域。 我明白了,无论如何谢谢:)以上是关于检测特定频率的算法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章