iPhone aurioTouch示例:删除DC

pio*_*ion 6 iphone audio

我正在看以下代码中的iPhone aurioTouch示例:

static OSStatus PerformThru(
                        void                        *inRefCon, 
                        AudioUnitRenderActionFlags  *ioActionFlags, 
                        const AudioTimeStamp        *inTimeStamp, 
                        UInt32                      inBusNumber, 
                        UInt32                      inNumberFrames, 
                        AudioBufferList             *ioData)
{
    aurioTouchAppDelegate *THIS = (aurioTouchAppDelegate *)inRefCon;
    OSStatus err = AudioUnitRender(THIS->rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
    if (err) { printf("PerformThru: error %d\n", (int)err); return err; }

    // Remove DC component
    for(UInt32 i = 0; i < ioData->mNumberBuffers; ++i)
        THIS->dcFilter[i].InplaceFilter((SInt32*)(ioData->mBuffers[i].mData), inNumberFrames, 1);

    // ...

}
Run Code Online (Sandbox Code Playgroud)

在文件aurioTouchAppDelegate.mm中.

初学者问题:"删除DC组件"有什么作用?任何指向教程文章的指针都很受欢迎.

在此先感谢您的帮助.

Jus*_*eel 8

以下是InplaceFilter方法的代码:

void DCRejectionFilter::InplaceFilter(SInt32* ioData, UInt32 numFrames, UInt32 strides) 
{ 
    register SInt32 y1 = mY1, x1 = mX1; 
    for (UInt32 i=0; i < numFrames; i++) 
    { 
        register SInt32 x0, y0; 
        x0 = ioData[i*strides]; 
        y0 = smul32by16(y1, mA1); 
        y1 = smulAdd32by16(x0 - x1, mGain, y0) << 1; 
        ioData[i*strides] = y1; 
        x1 = x0; 
    } 
    mY1 = y1; 
    mX1 = x1; 
} 
Run Code Online (Sandbox Code Playgroud)

基本上,代码正在对音频进行高通滤波以去除频谱的DC分量,其也被称为DC偏移.过滤器中的系数(维基百科文章中的alpha)在代码中默认设置为0.975,DC去除过滤器的典型值介于0.9和1.0之间.如果你调整采样率然后你可能想调整那个系数,但我不会太担心它.