编写MATLAB程序,利用脉冲响应不变法设计IIR数字低通滤波器,要求通带和阻带具有单调下降特性,指标参数如下:。 2、数字滤波器的技术指标如下:,编写MATLAB程序,采用窗函数法设计一个FIR数字滤波器。 3、用上面设计的滤波器对加噪声的语音信号进行滤波,并对滤波前后的时域波形和频域特征进行比较。
时间: 2024-02-01 16:12:40 浏览: 92
基于MATLAB的数字滤波器设计及其语音信号去噪应用 (供学习交流) 其中数字滤波器包括IIR和FIR的低通、高通、带
IIR数字低通滤波器的设计:
首先,定义滤波器的通带截止频率和阻带截止频率:
```matlab
fp = 1000; % 通带截止频率
fs = 2000; % 阻带截止频率
```
接下来,根据脉冲响应不变法,我们需要将模拟滤波器的传递函数转换为数字滤波器的差分方程。这里我们使用MATLAB中的`bilinear()`函数进行双线性变换:
```matlab
[b,a] = butter(4,2*pi*fp,'s'); % 设计4阶Butterworth模拟滤波器
[bz,az] = bilinear(b,a,fs); % 双线性变换
```
上面的代码利用了MATLAB中的`butter()`函数来设计4阶Butterworth模拟滤波器,并且将其双线性变换为数字滤波器的差分方程。
接下来,我们可以用`freqz()`函数来绘制数字滤波器的幅度响应:
```matlab
[h,w] = freqz(bz,az);
plot(w/pi,abs(h));
```
这里,我们使用`freqz()`函数来计算数字滤波器的频率响应,并且用`plot()`函数来绘制其幅度响应曲线。
FIR数字滤波器的设计:
采用窗函数法设计FIR数字滤波器,具体步骤如下:
1. 定义滤波器的通带截止频率和阻带截止频率。
```matlab
fp = 1000; % 通带截止频率
fs = 2000; % 阻带截止频率
```
2. 根据通带截止频率和阻带截止频率,计算滤波器的阶数和窗函数。
```matlab
delta_p = 0.01; % 通带最大衰减
delta_s = 0.01; % 阻带最小衰减
delta = min(delta_p,delta_s); % 取最小值作为实际衰减
A = -20*log10(delta); % 计算实际衰减
Rp = 1; % 通带波纹系数
As = 20; % 阻带衰减
N = ceil((As-8)/(2.285*(2*pi/fs)*min((fp/fs),(1-fp/fs)))+1); % 计算滤波器阶数
w = hamming(N+1); % 窗函数
```
这里,我们使用`min()`函数来取通带最大衰减和阻带最小衰减的最小值作为实际衰减,然后根据实际衰减和通带波纹系数和阻带衰减,计算滤波器的阶数。最后,使用`hamming()`函数来生成窗函数。
3. 根据窗函数和滤波器的阶数,计算滤波器的系数。
```matlab
h = fir1(N,2*pi*fp/fs,w); % 计算滤波器系数
```
这里,我们使用`fir1()`函数来计算滤波器的系数。
4. 绘制滤波器的幅度响应曲线。
```matlab
[h,w] = freqz(h,1);
plot(w/pi,abs(h));
```
这里,我们使用`freqz()`函数来计算滤波器的幅度响应,并且用`plot()`函数来绘制其幅度响应曲线。
信号滤波:
假设我们有一个加噪声的语音信号`s`,我们可以使用上面设计的数字滤波器来滤波:
```matlab
load('noisy_speech.mat'); % 加噪声的语音信号
s_filtered = filter(bz,az,s); % IIR数字低通滤波器
s_filtered = filter(h,1,s); % FIR数字滤波器
```
这里,我们使用`filter()`函数来对语音信号进行滤波,其中`bz`和`az`是IIR数字低通滤波器的差分方程系数,`h`是FIR数字滤波器的系数。最后,我们可以将滤波前后的时域波形和频域特征进行比较:
```matlab
subplot(2,2,1); plot(s); title('原始语音信号'); xlabel('时间 (s)'); ylabel('幅值');
subplot(2,2,2); plot(s_filtered); title('滤波后的语音信号'); xlabel('时间 (s)'); ylabel('幅值');
subplot(2,2,3); pwelch(s,[],[],[],fs,'onesided'); title('原始语音信号的功率谱密度'); xlabel('频率 (Hz)'); ylabel('功率谱密度');
subplot(2,2,4); pwelch(s_filtered,[],[],[],fs,'onesided'); title('滤波后的语音信号的功率谱密度'); xlabel('频率 (Hz)'); ylabel('功率谱密度');
```
这里,我们使用`subplot()`函数来将图像排列在一起,用`pwelch()`函数来计算功率谱密度,并且用`plot()`函数来绘制时域波形。
阅读全文