在信号处理领域,数字滤波器是至关重要的工具,用于去除噪声、提取信号特征或进行频谱分析。本文将详细探讨两种常见的数字滤波器设计方法:冲击响应不变法(Impulse Invariance Method)和双线性Z变换法(Bilinear Z-Transform),并结合MATLAB代码进行具体实现。
我们关注的是模拟滤波器的设计,这里使用了巴特沃斯滤波器(Butterworth Filter)。巴特沃斯滤波器具有平坦的通带响应和逐渐滚降的阻带响应,是许多滤波器设计的基础。在MATLAB中,`butter`函数用于设计巴特沃斯滤波器。例如,在给定的代码中,`[N1, Wn1] = buttord(wap1, was1, Rp, Rs, 's')`计算了满足指定性能指标(`Rp`为通带增益边界,`Rs`为阻带衰减边界)的滤波器阶数`N1`和截止频率`Wn1`。然后,`[B1, A1] = butter(N1, Wn1, 's')`生成了模拟滤波器的传递函数系数`B1`和`A1`。
接下来,我们通过冲击响应不变法和双线性Z变换法将模拟滤波器转换为数字滤波器。冲击响应不变法力求保持模拟滤波器的瞬态响应不变,但这种方法通常在高频段有失真。在MATLAB中,`impinvar`函数执行这一转换,如`[Bz1, Az1] = impinvar(B1, A1, Fs)`所示,其中`Fs`是采样频率。
双线性Z变换法则通过保持频率响应的对数尺度不变,提供了更准确的转换,尤其是在高频段。在MATLAB中,`bilinear`函数执行这个转换,例如`[Bz2, Az2] = bilinear(B2, A2, Fs)`,这里的`B2`和`A2`是为适应新的截止频率`wap2`和`was2`重新计算的模拟滤波器系数。
之后,代码使用`freqs`和`freqz`函数分别计算了模拟滤波器和数字滤波器的频率响应。`freqs`用于模拟滤波器,而`freqz`则适用于数字滤波器。频率响应曲线在图中绘制,便于比较不同方法的效果。
通过上述代码,我们可以观察到冲击响应不变法(subplot 2,2,2)和双线性Z变换法(subplot 2,2,4)在频率响应上的差异。冲击响应不变法可能会导致高频部分的失真,而双线性Z变换法通常能提供更好的频率响应特性。
总结来说,本篇文章通过MATLAB实例介绍了如何使用冲击响应不变法和双线性Z变换法设计和实现数字滤波器,以及如何评估其性能。在实际应用中,选择哪种方法取决于对频率响应精度、瞬态响应和计算复杂性的需求。