前言
受限于设计和实现难度,消费类一般采用2阶数字信号系统。高阶的系统则通过级联来实现。
特性
幅度响应的相乘
相位响应的相加
卷积
举例,假设第一个序列是x[n] = [ 1, 2, 3],第二个序列是h[n] = [ 1, -1, 2]。卷积计算如下:
- 确定 N ,卷积后的序列长度是
length( x ) + length( h ) − 1
。即[n] 将有 5 个元素。 - 计算y[0]:
y[0]=x[0]⋅h[0]=1⋅1=1
。将n=0代入卷积定义,k > 0时,h[-k] = 0,只有k=0才有意见。 - 计算y[1]:
y[1]=x[0]⋅h[1]+x[1]⋅h[0]=1⋅(−1)+2⋅1=−1+2=1
- 计算y[2]:
y[2]=x[0]⋅h[2]+x[1]⋅h[1]+x[2]⋅h[0]=1⋅2+2⋅(−1)+3⋅1=2−2+3=3
- 计算y[3]:
y[3]=x[1]⋅h[2]+x[2]⋅h[1]=2⋅2+3⋅(−1)=4−3=1
- 计算y[4]:
y[4]=x[2]⋅h[2]=3⋅2=6
也就是说,y[n]=[1,1,3,1,6]
卷积的一个实际意义是多项式相乘。x[n] 与h[n]的卷积实际上是多项式(1 + 2a^-1 + 3a^2 )(1 - a^-1 + 2a^2 )
(1 + 2a^-1 + 3a^-2 )( 1 - a^-1 + 2a^2 )
= ( 1 - a^-1 + 2a^-2 ) + ( 2a^-1 - 2a^-2 + 4a^-3 ) + ( 3a^-2 - 3a^-3 + 6a^-4 )
= 1 + a^-1 + 3a^-2 + a^-3 + 6a^-4
在Octave/Matlab上,卷积运算函数为conv(x, h);
实例
以2个1kHz的Peak滤波器级联为例。
Octave代码
% Filter 1 coefficients
numerator1 = [1.009874, -1.973835, 0.980993];
denominator1 = [1.000000, -1.973835, 0.990867];
% Filter 2 coefficients (for example, can be the same as Filter 1)
numerator2 = [1.009874, -1.973835, 0.980993];
denominator2 = [1.000000, -1.973835, 0.990867];
% Combine the filters by multiplying the polynomials
combined_numerator = conv(numerator1, numerator2);
combined_denominator = conv(denominator1, denominator2);
% Sampling frequency (in Hz)
Fs = 48000;
% Compute the frequency response of the cascaded filter
[H, w] = freqz(combined_numerator, combined_denominator, 48000 );
[H1, w1] = freqz(numerator1, denominator1, 48000 );
% Convert w (radians per sample) to f (Hz)
f = w * Fs / (2 * pi);
f1 = w1 * Fs / (2 * pi);
% Plot the magnitude response using f
subplot(4, 1, 1);
plot(f(1000:3000), abs(H)(1000:3000));
hold on;
plot(f1(1000:3000), abs(H1)(1000:3000));
xlabel("Frequency (Hz)");
ylabel("Magnitude");
title("Magnitude Response of Cascaded Filter");
fprintf( "1000Hz %f\n", abs(H)(2001) );
fprintf( "1000Hz %f\n", abs(H1)(2001) );
% Plot the phase response using f
subplot(4, 1, 2);
plot(f(1000:3000), angle(H)(1000:3000));
hold on;
plot(f1(1000:3000), angle(H1)(1000:3000));
xlabel("Frequency (Hz)");
ylabel("Phase (radians)");
title("Phase Response of Cascaded Filter");
fprintf( "1000Hz %f\n", angle(H)(2001) );
fprintf( "1000Hz %f\n", angle(H1)(2001) );
Octave输出
>> test
1000Hz 9.999943
1000Hz 3.162269
1000Hz -0.000164
1000Hz -0.000082
结论
3.162269 * 3.162269 = 9.999943
(-0.000082) + (-0.000082) = -0.000164
与前面幅度响应的相乘和相位响应的相加的两个特性一致。
注意,此处的幅度系统是线性倍数,db则需要转换。相位则是弧度,转化为角度则是(Rad/Pi) * 180