Я смотрю на пример 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);
// ...
}
в файле aurioTouchAppDelegate.mm.
Вопрос о новичке: Что делает, "Удаляют постоянную составляющую тока", делают? Любой указатель на учебную статью об этом ценится.
Заранее спасибо за Вашу справку.
Вот код для метода 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;
}
По сути, код выполняет фильтр высоких частот на аудио, чтобы удалить постоянный компонент частотного спектра, который также называют DC смещением. Коэффициент (альфа в статье Википедии) для фильтра по умолчанию установлен в коде на 0,975, а типичные значения для фильтров удаления постоянного тока составляют от 0,9 до 1,0. Если вы измените частоту дискретизации, то, возможно, вам захочется изменить этот коэффициент, но я бы не стал слишком беспокоиться об этом.