2

我已经使用基于时间的值实现了一个基本的低通滤波器。这没关系,但试图找到正确的时间片是猜测工作,并根据不同的输入音频文件给出不同的结果。这是我现在拥有的:

- (void)processDataWithInBuffer:(const int16_t *)buffer outBuffer:(int16_t *)outBuffer sampleCount:(int)len {   
    BOOL positive;
    for(int i = 0; i < len; i++) {
        positive = (buffer[i] >= 0);
        currentFilteredValueOfSampleAmplitude = LOWPASSFILTERTIMESLICE * (float)abs(buffer[i]) + (1.0 - LOWPASSFILTERTIMESLICE) * previousFilteredValueOfSampleAmplitude;
        previousFilteredValueOfSampleAmplitude = currentFilteredValueOfSampleAmplitude; 
        outBuffer[i] = currentFilteredValueOfSampleAmplitude * (positive ? 1 : -1);
    }
}

我该怎么做才能将此代码转换为允许我将某个 hz 上的频率降低某个 db 级别的代码?

4

3 回答 3

2

我强烈推荐c 中的数字配方。除此之外,我不确定我能帮助你。

当您设计一个滤波器时,您需要根据频率计算该滤波器的系数,因此您几乎需要一个类来处理它,而不仅仅是一个函数。

这是在C++中,但它应该让你开始。对不起,我无法提供具体的答案。

于 2010-11-12T19:34:11.567 回答
2

您拥有的是 IIR 滤波器,为了获得更多控制,我建议使用 FIR 滤波器,它更容易计算系数。我创建了一个窗口函数:

y = sin (x * bandwidth) / (sin (x) * windowWidth)

其中 windowWidth 是您的窗口宽度的样本数,x 范围从 -2 * PI 到 2 * PI,以及带宽:

bandwidth = 2 * frequency * n / sampleRate;

这将创建一个数字数组,您可以将其应用于以您要输出的样本为中心的一系列样本。您对每个样本进行迭代。

我已经总结了我自己的代码来做这件事,因为原始代码相当粗糙。

于 2010-11-22T04:58:03.133 回答
1

我使用交互式过滤器设计器实现了一个过滤器。

这是一些示例代码,它集成了:https ://github.com/davidcairns/MediaPlayerDemo

于 2011-04-22T18:34:49.193 回答