我正在看以下代码中的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组件"有什么作用?任何指向教程文章的指针都很受欢迎.
在此先感谢您的帮助.
以下是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之间.如果你调整采样率然后你可能想调整那个系数,但我不会太担心它.