用matlab设计FIR滤波器滤除噪声,要求 (1)对给出的语音信号加噪声; (2)在同一张图中,画出原始语音信号及加噪信号的时域波形;(3)在同一张图中,画出原始语音信号及加噪信号的频域波形; (4)设计FIR滤波器对加噪声的语音信号进行滤波,画出滤波器的频率响应图,及滤波后的时域及频域波形;并回放滤波后的信号,与加噪的语音信号及原始的语音信号进行对比,检验是否滤除了噪声。
时间: 2024-02-01 09:14:44 浏览: 80
matlab_语音信号加噪和降噪处理,对噪声信号进行有效地滤除,将降噪后的语音信号与原始信号在时域和频域进行对比分析,计算信噪比
5星 · 资源好评率100%
以下是一个基本的代码实现:
```matlab
% 读入原始语音信号
[x,fs] = audioread('input.wav');
% 生成噪声信号 加到原始语音信号中
noise = 0.1*randn(length(x),1); % 生成均值为0,标准差为0.1的高斯白噪声
y = x + noise;
% 绘制时域波形图
t = 0:1/fs:(length(x)-1)/fs;
subplot(2,2,1);
plot(t,x);
title('原始语音信号');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,2);
plot(t,y);
title('加噪声后的语音信号');
xlabel('Time (s)');
ylabel('Amplitude');
% 绘制频域波形图
X = abs(fft(x));
f = linspace(0,fs,length(x));
subplot(2,2,3);
plot(f,X);
title('原始语音信号频谱图');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
Y = abs(fft(y));
subplot(2,2,4);
plot(f,Y);
title('加噪声后的语音信号频谱图');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
% 设计FIR滤波器
order = 50; % 滤波器阶数
cutoff = 4000; % 截止频率
b = fir1(order,cutoff/(fs/2)); % 生成FIR滤波器系数
% 滤波处理
filtered = filter(b,1,y);
% 绘制滤波器频率响应图
[h,w] = freqz(b,1);
figure;
plot(w/pi*fs/2,20*log10(abs(h)));
title('FIR滤波器频率响应');
xlabel('Frequency (Hz)');
ylabel('Magnitude (dB)');
% 绘制滤波后的时域波形和频域波形
subplot(2,2,1);
plot(t,x);
title('原始语音信号');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,2);
plot(t,filtered);
title('滤波后的语音信号');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,3);
plot(f,X);
title('原始语音信号频谱图');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
F = abs(fft(filtered));
subplot(2,2,4);
plot(f,F);
title('滤波后的语音信号频谱图');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
% 回放滤波后的语音信号
sound(filtered,fs);
```
需要注意的是,上述代码中的 `input.wav` 是一个wav格式的语音文件,可以根据自己的需要进行替换。同时,代码中的FIR滤波器阶数和截止频率等参数也可以根据实际情况进行调整。
阅读全文