我使用基于时间的值实现了一个基本的低通滤波器。这没关系,但是试图找到正确的时间片是猜测工作,并根据不同的输入音频文件给出不同的结果。这就是我现在所拥有的:
- (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);
}
}
如何将此代码转换为允许我将特定数据级别的频率切换到特定数据库级别的代码,我该怎么办?
答案 0 :(得分:2)
我强烈推荐numerical recipes in c。除此之外,我不确定我能帮助你。
设计滤镜时,需要根据频率计算滤镜的系数,这样你几乎需要一个类来处理它,而不仅仅是一个函数。
这是C++,但它应该让你开始。对不起,我无法提供具体的答案。
答案 1 :(得分:2)
你所拥有的是一个IIR滤波器,为了更多的控制,我建议使用FIR滤波器,这更容易计算系数。我创建了一个窗口函数:
y = sin (x * bandwidth) / (sin (x) * windowWidth)
其中windowWidth是窗口宽度的样本数,x范围从-2 * PI到2 * PI,带宽:
bandwidth = 2 * frequency * n / sampleRate;
这将创建一个数字数组,您可以将这些数字应用于以您要输出的样本为中心的一系列样本。你在每个样本上迭代这个。
我总结了自己的代码,因为原始代码相当苛刻。
答案 2 :(得分:1)
我使用interactive filter designer实现了过滤器。
以下是一些示例代码,并集成了它:https://github.com/davidcairns/MediaPlayerDemo