基于matlab的语音信号滤波去噪 下载本文

内容发布更新时间 : 2024/12/23 12:54:32星期一 下面是文章的全部内容请认真阅读。

宿州学院毕业设计 Matlab相关函数

在Matlab的信号处理工具箱功能中,函数FFT用于序列快速傅立叶变换。 FFT函数的一种调用格式为: y=fft(x)

其中,x是序列,y是序列的FFT,x可以为一向量或矩阵。若x为一向量,y是x的FFT。且和x相同长度。

FFT函数的另一种调用格式为: y=fft(x,N)

式中,x,y意义同前,N为正整数。

·

6

宿州学院毕业设计 去噪和仿真的研究

3 去噪和仿真的研究

3.1 语音文件在Matlab平台上的录入与打开

单击自己的电脑开始菜单,选择所有程序,接着选择附件,再选择娱乐,最后选择录音。自己录入“毕业设计声音文件”语音信号,然后保存在MATLAB的work文件夹里面,命名为“chushi.wav”。

利用Matlab中的wavread命令,读入(采集)本段语音信号,将它赋值给某一向量。

3.2 原始语音信号频谱分析及仿真

在Matlab中使用wavread函数,可得出一个采样频率为22500HZ,并且声音是单声道的信号。利用Sound函数,我们可以清晰的听到“毕业设计声音文件”的语音。采集数据并画出波形图。

在Matlab的信号处理工具箱中,函数FFT和IFFT分别用于快速傅立叶变换和逆变换。前面已简单介绍过,这里详细介绍下这些函数。

函数fft用于序列快速傅立叶变换,是常用的信号处理函数。 函数的一种调用格式:y=fft(x)。

其中,x是序列,y是序列的快速傅里叶变换FFT,x可以为一向量,也可以为一矩阵。若x为一向量,则y是x的fft,且和x为相同长度。若x为一矩阵,y则是对矩阵的每一列向量进行的fft。

若序列x的长度是2的幂次方,则函数fft执行高速基-2fft算法;否则fft将执行一种混合基的离散傅立叶变换算法,计算速度会较慢。

函数fft的另一种调用格式为y=fft(x,N)。

该式中,x,y的意义同前,N为正整数。函数执行序列x的N点快速傅里叶变换(fft)。若x为向量,且长度小于N,则函数会将x补零至长度N。若向量x的长度大于N,则函数将截短x,使之长度为N。若x 为矩阵,则按相同方法对x进行相应处理。

由于经函数fft所求得的序列y一般是复序列,所以通常要求其幅值和相位。Matlab提供求复数的幅值和相位函数:abs,angle,这些函数一般和fft同时使用。函数abs(x)用于计算复向量x的幅值,而函数angle(x)则用于计算复向量的相角,用弧度表示。

用Matlab工具箱函数fft进行频谱分析时,需注意: (1)函数fft返回值y的数据结构对称性

一般的,对于N点的x(n)序列的fft是N点的复数序列,其点n=N/2+1所对应的是奈奎斯特频率,作频谱分析时仅取序列X(k)的前一半,即前N/2点即可。由于X(k)的后一半序列和前一半序列是对称的,所以不必再求。

·

7

宿州学院毕业设计 去噪和仿真的研究

(2)频率计算

若N点序列x(n)(n=0,1,?,N-1)是在采样频率下获得的,则它的FFT也是N点序列,即X(k)(k=0,1,2,?,N-1),其第k点所对应实际频率值为f=k*f/N.

下面的一段程序是语音信号在Matlab中的简单体现。通过运行该段程序,我们实现了语音信号的读入与打开,并绘出了语音信号的波形频谱图。

[x,fs,bits]=wavread('chushi.wav’); sound(x,fs,bits); X=fft(x,4096); magX=abs(X); angX=angle(X);

subplot(221);plot(x);title('原始信号波形');

subplot(222);plot(X); title('原始语音信号采样后的频谱图’) subplot(223);plot(magX);title('原始信号幅值'); subplot(224);plot(angX);title('原始信号相位');

程序运行时可以听到声音,而后得到的图形如图2所示:

原始信号波形10.50-0.5-100.511.5x 10原始信号幅值0.20.150.10.0500200040006000420-2-4020004000600025原始语音信号采样后的频谱图0.10.050-0.05-0.1-0.1-0.0500.050.1原始信号相位

图2 初始信号波形

·

8

宿州学院毕业设计 去噪和仿真的研究

3.3 加噪语音信号频谱分析及仿真

下面将介绍在Matlab平台上如何实现在一段原始语音信号加入一个随机噪声信号。

函数randn:产生正态分布的随机数或者矩阵的函数。产生的均值为0,方差σ^2=1,标准差σ=1的正态分布的随机数或矩阵的函数。

用法:Y=randn(n),返回一个n*n的随机项矩阵。如果n不是个数量,则将Y=randn(m,n) 或 Y=randn([m n]),返回一个m*n的随机项矩阵。 Y=randn(size(A)),返回一个和A有同样维数大小的随机数组。 randn返回一个每次都变化的数量。

利用下面的一段程序,将实现用randn函数把一段随机噪音信号加入原始语音信号的信号处理功能:

[y,fs,bits]=wavread('chushi.wav'); sound(y,fs) n=length(y) y_p=fft(y,n);

f=fs*(0:n/2-1)/n; figure(1) subplot(2,1,1); plot(y);

title('原始语音信号采样后的时域波形'); xlabel('时间轴') ylabel('幅值A') subplot(2,1,2); plot(f,abs(y_p(1:n/2)));

title('原始语音信号采样后的频谱图'); xlabel('频率Hz');

ylabel('频率幅值'); L=length(y)

noise=0.1*randn(L,2); y_z=y+noise; sound(y_z,fs) n=length(y); y_zp=fft(y_z,n); f=fs*(0:n/2-1)/n;

·

9

返回错误信息。

宿州学院毕业设计 去噪和仿真的研究

figure(2) subplot(2,1,1); plot(y_z);

title('加噪语音信号时域波形'); xlabel('时间轴') ylabel('幅值A') subplot(2,1,2); plot(f,abs(y_zp(1:n/2))); title('加噪语音信号频谱图'); xlabel('频率Hz'); ylabel('频率幅值');

初始信号的时域波形、频谱图与加噪后语音信号的时域波形、频谱图分别如下图所示。

原始语音信号采样后的时域波形10.5幅值A0-0.5-100.20.40.60.811.2时间轴1.41.61.8x 1025原始语音信号采样后的频谱图15001000频率幅值500000.51频率Hz1.522.5x 104图3 原始信号时域波形和频谱

·

10