本篇文章主要介绍使用窗函数法构造FIR数字滤波器,并且滤除音频文件的噪声。以下为完整的程序,修改一下文件的位置,直接复制应该就可以。

1.音频文件的采集与分析

Matlab输入的音频文件需要“.wav”文件,可以使用一些软件转换格式(例如酷狗音乐)。使用Matlab软件中的“audioread”函数进行音频的读取,定义读取的音频文件为“signal”并使用“fft”函数把读取的音频进行傅里叶变换,经过傅氏变换之后的音频定义为“signal1”,使用Matlab中的画图工具进行绘图,输出原始音频的时域波形和频域波形。原始音频文件的读取与分析程序如下:

[signal,fs] = audioread('C:\Users\Administrator\Desktop\signal.wav');
N = length(signal);                           %采样长度
signal1 = fft(signal,n);                        %快速傅里叶变换
t = (0:n-1)/fs;                               %时间范围
figure(1)
subplot(2,1,1);plot(t,signal1);                  %绘出时域波
title('原始音频的时域波形'); xlabel('时间/s');ylabel('幅度');

处理结果如下:
在这里插入图片描述

2.为音频文件添加噪声

noise = 0.5 * randn(n,2);
signal_noise=signal+noise;               %在原始信号上如加随机噪声
ts=1/fs; 
tt=(length(signal_noise)-1)/fs; 
t=0:ts:tt; 
n1=length(signal_noise);
signal_noise_fft=fft(signal_noise,n1);     %快速傅里叶变换
figure(2); 
subplot(2,1,1);                       %绘制含噪声信号的时域波形图
plot(t,signal_noise); 
title('加随机噪声之后的音频的时域波形'); 
xlabel('时间/s'); ylabel('幅度'); 

其图像如下:
在这里插入图片描述
可以看出其幅度与原来的音频相比,具有明显的变化。

3.设计滤波器

本次使用凯泽(kaiser)窗函数设计滤波器,关于窗函数的学习,可以参考这篇文章
程序如下:

fp=1500;ft=3000;as=60; 
wp=2*pi*fp/fs;
ws=2*pi*ft/fs;
bt=ws-wp; 
M=ceil((as-8)/2.285/bt); 
wc=(wp+ws)/2/pi; 
alph=0.203*(as-15); 
hn=fir1(M,wc,kaiser(M+1,alph));

4.使用滤波器

程序如下:

signal_noise_fit=fftfilt(hn,signal_noise);
signal_noise_fit_p=fft(signal_noise_fit); 
n2=length(signal_noise_fit);
figure(3); 
subplot(2,1,1);
plot(t,signal_noise_fit_p);                %绘出时域波
title('去噪音频的时域波形'); xlabel('时间/s');ylabel('幅度'); 

结果图如下:
在这里插入图片描述
从图中可以看出,滤波之后与原始音频文件的波形较为接近。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