У меня есть 16-битный моно файл PCM с частотой дискретизации 44100 Гц. Когда я читаю этот файл PCM в Matlab, я получаю большой столбец чисел между -32k и + 32k. В C ++ я хочу выполнить эквалайзер для этого файла PCM. После выравнивания я получаю действительно другие значения. Однако после воспроизведения нового файла Equalized PCM в MATLAB я снова получаю много шума. Почему это?
Это коэффициенты, которые я использую для выравнивания:
void bassCoefficients(int intensity, double *b0, double *b1, double *b2, double *a1, double *a2)
{
double frequency = 330;
double qFactor = 0.5;
double gain = intensity;
double sampleRate = 44100;
double pi=4.0*atan(1);
double a=pow(10.0, gain/40);
double w0=2*pi*frequency/sampleRate;
double alpha=sin(w0)/(2.0*qFactor);
double a0=(a+1)+(a-1)*cos(w0)+2.0*sqrt(a)*alpha;
*a1=-(-2.0*((a-1)+(a+1)*cos(w0)))/a0;
*a2=-((a+1)+(a-1)*cos(w0)-2.0*sqrt(a)*alpha)/a0;
*b0=(a*((a+1)-(a-1)*cos(w0)+2.0*sqrt(a)*alpha))/a0;
*b1=(2*a*((a-1)-(a+1)*cos(w0)))/a0;
*b2=(a*((a+1)-(a-1)*cos(w0)-2.0*sqrt(a)*alpha))/a0;
}
void trebleCoefficients(int intensity, double *b0, double *b1, double *b2, double *a1, double *a2)
{
double frequency = 3300;
double qFactor = 0.5;
double gain = intensity;
double sampleRate = 44100;
double pi=4.0*atan(1);
double a=pow(10.0, gain/40);
double w0=2*pi*frequency/sampleRate;
double alpha=sin(w0)/(2.0*qFactor);
double a0=(a+1)-(a-1)*cos(w0)+2.0*sqrt(a)*alpha;
*a1=-(2.0*((a-1)-(a+1)*cos(w0)))/a0;
*a2=-((a+1)-(a-1)*cos(w0)-2.0*sqrt(a)*alpha)/a0;
*b0=(a*((a+1)+(a-1)*cos(w0)+2.0*sqrt(a)*alpha))/a0;
*b1=(-2.0*a*((a-1)+(a+1)*cos(w0)))/a0;
*b2=(a*((a+1)+(a-1)*cos(w0)-2.0*sqrt(a)*alpha))/a0;
}
И вот формула, которую я использую:
y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] + a1*y[n-1] + a2*y[n-2]
Задача ещё не решена.
Других решений пока нет …