2015-10-02 5 views
0

Я разрабатываю аудиоплеер с использованием FFmpeg, и я хочу добавить аудио эквалайзер в свое приложение. Я использую FFmpeg для получения образцов аудио и вычисления FFT, но когда я пытаюсь применить один из фильтров 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; 
} 

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

+0

Я действительно не понимаю, что вы пытаетесь сделать, используя этот код. Вы хотите сделать определенный диапазон частот тише или громче? –

+0

@ Andrey, согласно Audio-EQ-Cookbook, это фильтр LowPass с частотой резания 1 кГц. И я пропустил какой-то код. –

+0

Может быть, я что-то пропустил, но не должен быть 'sine' и' cosine' функциями, а не разовыми определениями? –

ответ

0

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

+0

Вы уверены, что находитесь во временной области? Я фильтрую результат быстрого преобразования Фурье, который находится в частотной области. И я попытался так же фильтровать мнимую часть сигнала, но ничего не изменилось. –

+0

Вы должны применить этот фильтр к домену времени напрямую. Фильтр Biquad - это рекурсивный фильтр, который дешево приближается к дорогостоящей фильтрации в частотной области. –

Смежные вопросы