Помощь с гребенчатым фильтром IIR - PullRequest
2 голосов
/ 21 февраля 2011

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 Ответ

1 голос
/ 21 февраля 2011

Ваша обработка переменных x0[] не выглядит правильно - так, как у вас есть, левый и правый каналы будут смешаны.Вы назначаете x0[j] для левого канала, затем перезаписываете x0[j] данными правого канала.Таким образом, задержанный сигнал x0[j-D] всегда будет соответствовать правому каналу, а данные отложенного левого канала будут потеряны.

Вы не сказали, какова ваша частота дискретизации, но для типичного аудио приложения триЗадержка выборки может не иметь большого эффекта.При 44,1 ксамп / с с задержкой в ​​3 выборки пики и впадины отклика фильтра будут кратны 14 700 Гц.Все, что вы получите, - это один пик в диапазоне звуковых частот, в той части спектра, где практически нет мощности (при условии, что сигнал - речь или музыка).

...