基于matlab语音信号频谱分析
采样定理
在进行模拟/数字信号的转换过程中,当采样频率最大值大于信号中最高频率fmax 的2.56倍时,即:fs.max>=2.56fmax,则采样之后的数字信号完整地保留了原始信号中的信息.
采样频率
采样频率是指计算机每秒钟采集多少个声音样本,采样频率越高,即采样的间隔时间越短,则在单位时间内计算机得到的声音样本数据就越多,对声音波形的表示也越精确。只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音。
程序中采用44.1kHz 采样频率。
语音的录入与打开
在MATLAB 中,[y,fs,bits]=wavread('Blip',[N1 N2]);用于读取语音,采样值放在向量y 中,fs 表示采样频率(Hz),bits 表示采样位数。[N1 N2]表示读取从N1点到N2点的值。
X=wavrecord(t,fs,ch);用来采集声音;t 表示录音时间,fs 采样频率,ch 声道。
时域信号的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 图形用户界面概念
图形用户界面或图形用户接口(Graphical User Interface,GUI) 是指采用图形方式显示的计算机操作环境用户接口。与早期计算机使用的命令行界面相比,图形界面对于用户来说更为简便易用。
GUIDE 是Matlab 提供的图形用户界面开发环境,提供了一系列用于创建图形用户界面的工具,从而简化界面布局和编程工作。
3.2 图形用户界面设计
1.GUI 设计模板
在MATLAB 主窗口中,选择File 菜单中的New 菜单项,再选择其中的GUI 命令,就会显示图形用户界面的设计模板。
MATLAB 为GUI 设计一共准备了4种模板,分别是Blank GUI(默认) 、GUI with Uicontrols(带控件对象的GUI 模板) 、GUI with Axes and Menu(带坐标轴与菜单的GUI 模板) 与Modal Question Dialog(带模式问话对话框的GUI 模板) 。
当用户选择不同的模板时,在GUI 设计模板界面的右边就会显示出与该模板对应的GUI 图形。
2.GUI 设计窗口
在GUI 设计模板中选中一个模板,然后单击OK 按钮,就会显示GUI 设计窗口。选择不同的GUI 设计模式时,在GUI 设计窗口中显示的结果是不一样的。
GUI 设计窗口由菜单栏、工具栏、控件工具栏以及图形对象设计区等部分组成。GUI 设计窗口的菜单栏有File 、Edit 、View 、Layout 、Tools 和Help 6个菜单项,使用其中的命令可以完成图形用户界面的设计操作。
3.GUI 设计窗口的基本操作
在GUI 设计窗口创建图形对象后,通过双击该对象,就会显示该对象的属性
编辑器。例如,创建一个Push Button对象,并设计该对象的属性值。
3.3 图形用户界面模块调试
3.3.1 语音信号的读入与打开
下面的一段程序是语音信号在MATLAB 中的最简单表现,它实现了语音的读入打开,以及绘出了语音信号的波形频谱图。
[x,fs,bits]=wavread('ding.wav',[1024 5120]); 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('原始信号相位'); 程序运行可以听到声音,得到的结果如图3-1所示:
图3-1 语音信号的读入与打开
3.3.2 语音信号的定点分析
已知一个语音信号,数据采样频率为100Hz ,试分别绘制N =128点DFT 的幅频图和N =1024点DFT 幅频图。编程如下:
x=wavread('ding.wav'); sound(x); fs=100;N=128; y=fft(x,N); magy=abs(y);
f=(0:length(y)-1)'*fs/length(y); subplot(221);plot(f,magy);
xlabel('频率(Hz )');ylabel('幅值'); title('N=128(a)');grid
subplot(222);plot(f(1:N/2),magy(1:N/2)); xlabel('频率(Hz )');ylabel('幅值'); title('N=128(b)');grid fs=100;N=1024; y=fft(x,N); magy=abs(y);
f=(0:length(y)-1)'*fs/length(y); subplot(223);plot(f,magy);
xlabel('频率(Hz )');ylabel('幅值'); title('N=1024(c)');grid
subplot(224);plot(f(1:N/2),magy(1:N/2)); xlabel('频率(Hz )');ylabel('幅值'); title('N=1024(d)');grid 运行结果如图3-2所示:
图3-2 语音信号定点分析
3.3.3 N阶高通滤波器
在这里,以5阶为例,其中wc 为其3dB 边缘频率, 程序设计如下: x=wavread('ding.wav'); sound(x); N=5;wc=0.3;
[b,a]=butter(N,wc,'high'); X=fft(x);
subplot(321);plot(x);title('滤波前信号的波形'); subplot(322);plot(X);title('滤波前信号的频谱'); y=filter(b,a,x); Y=fft(y);
subplot(323);plot(y);title('IIR滤波后信号的波形'); subplot(324);plot(Y);title('IIR滤波后信号的频谱'); z=fftfilt(b,x); Z=fft(z);
subplot(325);plot(z);title('FIR滤波后信号的波形'); subplot(326);plot(Z);title('FIR滤波后信号的频谱');
得到结果如图3-3所示:
图3-3 N阶高通滤波器
3.3.4 N阶低通滤波器
在这里,同样以5阶为例,其中wc 为其3dB 边缘频率,程序设计如下: x=wavread('ding.wav'); sound(x); N=5;wc=0.3; [b,a]=butter(N,wc); X=fft(x);
subplot(321);plot(x);title('滤波前信号的波形'); subplot(322);plot(X);title('滤波前信号的频谱'); y=filter(b,a,x); Y=fft(y);
subplot(323);plot(y);title('IIR滤波后信号的波形'); subplot(324);plot(Y);title('IIR滤波后信号的频谱'); z=fftfilt(b,x); Z=fft(z);
subplot(325);plot(z);title('FIR滤波后信号的波形');
subplot(326);plot(Z);title('FIR滤波后信号的频谱'); 得到结果如图3-4所示:
图3-4 N阶低通滤波器
3.3.5 2N阶带通滤波器
2N 阶带通滤波器的设计(在这里,以10阶为例,其中wc 为其3dB 边缘频率,wc=[w1,w2],w1 wc w2),程序设计如下:
x=wavread('ding.wav'); sound(x); N=5;wc=[0.3,0.6]; [b,a]=butter(N,wc); X=fft(x);
subplot(321);plot(x);title('滤波前信号的波形'); subplot(322);plot(X);title('滤波前信号的频谱'); y=filter(b,a,x); Y=fft(y);
subplot(323);plot(y);title('IIR滤波后信号的波形'); subplot(324);plot(Y);title('IIR滤波后信号的频谱'); z=fftfilt(b,x);
Z=fft(z);
subplot(325);plot(z);title('FIR滤波后信号的波形'); subplot(326);plot(Z);title('FIR滤波后信号的频谱'); 得到结果如图3-5所示:
图3-5 带通滤波器
3.3.6 2N阶带阻滤波器
2N 阶带阻滤波器的设计(在这里,以10阶为例,其中wc 为其3dB 边缘频率,wc=[w1,w2],w1 wc w2),程序设计如下:
x=wavread('ding.wav'); sound(x); N=5;wc=[0.2,0.7];
[b,a]=butter(N,wc,'stop'); X=fft(x);
subplot(321);plot(x);title('滤波前信号的波形'); subplot(322);plot(X);title('滤波前信号的频谱'); y=filter(b,a,x); Y=fft(y);
subplot(323);plot(y);title('IIR滤波后信号的波形');
subplot(324);plot(Y);title('IIR滤波后信号的频谱');
z=fftfilt(b,x);
Z=fft(z);
subplot(325);plot(z);title('FIR滤波后信号的波形');
subplot(326);plot(Z);title('FIR滤波后信号的频谱');
得到结果如图3-6所示:
图3-6 带阻滤波器
3.4 图形用户界面制作
MATLAB 中图形用户界面的制作有两种方法:M 文件和GUIDE ,本设计采用GUIDE 的方法制作GUI 。
1. 新建一个空白GUI 模板:进入MATLAB 程序界面以后执行File →New →GUI 过程,即可进入
2. 选择空白模板选项条,单击OK ,一个空白GUI 模板生成
3. 拖拉白色框的右下角调整界面大小,现在就可以开始设计GUI 功能界面了。从左边控件框选择所需要的控件放置在GUI 面板中,然后对各个控件进行编辑,包括位置、大小、颜色、名称以及编写回调函数等。本设计主要用到下拉菜单、坐标系、框架和按钮,现分别介绍。
4. 按钮设计:按钮键又称命令按钮或按钮,是小的长方形屏幕对象,常常在对象本身标有文本。将鼠标指针移至对象,单击鼠标按钮执行由回调字符串所定
义的动作。
单击空间框左侧的Push Button 按钮,在图形编辑框中确定其位置后单击鼠标左键即可放置
现在开始编写回调函数,确定按钮功能。在按钮上单击鼠标右键,选择view - callbacks →callback 即可在M 文件中找到该按钮的回调函数位置。然后编写功能函数,本设计中该按钮的功能是绘制原始波形,那么只需要读取语音信号并画出波形。
5. 坐标系设计:坐标轴对象是许多图形对象的父对象,每一个可视化显示用户数据的图形窗口都包含一个或多个坐标轴对象。坐标轴对象确定了图形窗口的坐标系统,所有绘图函数都会使用当前坐标轴对象或创建一个新的坐标轴对象,用于确定其绘图数据点在图形中的位置。
单击空间框左侧的Axes 按钮,在图形编辑框中确定其位置后单击鼠标左键即可放置
6. 框架设计:框架对象仅是带色彩的矩形区域,框架提供了视觉的分隔性,框架的style 属性值是Frame 。在其他对象放入框架之前,框架应事先定义,否则框架可能覆盖控制框使他们不可见。
本次课程设计的最终图形用户界面如图3-7所示
图3-7 图形用户界面
第四章 总结
本设计圆满的完成了对语音信号的读取与打开,与课题的要求十分相符; 本设计也较好的完成了对语音信号的频谱分析,通过fft 变换,得出了语音信号的频谱图;
在滤波这一块,课题主要是从巴特沃斯滤波器入手来设计滤波器,也从一方面基本实现了滤波;
初略的完成了界面的设计,但也存在相当的不足,只是很勉强的达到了打开语音文件、显示已定滤波前后的波形等图。
语音信号处理是语音学与数字信号处理技术相结合的交叉学科,课题在这里不讨论语音学,而是将语音当做一种特殊的信号,即一种“复杂向量”来看待。也就是说,课题更多的还是体现了数字信号处理技术。
从课题的中心来看,课题是希望将数字信号处理技术应用于某一实际领域,这里就是指对语音的处理。作为存储于计算机中的语音信号,其本身就是离散化了的向量,我们只需将这些离散的量提取出来,就可以对其进行处理了。
在这里,用到了处理数字信号的强有力工具MATLAB ,通过MATLAB 里几个命令函数的调用,很轻易的在实际化语音与数字信号的理论之间搭了一座桥。
课题的特色在于它将语音看作了一个向量,于是语音数字化了,则可以完全利用数字信号处理的知识来解决。我们可以像给一般信号做频谱分析一样,来给语音信号做频谱分析,也可以较容易的用数字滤波器来对语音进行滤波处理。
最后,还利用了MATLAB 的另一强大功能——gui 界面设计。设计出了一个简易的用户应用界面,可以让人实现界面操作。更加方便的进行语音的频谱分析与滤波处理。
但由于知识能力有限,当中也存在相当的不足,特别体现在滤波与界面设计这一块。对滤波的研究,本文只是举出了很小的一个方面,还有许多精髓都未能一一列举。至于用户界面的设计,由于笔者是初次接触,也未能有特别的掌握,仅就刚学习到的一些加以运用,于是设计的还是很粗燥。当然,这些问题与不足在今后的进一步学习中,我会一步一步的去进行解决。特别是对gui 界面的设计,还有特别多的地方要学习。
附录
程序源代码:
function varargout = my(varargin)
% MY M-file for my.fig
% MY, by itself, creates a new MY or raises the existing
% singleton*.
%
% H = MY returns the handle to a new MY or the handle to
% the existing singleton*.
%
% MY('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in MY.M with the given input arguments. %
% MY('Property','Value',...) creates a new MY or raises the % existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before my_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to my_OpeningFcn via varargin. %
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help my
% Last Modified by GUIDE v2.5 02-Jul-2009 15:21:29
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @my_OpeningFcn, ...
'gui_OutputFcn', @my_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before my is made visible.
function my_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to my (see VARARGIN)
% Choose default command line output for my
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes my wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. function varargout = my_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in input.
function input_Callback(hObject, eventdata, handles)
% hObject handle to input (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global I;
global X;
global magX;
global angX;
H={'*.wav'};
[filename,pathname]=uigetfile(H,'请选择打开文件');
file=strcat(pathname,filename);
I=wavread(file);
X=fft(I,4096);
magX=abs(X);
angX=angle(X);
subplot(221);plot(I);title('原始信号波形');
subplot(222);plot(X); title('原始信号频谱');
subplot(223);plot(magX);title('原始信号幅值');
subplot(224);plot(angX);title('原始信号相位');
%global magX;
%global angX;
%X=filter(I);
%magX=abs(X);
%angX=angle(X);
% --- Executes on button press in boyin.
function boyin_Callback(hObject, eventdata, handles)
% hObject handle to boyin (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global I;
sound(I);
% --- Executes on button press in sound.
function sound_Callback(hObject, eventdata, handles)
% hObject handle to sound (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global I;
global X;
global magX;
global angX;
Y=wavread('speech');
y=real(fft(Y,4096));
magY=abs(y);
angY=angle(y);
Y=Y+I;
y=X+y;
magY=magX+magY;
angY=angX+angY;
subplot(221);plot(Y);title('加噪后信号波形');
subplot(222);plot(y); title('加噪后信号频谱');
subplot(223);plot(magY);title('加噪后信号幅值');
subplot(224);plot(angY);title('加噪后信号相位');
% --- Executes on button press in Filter.
function Filter_Callback(hObject, eventdata, handles)
% hObject handle to Filter (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %
--------------------------------------------------------------------
function FFT_Callback(hObject, eventdata, handles)
% hObject handle to Filter (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA) global Y;
global Z;
b=100;a=5;
z=filter(a,b,Y);
Z=fft(z,4096);
magZ=abs(Z);
angZ=angle(Z);
subplot(221);plot(z);title('FIR滤波后信号波形');
subplot(222);plot(Z); title('FIR滤波后信号频谱');
subplot(223);plot(magZ);title('FIR滤波后信号幅值');
subplot(224);plot(angZ);title('FIR滤波后信号相位');
%
--------------------------------------------------------------------
function IIR_Callback(hObject, eventdata, handles)
% hObject handle to IIR (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global Y;
global Z;
b=4;
z=fftfilt(b,Y);
Z=fft(z,4096);
magZ=abs(Z);
angZ=angle(Z);
subplot(221);plot(z);title('IIR滤波后信号波形');
subplot(222);plot(Z); title('IIR滤波后信号频谱');
subplot(223);plot(magZ);title('IIR滤波后信号幅值');
subplot(224);plot(angZ);title('IIR滤波后信号相位');
%
--------------------------------------------------------------------
function Butter_Callback(hObject, eventdata, handles)
% hObject handle to Butter (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global I;
global Y;
global Z;
N=5;wc=0.3;
[b,a]=butter(N,wc);
y=filter(b,a,I);
Y=fft(y);
subplot(323);plot(y);title('IIR滤波后信号的波形');
subplot(324);plot(Y);title('IIR滤波后信号的频谱');
z=fftfilt(b,I);
Z=fft(z);
subplot(325);plot(z);title('FIR滤波后信号的波形');
subplot(326);plot(Z);title('FIR滤波后信号的频谱');
% --- Executes on button press in pushbutton9.
function pushbutton9_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton9 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) x=wavread('speech.wav');
sound(x);
fs=100;N=128;
y=fft(x,N);
magy=abs(y);
f=(0:length(y)-1)'*fs/length(y);
subplot(221);plot(f,magy);
xlabel('频率(Hz )');ylabel('幅值');
title('N=128(a)');grid
subplot(222);plot(f(1:N/2),magy(1:N/2));
xlabel('频率(Hz )');ylabel('幅值');
title('N=128(b)');grid
fs=100;N=1024;
y=fft(x,N);
magy=abs(y);
f=(0:length(y)-1)'*fs/length(y);
subplot(223);plot(f,magy);
xlabel('频率(Hz )');ylabel('幅值');
title('N=1024(c)');grid
subplot(224);plot(f(1:N/2),magy(1:N/2));
xlabel('频率(Hz )');ylabel('幅值');
title('N=1024(d)');grid
参考文献
【1】(美) Sanjit K. Mitra著;孙洪, 余翔宇等译. 数字信号处理实验指导书:MATLAB 版. 北京:电子工业出版社,2005
【2】杨述斌,李永全. 数字信号处理实践教程. 武汉:华中科技大学出版社,2007年1月
【3】Chi-Tsong Chen.Digital Signal Processing —Spectral Computation and Filter Design.Oxford University Press,Inc.,2001
【4】John R.Buck,Alan V.Oppenheim,Ronald W.Schafer.Discrete-Time Signal Processing,Vol.I,Dec.,1998
【5】(美) 维纳•K •恩格尔, (美) 约翰•G •普罗克斯;刘树棠译. 数字信号处理:使用MATLAB. 西安:西安交通大学出版社,2002
【6】黄文梅,熊桂林,杨勇. 信号分析与处理——MATLAB 语言及应用. 长沙:国防科技大学出版社,2000年2月
【7】Steiglitz K.Computer-Aided Design of Recursive Digital Filters.IEEE Trans.Audio Electroacoust,June 1970
【8】TMS320C3X User’Guide.Texas Instruments,1992
【9】Gales M.Model-Based Techniques for Noise Robust Speech Recognition. Ph.D.Thesis,University of Cambridge,1990
【10】陈怀琛. 数字信号处理教程——MATLAB 释义与实现. 北京:电子工业出版社,2004年12月
【11】程佩青. 数字信号处理教程(第二版). 北京:清华大学出版社,2001年8月
【12】韩纪庆,张磊,郑铁然. 语音信号处理. 北京:清华大学出版社,2004年9月
【13】易克初,田斌,付强. 语音信号处理. 北京:国防工业出版社,2000年6月