一种检测特定频率的算法?

时间:2013-01-01 15:15:28

标签: objective-c c audio frequency-analysis

使用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;
}

2 个答案:

答案 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快速傅立叶变换(非实数) 离散傅立叶变换

加速框架经常被忽视。