Шум/искажения после применения фильтров с vDSP_deq22 (biquad IIR filter)

Я работаю над классом DSP (obj-c++) для новокаина, но мои фильтры только кажутся вызвать шум/искажение сигнала.

Я разместил свой полный код и коэффициенты здесь: https://gist.github.com/2702844 Но в основном это сводится к:

// Deinterleaving...
// DSP'ing one channel:
NVDSP *handleDSP = [[NVDSP alloc] init];
[handleDSP setSamplingRate:audioManager.samplingRate];
float cornerFrequency = 6000.0f;
float Q = 0.5f;
[handleDSP setHPF:cornerFrequency Q:Q];
[handleDSP applyFilter:audioData length:numFrames];

// DSP other channel in the same way
// Interleaving and sending to audio output (Novocaine block)

Полный код/контекст см. в сути.

Коэффициенты:

2012-05-15 17:54:18.858 nvdsp[700:16703] b0: 0.472029
2012-05-15 17:54:18.859 nvdsp[700:16703] b1: -0.944059
2012-05-15 17:54:18.860 nvdsp[700:16703] b2: 0.472029
2012-05-15 17:54:18.861 nvdsp[700:16703] a1: -0.748175
2012-05-15 17:54:18.861 nvdsp[700:16703] a2: 0.139942

(все разделить на a0)

Поскольку я предположил, что коэффициенты находятся в порядке: { b0/a0, b1/a0, b2/a0, a1/a0, a2/a0 } (см.: to-vdsp-deq22">Коэффициенты IIR для пикового эквалайзера, как передать их в vDSP_deq22?)

Что вызывает искажение/шум (фильтры не работают)?


person sougonde    schedule 15.05.2012    source источник
comment
Искажение/шум не очень описательны. У вас есть несколько графиков, которые вы можете добавить в свой пост для некоторых простых тестовых сигналов? (например, импульс). Кроме того, в предыдущем вопросе, на который вы ссылались, я угадал, что было a, а что b в вашем случае. Также возможно, что нумерация идет задом наперед.   -  person Oliver Charlesworth    schedule 15.05.2012
comment
На этом японском веб-сайте также указан порядок коэффициентов b0, b1, b2, a1, a2: objective-audio.jp /2008/02/biquad-filter.html   -  person sougonde    schedule 16.05.2012


Ответы (2)


Обновление: я рекомендую всем использовать мой класс DSP, который я опубликовал на github: https://github.com/bartolsthoorn/NVDSP Возможно, это сэкономит вам немало времени.

Заработало, воооооо! Да здравствует японец: http://objective-audio.jp/2008/02/biquad-filter.html

Метод applyFilter должен был быть:

- (void) applyFilter: (float *)data frames:(NSUInteger)frames {
    /*
     The first two samples of data being passed to vDSP_deq22 have to be initialized from the previous call. So, you'd want to hold onto a float buffer and feed the tailing two samples after a vDSP_deq22 call back to the front of that array for the next time you call. (Alex Wiltschko)
     */

    // Thanks a lot to: http://objective-audio.jp/2008/02/biquad-filter.html

    // Provide buffer for processing
    float *tInputBuffer = (float*) malloc((frames + 2) * sizeof(float));
    float *tOutputBuffer = (float*) malloc((frames + 2) * sizeof(float));

    // Copy the data
    memcpy(tInputBuffer, gInputKeepBuffer, 2 * sizeof(float));
    memcpy(tOutputBuffer, gOutputKeepBuffer, 2 * sizeof(float));
    memcpy(&(tInputBuffer[2]), data, frames * sizeof(float));

    // Do the processing
    vDSP_deq22(tInputBuffer, 1, coefficients, tOutputBuffer, 1, frames);

    // Copy the data
    memcpy(data, tOutputBuffer, frames * sizeof(float));
    memcpy(gInputKeepBuffer, &(tInputBuffer[frames]), 2 * sizeof(float));
    memcpy(gOutputKeepBuffer, &(tOutputBuffer[frames]), 2 * sizeof(float));

    free(tInputBuffer);
    free(tOutputBuffer);
}

Полный курс: https://github.com/bartolsthoorn/NVDSP

person sougonde    schedule 15.05.2012
comment
А вот версия, написанная на чистой математике без использования фреймворка Accelerate: " title="reimplement vdsp deq22 for biquad iir filter вручную"> stackoverflow.com/questions/34312682/. Спасибо за НВДСП! - person ephemer; 18.07.2016

Скопируйте данные с помощью:

memcpy(data, tOutputBuffer+2, frames * sizeof(float));

И это сработает

person Vladimir Konon    schedule 28.07.2013