帮助IIR梳状滤波器

时间:2011-02-21 16:58:58

标签: iphone xcode signal-processing core-audio

Reverb.m

    #define D 1000

        OSStatus MusicPlayerCallback(
        void* inRefCon,
        AudioUnitRenderActionFlags * ioActionFlags, 
        const AudioTimeStamp * inTimeStamp,
        UInt32 inBusNumber,
        UInt32 inNumberFrames
        AudioBufferList * ioData){

MusicPlaybackState *musicPlaybackState = (MusicPlaybackState*) inRefCon;

                //Sample Rate 44.1    
                float a0,a1; 
                double y0, sampleinp;

                    //Delay Gain 
                    a0 = 1; 
                    a1 = 0.5; 

                for (int i = 0; i< ioData->mNumberBuffers; i++){
                AudioBuffer buffer = ioData->mBuffers[i];
                SIn16 *outSampleBuffer = buffer.mData;    
                    for (int j = 0; j < inNumberFrames*2; j++) {  

                            //Delay Left Channel 

                            sampleinp = *musicPlaybackState->samplePtr++; 

                    /* IIR equation of Comb Filter 
                     y[n] = (a*x[n])+ (b*x[n-D]) 
                    */ 

        y0 = (a0*sampleinp) + (a1*sampleinp-D);

                            outSample[j] = fmax(fmin(y0, 32767.0), -32768.0);  


                            j++;            

                    //Delay Right Channel 

        sampleinp = *musicPlaybackState->samplePtr++;

                           y0 = (a0*sampleinp) + (a1*sampleinp-D);

                            outSample[j] = fmax(fmin(y0, 32767.0), -32768.0);  


                        } 
                    } 

                }

好的,我收到了很多信息,但我在实施它时遇到了麻烦。有人可以提供帮助吗,这可能是我正在伪造的东西。它只是正常播放,稍微提升但没有延迟。

1 个答案:

答案 0 :(得分:1)

您对x0[]变量的处理看起来不正确 - 您拥有它的方式,左右声道将混合在一起。您为左通道分配x0[j],然后 使用正确的频道数据覆盖x0[j]。所以延迟信号x0[j-D]会 始终对应于右声道,延迟的左声道数据丢失。

您没有说出您的采样率是多少,但对于典型的音频应用,a 三样本延迟可能没有太大的听觉效果。在44.1 ksamp / sec, 在3个样本延迟时,滤波器响应的峰值和谷值将为 14,700赫兹的倍数。你所能得到的只是音频中的一个峰值 范围,在几乎没有任何功率的光谱的一部分(假设 信号是语音或音乐。)