基于MATLAB的有噪声语音信号处理

本文介绍了一种使用MATLAB对加噪语音信号进行滤波的方法,包括利用sin函数生成信号、添加随机噪声、采用FFT分析频谱特性等步骤,并对比了不同类型的滤波器效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了验证滤波器的可使用性,我们用常用的sin函数来进行验证。其具体程序及运行结果如下:

t=[0:1/1023:1];

s=sin(2*pi*t);

N=length(s);

y=s+0.5*rand(1,N);

subplot(2,1,1);

plot(y);

title('加噪语音信号的时域波形','fontweight','bold');

S=fft(y);           

subplot(2,1,2);

plot(abs(S));

title('加噪语音信号的频域波形','fontweight','bold');

Ft=8000;

Fp=1000;

Fs=1200;

wp=2*pi*Fp/Ft;

ws=2*pi*Fs/Ft;

[n11,wn11]=buttord(wp,ws,1,50,'s'); %求低通滤波器的阶数和截止频率

[b11,a11]=butter(n11,wn11,'s');    %求S域的频率响应的参数

[num11,den11]=bilinear(b11,a11,0.5); %利用双线性变换实现频率响应S域到Z域的变换

z11=filter(num11,den11,s);

sound(z11);

m11=fft(z11);  %求滤波后的信号

figure;

subplot(2,2,1);

plot(abs(S),'g');

title('滤波前信号的频谱','fontweight','bold');

grid;

subplot(2,2,2);

plot(abs(m11),'r');

title('滤波后信号的频谱','fontweight','bold');

grid;

subplot(2,2,3);

plot(y);

title('滤波前信号的波形','fontweight','bold');

grid;

subplot(2,2,4);

plot(z11);

title('滤波后的信号波形','fontweight','bold');

grid;

 

用自己设计的各滤波器分别对加噪的语音信号进行滤波,在Matlab中,FIR滤波器利用函数fftfilt对信号进行滤波,IIR滤波器利用函数filter对信号进行滤波。

函数fftfilt用的是重叠相加法实现线性卷积的计算。调用:y=fftfilter(h,x,M)。其中,h是系统单位冲击响应向量;x是输入序列向量;y是系统的输出序列向量;M是有用户选择的输入序列的分段长度,缺省时,默认的输入向量的重长度M=512。

函数filter的调用格式:yn=filter(B,A.xn),它是按照直线型结构实现对xn的滤波。其中xn是输入信号向量,yn输出信号向量。

  由于所设计的滤波器有六个,故我们需要进行六次滤波,然后比较得出哪种滤波器的效果最好。下面我们以IIR低通为例:

[y,fs,nbits]=wavread (‘OriSound’);   %IIR低通

n = length (y) ;         %求出语音信号的长度

Noise=0.2*randn(n,2);  %随机函数产生噪声

s=y+Noise;             %语音信号加入噪声

S=fft(s);            

Ft=8000;

Fp=1000;

Fs=1200;

wp=2*pi*Fp/Ft;

ws=2*pi*Fs/Ft;

[n11,wn11]=buttord(wp,ws,1,50,’s’);%求低通滤波器的阶数和截止频率

[b11,a11]=butter(n11,wn11,’s’);    %求S域的频率响应的参数

[num11,den11]=bilinear(b11,a11,0.5); %利用双线性变换实现频率响应S域到Z域的变换

z11=filter(num11,den11,s);

sound(z11);

m11=fft(z11);  %求滤波后的信号

figure;

subplot(2,2,1);

plot(abs(S),’g’);

title(‘滤波前信号的频谱’,’fontweight’,’bold’);

axis([ 0 150000 0 4000]);

grid;

subplot(2,2,2);

plot(abs(m11),’r’);

title(‘滤波后信号的频谱’,’fontweight’,’bold’);

axis([ 0 150000 0 4000]);

grid;

subplot(2,2,3);

plot(s);

title(‘滤波前信号的波形’,’fontweight’,’bold’);

axis([95000 100000 -1 1]);

grid;

subplot(2,2,4);

plot(z11);

title(‘滤波后的信号波形’,’fontweight’,’bold’);

axis([95000 100000 -1 1]);

grid;

程序结果如下图:

  

                     图  4-2  IIR低通滤波器

经过以上的加噪处理后,可在Matlab中用函数sound对声音进行回放。其调用格式:sound(y,Fs),sound(y)和sound(y,Fs,bits)。可以察觉滤波前后的声音有明显的变化。比较后可得;低通效果较好,高通其次,带通最差。对原始语音信号具体程序及运行结果如附录(II 比较滤波前后语音信号的波形及频谱

matlab 语音除噪 音信号处理语音学与数字信号处理技术相结合的交叉学科,课题在这里不讨论语音学,而是将语音当做一种特殊的信号,即一种“复杂向量”来看待。也就是说,课题更多的还是体现了数字信号处理技术[1]。数字信号处理技术主要研究离散线性时不变系统,数字滤波和频谱分析是它的的两个主要分支。数字滤波(Digital filter),即在形形色色的信号中提取所需信号,抑制不必要的干扰。数字滤波器可以在时域实现也可以在频域实现,主要有两种类型;无限长冲击数字滤波器(IIR)和有限长冲击数字滤波器(FIR)。频谱分析(SA,Spectrum Analysis),对各种信号进行频域上的加工处理,其核心内容是快速傅里叶变换(FFT),分析的结果是一频率为坐标的各种物理量的谱线和曲线[2]。从课题的中心来看,课题“基于MATLAB的有噪声语音信号处理”是希望将数字信号处理技术应用于某一实际领域,这里就是指对语音及加噪处理。作为存储于计算机中的语音信号,其本身就是离散化了的向量,我们只需将这些离散的量提取出来,就可以对其进行处理了。这一过程的实现,用到了处理数字信号的强有力工具MATLAB[3]。MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。它提供了功能齐全的滤波器设计,与信号处理交互式图形用户界面(Interactive graphical user interface),主要包括FDATool和SPATool两种交互式工具,其中FDATool主要用于数字滤波器设计与分析,而SPATool不仅可以设计分析滤波器,而且可以对信号进行时域与频域的分析[4]。通过MATLAB里几个命令函数的调用,很轻易的在实际语音与数字信号的理论之间搭了一座桥。课题的特色在于它将语音信号看作一个向量,于是就把语音数字化了。那么,就可以完全利用数字信号处理的知识来解决语音及加噪处理问题。我们可以像给一般信号做频谱分析一样,来对语音信号做频谱分析,也可以较容易的用数字滤波器来对语音进行滤波处理。[5]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值