语音信号预处理方法研究

语音信号预处理方法研究
语音信号预处理方法研究

一、设计目的与要求

本次课程设计的目的是利用MATLAB对语音信号进行数字信号处理和分析,要求学生采集语音信号后,在MATLAB软件平台进行频谱分析和特征提取;并对所采集的语音信号使用合适的滤波器滤除噪声,分析比较不同滤波器的性能。

要求利用MATLAB来读入(采集)语音信号,将它赋值给某一向量。再将该向量看作一个普通的信号,对其进行FFT变换实现频谱分析,再依据实际情况对它进行滤波。特征提取包括对原信号进行预加重处理,然后分帧并加窗,采样和量化,端点检测等。然后我们还可以通过sound命令来对语音信号进行回放,以便在听觉上来感受声音的变化。

二、设计方案论证

2.1 设计理论依据

2.1.1 采样定理

在进行模拟/数字信号的转换过程中,当采样频率fs.max大于信号中,最高频率fmax的2倍时,即:fs.max>=2fmax,则采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的5~10倍;采样定理又称奈奎斯特定理。

1924年奈奎斯特(Nyquist)就推导出在理想低通信道的最高大码元传输速率的公式:

理想低通信道的最高大码元传输速率=2W*log2 N (其中W是理想低通信道的带宽,N是电平强度)。

2.1.2 采样频率

采样频率是指计算机每秒钟采集多少个声音样本,是描述声音文件的音质、音调,衡量声卡、声音文件的质量标准。采样频率越高,即采样的间隔时间越短,则在单位时间内计算机得到的声音样本数据就越多,对声音波形的表示也越精确。采样频率与声音频率之间有一定的关系,根据奎斯特理论,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音。这就是说采样频率是衡量声卡采集、记录和还原声音文件的质量标准。

2.1.3采样位数与采样频率

采样位数即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。

采样位数和采样率对于音频接口来说是最为重要的两个指标,也是选择音频接口的两个重要标准。无论采样频率如何,理论上来说采样的位数决定了音频数据最大的力度范围。每增加一个采样位数相当于力度范围增加了6dB。采样位数越多则捕捉到的信号越精确。对于采样率来说你可以想象它类似于一个照相机,44.1kHz意味着音频流进入计算机时计算机每秒会对其拍照达441000次。显然采样率越高,计算机摄取的图片越多,对于原始音频的还原也越加精确。

2.1.4 预加重

通过一个一阶有限激励响应高通滤波器,使信号的频谱变得平坦,不易受到有限字长效应的影响。

2.1.5 分帧

根据语音的短时平稳特性,语音可以以帧为单位进行处理,实验中选取的语音帧长为32ms,帧叠为16ms。Matlab中用函数:

y=enframe(x,framelength,step)进行分帧,每帧长framelength,分得的帧数是nf = fix((nx-framelength+step)/step);其中nx是x的长度。y 是framelength×nf 或nf×framelength的数组,取决于x是列数据还是行数据。调用格式也可写为y=enframe(x,hanning(framelength),step);这时每帧数据都乘了窗函数hanning(framelength)。

2.1.6 加窗

采用汉明窗对一帧语音加窗,以减小吉布斯效应的影响。

2.1.7 快速傅立叶变换(Fast Fourier Transformation, FFT)

将时域信号变换成为信号的功率谱。

2.2 语音信号的分析及处理方法

2.2.1 语音的读入与回放

在MATLAB中,[y,fs,bits]=wavread('Blip',[N1 N2]);用于读取语音,采样值放在向量y中,fs表示采样频率(Hz),bits表示采样位数。[N1 N2]表示读取从N1点到N2点的值(若只有一个N的点则表示读取前N点的采样值)。

sound(x,fs,bits); 用于对声音的回放。向量y则就代表了一个信号(也即一个复杂的“函数表达式”)也就是说可以像处理一个信号表达式一样处理这个声音信号。

2.2.2 时域信号的FFT分析

FFT即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

在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为正整数。函数执行N点的FFT,若x为向量且长度小于N,则函数将x补零至长度N;若向量x的长度大于N,则函数截短x使之长度为N;若x 为矩阵,按相同方法对x进行处理。

2.2.3 数字滤波器设计原理

数字滤波是数字信号分析中最重要的组成部分之一,与模拟滤波相比,它具有精度和稳定性高、系统函数容易改变、灵活性强、便于大规模集成和可实现多维滤波等优点。在信号的过滤、检测和参数的估计等方面,经典数字滤波器是使用最广泛的一种线性系统。

数字滤波器的作用是利用离散时间系统的特性对输入信号波形(或频谱)进行加工处理,或者说利用数字方法按预定的要求对信号进行变换。

