有了以下参数,您该如何计算以下差分方程的系数?
采样率:10kHz
截止频率:1kHz
我知道差分方程将采用以下形式,但不知道如何实际计算并得到系数b0、b1、b2、a1、a2的数字:
y(n) = b0.x(n) + b1.x(n-1) + b2.x(n-2) + a1.y(n-1) + a2.y(n-2)
我最终将在C++中实现这个低通滤波器,但我需要知道如何计算系数,然后才能开始任何工作。
有了以下参数,您该如何计算以下差分方程的系数?
采样率:10kHz
截止频率:1kHz
我知道差分方程将采用以下形式,但不知道如何实际计算并得到系数b0、b1、b2、a1、a2的数字:
y(n) = b0.x(n) + b1.x(n-1) + b2.x(n-2) + a1.y(n-1) + a2.y(n-2)
我最终将在C++中实现这个低通滤波器,但我需要知道如何计算系数,然后才能开始任何工作。
给你。ff是频率比,在你的情况下为0.1:
const double ita =1.0/ tan(M_PI*ff);
const double q=sqrt(2.0);
b0 = 1.0 / (1.0 + q*ita + ita*ita);
b1= 2*b0;
b2= b0;
a1 = 2.0 * (ita*ita - 1.0) * b0;
a2 = -(1.0 - q*ita + ita*ita) * b0;
结果为:
b0=0.0674553
b1=0.134911
b2=0.0674553
a1=1.14298
a2=-0.412802
ff = f_cutoff / f_sampling
。 - pentadecagona0 = 1
a1 = 2*(C^2-1)/D
a2 = (1-sqrt(2)*C+C^2)/D
b0 = C^2/D
b1 = 2*b0
b2 = b0
上述公式中,D = 1 + sqrt(2)*C + C^2
,C = tan(wd*T/2)
,其中wd
为所需截止频率(单位:弧度/秒),T
为采样周期(单位:秒)。请注意保留HTML标签。
如果你需要一个高通滤波器系数,你只需要使用相同的代码:
const double ita =1.0/ tan(M_PI*ff);
const double q=sqrt(2.0);
b0 = 1.0 / (1.0 + q*ita + ita*ita);
b1= 2*b0;
b2= b0;
a1 = 2.0 * (ita*ita - 1.0) * b0;
a2 = -(1.0 - q*ita + ita*ita) * b0;
b0 = b0*ita*ita;
b1 = -b1*ita*ita;
b2 = b2*ita*ita;
现在您拥有了一个二阶高通滤波器
fnorm = f_cutoff/(f_sample_rate/2); % normalized cut off freq, http://www.exstrom.com/journal/sigproc
% Low pass Butterworth filter of order N
[b1, a1] = butter(nth_order, fnorm,'low');
这里我的a和b被搞混了,但是我的代码看起来像这样:
//Boulanger and Lazzarini, The Audio Programming Book, pg 484
void calculateDifferenceEquation() {
float lambda = 1.0 / (tan(M_PI * mFrequency / mSampleRate));
a0 = 1.0 / (1.0 + (2.0 * lambda) + pow(lambda, 2.0));
a1 = 2.0 * a0;
a2 = a0;
b1 = 2.0 * a0 * (1.0 - pow(lambda, 2.0));
b2 = a0 * (1.0 - (2.0 * lambda) + pow(lambda, 2.0));
}