使用Goertzel算法我正在检测进入iphone麦克风的某个频率(我使用缓冲区样本)。
它的工作原理,但在更改值时会出现许多奇怪的稳定性问题。 (它们在同一设备上的频谱应用中保持不变,但不与Goertzel算法一致)
我想在C
中使用另一种方法来检测特定频率或频率范围内的能量(我不知道 FFT 是否良好并且准确,如果是的话我需要一个好的算法)。
如果你的功能只能获得样本和长度,并以频谱或某个已知频率返回能量,这可能有所帮助。
我需要一个严肃的,可能是二阶滤波器。
这是我的Goertzel:
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;
}
答案 0 :(得分:2)
This is a good description of the various approaches to frequency detection。
当您在MacOSX或iOS上进行开发时,请查看提供便携式[在iOS和MacOSX中]的Accelerate Framework以及DFT的优化实施。
如果您打算在AppStore中将应用程序作为应用程序发布,则应特别注意许可。 FFTW许可证是否与您的使用兼容?
答案 1 :(得分:2)
Apple提供加速框架
Accelerate Framework here
FFT here
它包括vDSP和几个FFT例程,包括类别:
1D快速傅立叶变换(固定长度)
1D快速傅立叶变换(原位复合体)
1D快速傅立叶变换(原位真实)
1D快速傅里叶变换(非现场复杂)
1D快速傅里叶变换(不合适的真实)
1D快速傅立叶变换(支持函数)
2D快速傅里叶变换(就地复杂)
2D快速傅立叶变换(原位真实)
2D快速傅里叶变换(非现场复杂)
2D快速傅立叶变换(非实数)
离散傅立叶变换
加速框架经常被忽视。