2.2.4 数字滤波器的设计步骤

不论是IIR滤波器还是FIR滤波器的设计都包括三个步骤:

(1) 按照实际任务的要求,确定滤波器的性能指标。

(2) 用一个因果、稳定的离散线性时不变系统的系统函数去逼近这一性能指标。根据不同的要求可以用IIR系统函数,也可以用FIR系统函数去逼近。

(3) 利用有限精度算法实现系统函数,包括结构选择、字长选择等。

2.2.5 IIR滤波器与FIR滤波器的性能比较

FIR:Finite Impulse response,有限冲击响应

IIR:Infinite Impulse response,无限冲击响应

从性能上来说,IIR滤波器传输函数的极点可位于单位圆内的任何地方,因此可用较低的阶数获得高的选择性,所用的存贮单元少,所以经济而效率高。但是这个高效率是以相位的非线性为代价的。选择性越好,则相位非线性越严重。相反,FIR滤波器却可以得到严格的线性相位,然而由于FIR滤波器传输函数的极点固定在原点,所以只能用较高的阶数达到高的选择性;对于同样的滤波器设计指标,FIR滤波器所要求的阶数可以比IIR滤波器高5~10倍,结果,成本较高,信号延时也较大;如果按相同的选择性和相同的线性要求来说,则IIR滤波器就必须加全通网络进行相位较正,同样要大增加滤波器的节数和复杂性。

整体来看,IIR滤波器达到同样效果阶数少,延迟小,但是有稳定性问题,非线性相位;FIR滤波器没有稳定性问题,线性相位,但阶数多,延迟大。

三.程序代码及仿真结果

3.1 语音的读入与回放 程序代码:

%原始语音信号读入与打开;

[x,fs,bits]=wavread('D:\anthem.wav',[1024,15120]); sound(x,fs,bits); X=fft(x,4096); figure(1);

subplot(211);plot(x);title('原始信号时域图'); xlabel('时间轴') ylabel('幅值轴') axis([0,4500,-2,2]);

subplot(212);plot(abs(X)); title('原始信号频谱图'); xlabel('频率/Hz 轴'); ylabel('幅值轴'); 仿真波形:

500

1000

1500

2000250030003500

4000

4500

-2-101

2原始信号时域图

时间轴

幅值轴

050010001500

200025003000350040004500

200400

600原始信号频谱图

频率/Hz 轴

幅值轴

3.2 语音量化处理 程序代码: p = 10; A=lpc(x,10); figure(3); subplot(211);

plot(A);title('量化的波形'); xlabel('频率/Hz'); ylabel('幅值'); z=T*abs(fft(A)); subplot(212);

stem(z);title('量化的频谱图'); 仿真结果:

1234

567891011

-0.5

00.5

1量化的波形

频率/Hz 幅值

1234567891011

-5

量化的频谱图

3.3 语音经高通滤波处理 程序代码: %N 阶高通滤波器; N=5;wc=0.3;

[b,a]=butter(N,wc,'high'); h=filter(b,a,x); H=fft(h); figure(2);

subplot(211);plot(h);title('IIR 滤波后信号的波形'); subplot(212);plot(abs(H));title('IIR 滤波后信号的频谱'); %sound(h); z=fftfilt(b,x); Z=fft(z); figure(4);

subplot(211);plot(z);title('FIR 滤波后信号的波形'); subplot(212);plot(abs(Z)); title('FIR 滤波后信号的频谱'); %sound(z); 仿真波形:

050001000015000

-1

1

2IIR 滤波后信号的波形

050001000015000

50

100

150IIR 滤波后信号的频谱

5000

10000

15000

-4-202

4FIR 滤波后信号的波形

050001000015000

200

400

600FIR 滤波后信号的频谱

3.4

语音预加重处理 程序代码: % 预加重处理 xx=double(x);

xx=filter([1 -0.9375],1,xx); XX=fft(xx,4096); figure(4);

subplot(211);plot(xx);title('预加重后信号波形'); subplot(212);plot(abs(XX));title('预加重后信号频谱'); 仿真波形:

-2-1012预加重后信号波形

020406080预加重后信号频谱

3.5语音经低通滤波处理

程序代码:

%窗函数设计低通滤波器:

fp=1000;

fc=1200;

as=100;

ap=1;

fs=22000;

wp=2*fp/fs;

wc=2*fc/fs;

N=ceil((as-7.95)/(14.36*(wc-wp)/2))+1; beta=0.1102*(as-8.7);

window=Kaiser(N+1,beta);

b=fir1(N,wc,window);

