检测特定频率的算法? [关闭]

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 时拥有丰富的音频经验,但它是在医学领域。 我明白了,无论如何谢谢:)

以上是关于检测特定频率的算法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:检测特定频率(幅度)的复制声音

DSP方法检测在当前声音中可能不是最主要的特定频率

如何使用 Goertzel 算法检测频率

检测原始音频 (PCM) 中的特定频率/音调

使用Goertzel算法识别DTMF信号

在 Swift 中创建一个函数来播放特定频率的音调 [关闭]