0

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

2 回答 2

2

这是对频率检测的各种方法的一个很好的描述

当您在 MacOSX 或 iOS 上进行开发时,请查看Accelerate Framework,它提供了可移植的 [在 iOS 和 MacOSX 内] 并优化了 DFT 的实现。

如果您打算在 AppStore 中以应用程序的形式发布您的作品,则应特别注意许可。FFTW 许可证是否与您的使用兼容?

于 2013-01-01T16:29:51.910 回答
2

Apple 提供 Accelerate 框架。
在此处加速框架
FFT 在此处

它包括 vDSP 和几个 FFT 例程,包括以下类别:
1D 快速傅里叶变换(固定长度)
1D 快速傅里叶变换(就地复数)
1D 快速傅里叶变换(就地实数)
1D 快速傅里叶变换(异地复数) )
1D 快速傅里叶变换 (Out-of-Place Real)
1D 快速傅里叶变换 (支持函数)
2D 快速傅里叶变换 (In-Place Complex)
2D 快速傅里叶变换 (In-Place Real)
2D 快速傅里叶变换 (Out-of- Place Complex)
2D Fast Fourier Transforms (Out-of-Place Real)
Discrete Fourier Transforms

Accelerate 框架经常被忽视。

于 2013-01-01T16:46:13.880 回答