freqz(b,1,512,fs);

d=filter(b,a,x);

D=fft(d);

figure(4);

subplot(211)

plot(d);

title('滤波后的声音波形')

subplot(212)

plot(abs(D))

title('滤波后的声音频谱')

%sound(d);

仿真波形:

5000

10000

15000

-10

-505

10滤波后的声音波形

050001000015000

2000

4000

6000滤波后的声音频谱

3.6 语音分帧处理 程序代码: %分帧

% 设定帧移和帧长

step=219; % 帧移是否设置的比较大,可以试试80 framelength =256;

% 分帧后如果有结余,则补足最后一帧数据

lengthOfTailPad = framelength - rem( length(xx),framelength); %求余数 tailPad=xx(length(xx)-lengthOfTailPad+1:length(xx) ); %xx=[xx;tailPad]; %补足最后一帧

nf=fix((length(xx)-framelength+step)/step); %向0取整 计算帧数 sn=zeros(nf,framelength); %219*256 indf=step*(0:(nf-1)).'; inds=(1:framelength); % 语音分帧

u=indf(:,ones(1,framelength))+inds(ones(nf,1),:);%219*256 sn(:) = x(u); t=sn(:);

figure(6); subplot(211);

plot(t);title('分帧处理后的波形'); xlabel('时间/s'); ylabel('幅值/n'); f=fft(t); subplot(212);

plot(abs(f));title('分帧处理后的频谱图'); sound(t); 仿真波形:

2000

4000

6000

80001000012000140001600018000

-1-0.500.5

1分帧处理后的波形

时间/s

幅值/n

020004000600080001000012000140001600018000

5001000

1500分帧处理后的频谱图

3.7 语音加窗处理 程序代码: % 语音加窗

w=hamming(framelength)'; nwin=length(w); if(nwin>1)

sn = sn.*w(ones(nf,1),:); figure(5); subplot(211);

plot(sn);title('加窗后的波形'); xlabel('频率/hz'); ylabel('幅值/n'); c=T*abs(fft(sn)); subplot(212);

plot(c);title('加窗后的波形的频谱图'); end 仿真波形:

05001000150020002500

-0.4

-0.200.2

0.4加窗后的波形

频率/hz

幅值/n

5001000150020002500

-4

加窗后的波形的频谱图

四、设计评述

本设计圆满的完成了对语音信号的读取与打开,与课题的要求十分相符。本设计也较好的完成了对语音信号的频谱分析,通过fft变换,得出了语音信号的频谱图。

在滤波这一块,课题主要是从巴特沃斯滤波器入手来设计滤波器,也从一方面基本实现了滤波。

初略的完成了界面的设计,但也存在相当的不足,只是很勉强的达到了打开语音文件、显示已定滤波前后的波形等图。

语音信号处理是语音学与数字信号处理技术相结合的交叉学科,课题在这里不讨论语音学,而是将语音当做一种特殊的信号,即一种“复杂向量”来看待。也就是说,课题更多的还是体现了数字信号处理技术。

从课题的中心来看,课题是希望将数字信号处理技术应用于某一实际领域,这里就是指对语音的处理。作为存储于计算机中的语音信号,其本身就是离散化了的向量,我们只需将这些离散的量提取出来,就可以对其进行处理了。

在这里,用到了处理数字信号的强有力工具MATLAB,通过MATLAB里几个命令函数的调用,很轻易的在实际化语音与数字信号的理论之间搭了一座桥。

课题的特色在于它将语音看作了一个向量,于是语音数字化了,则可以完全利用数字信号处理的知识来解决。我们可以像给一般信号做频谱分析一样,来给语音信号做频谱分析,也可以较容易的用数字滤波器来对语音进行滤波处理。

但由于知识能力有限,当中也存在相当的不足,特别体现在滤波与界面设计这一块。对滤波的研究,本文只是举出了很小的一个方面,还有许多精髓都未能一一列举。至于用户界面的设计,由于笔者是初次接触,也未能有特别的掌握,仅就刚学习到的一些加以运用,于是设计的还是很粗糙。当然,这些问题与不足在今后的进一步学习中,我会一步一步的去进行解决。特别是对gui界面的设计,还有特别多的地方要学习。

五.参考文献

1.程佩青数字信号处理教程北京清华大学出版社 2007

2.张兆明刘政波刘斌等应用MATLAB实现信号分析和处理科学出版社 2001

3.张威 MATLAB基础与编程入门西安电子科技大学出版社 2003

4.王彬 MATLAB数字信号处理机械工业出版社 2010

5.邓威 MATLAB函数速查手册人民邮电出版社 2010

相关主题
相关文档
最新文档