iPhone aurioTouch пример: удалить DC - PullRequest
6 голосов
/ 18 июня 2010

Я рассматриваю пример 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.

Вопрос для начинающих: Что означает «Удалить компонент DC»делать?Любой указатель на учебную статью об этом приветствуется.

Заранее спасибо за вашу помощь.

Ответы [ 2 ]

8 голосов
/ 18 июня 2010

Вот код для метода 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 offset . Коэффициент (альфа в статье в википедии) для фильтра установлен по умолчанию в коде на 0,975, а типичные значения для фильтров удаления постоянного тока - от 0,9 до 1,0. Если вы отрегулируете частоту дискретизации, возможно, вы захотите отрегулировать этот коэффициент, но я бы не стал сильно беспокоиться об этом.

2 голосов
/ 01 февраля 2014

Фильтр подавления постоянного тока здесь на самом деле является фильтром верхних частот. В электротехнике высокочастотный фильтр реализован в виде RC-цепи, которая пропускает только высокочастотные волны. Каждый фильтр верхних частот имеет частоту среза, определяемую как частота, на которой выходная энергия равна -3 дБ от входной энергии.

Метод InPlaceFilter является цифровой реализацией фильтра верхних частот во временной области. Цифровая реализация зацикливает все сэмплы по порядку и корректирует токовый выход на основе предыдущего выхода. В этой реализации используется постоянная переменная альфа, значение которой находится между 0 и 1. Частота среза вашего фильтра верхних частот зависит от значения, которое вы выбираете для альфы (а также от частоты дискретизации). Так как в AurioTouch частота дискретизации составляет 44к. Частота среза может быть рассчитана примерно до 160 Гц. (обратите внимание, что это не означает, что вы не получите показания частоты ниже 160 Гц. Это просто означает, что выход энергии частот ниже этой частоты значительно ниже, чем у частот выше нее).

Я написал подробное объяснение здесь http://timdotshi.blogspot.ca/2014/01/dc-rejection-filter-in-objective-c.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...