Эквализация звука

Я разрабатываю аудиоплеер с помощью FFmpeg и хочу добавить аудиоэквалайзер в свое приложение. Я использую FFmpeg для получения аудиосэмплов и вычисления БПФ, но когда я пытаюсь применить один из IIR-фильтров, я получаю очень шумный аудиосигнал. Это мой код:

double Q = 1.0;
double omega = 2.0 * PI * 1000.0 / 44100.0;
double sine = sin(omega);
double alpha = sine / ( 2.0 * Q);
double cosine = cos(omega);

double b0 = (1 + cosine)/2;
double b1 = (-1) * (1 + cosine);
double b2 = (1 + cosine)/2;
double a0 = 1 + alpha;
double a1 = (-2) * cosine;
double a2 = 1 - alpha;

for( int n = 2; n < fftSize; n++ )
{
   leftChannel2[n].re = ((b0/a0)*leftChannel[n].re + (b1/a0)*leftChannel[n-1].re + (b2/a0)*leftChannel[n-2].re -
                         (a1/a0)*leftChannel2[n-1].re - (a2/a0)*leftChannel2[n-2].re);
   rightChannel2[n].re = ((b0/a0)*rightChannel[n].re + (b1/a0)*rightChannel[n-1].re + (b2/a0)*rightChannel[n-2].re -
                          (a1/a0)*rightChannel2[n-1].re - (a2/a0)*rightChannel2[n-2].re);                    
   leftChannel2[n].im = leftChannel[n].im;
   rightChannel2[n].im = rightChannel[n].im;
}

Может ли кто-нибудь сказать мне, что не так с этим кодом?


person Evgeniy Kharchenko    schedule 02.10.2015    source источник
comment
Я действительно не понимаю, что вы пытаетесь сделать, используя этот код. Вы хотите сделать определенный частотный диапазон тише или громче?   -  person Andrey Nasonov    schedule 02.10.2015
comment
@Andrey, Согласно Audio-EQ-Cookbook, это фильтр LowPass с частотой среза 1 кГц. И я пропустил какой-то код.   -  person Evgeniy Kharchenko    schedule 02.10.2015
comment
Может быть, я что-то упускаю, но разве sine и cosine не должны быть функциями, а не одноразовыми определениями?   -  person underscore_d    schedule 02.10.2015
comment
На самом деле, согласно этой книге Audio-EQ-Cookbook, это HighPass. filter (это также то, что вы получаете при построении частотной характеристики фильтра, например, freqz в Matlab).   -  person SleuthEye    schedule 02.10.2015
comment
@underscore-d, sine и косинус — это переменные для хранения синуса и косинуса омеги.   -  person Evgeniy Kharchenko    schedule 02.10.2015
comment
@SleuthEye, да, ты прав. Это фильтр HighPass.   -  person Evgeniy Kharchenko    schedule 02.10.2015
comment
Тогда мне интересно, почему вы применяете этот фильтр к коэффициентам БПФ.   -  person Andrey Nasonov    schedule 02.10.2015
comment
Просто посмотрите здесь: en.wikipedia.org/wiki/Digital_biquad_filter, как его применить.   -  person Andrey Nasonov    schedule 02.10.2015
comment
@Andrey, значит, мне нужно применить фильтр непосредственно к аудиосэмплам?   -  person Evgeniy Kharchenko    schedule 02.10.2015
comment
Да, непосредственно в аудиосэмплы   -  person Andrey Nasonov    schedule 02.10.2015
comment
@Андрей, Спасибо большое, работает!   -  person Evgeniy Kharchenko    schedule 05.10.2015


Ответы (1)


Правильно ли работает этот фильтр в Excel или Matlab? На первый взгляд, я не вижу здесь синтаксических или смысловых ошибок. Кстати, этот фильтр (разностное уравнение) вычисляет АЧХ во временной области. Что можно сказать о мнимой части сигнала? Если он не равен нулю, вы должны отфильтровать его таким же образом.

person romanetz    schedule 02.10.2015
comment
Вы уверены во временной области? Я фильтрую результат быстрого преобразования Фурье, который находится в частотной области. И пробовал таким же образом фильтровать мнимую часть сигнала, но ничего не изменилось. - person Evgeniy Kharchenko; 02.10.2015
comment
Вы должны применить этот фильтр непосредственно к временной области. Biquad filter — это рекурсивный фильтр, который по дешевке приближается к дорогостоящей фильтрации в частотной области. - person Andrey Nasonov; 02.10.2015