资源描述
《MATLAB课程设计》汇报
设计题目:基于MATLAB语音信号采集和处理
学生姓名:
学生学号: 0546
专业班级: 光信息科学和技术
答辩时间: 12月
指导老师: 冯明库
广东技术师范学院
电子和信息学院
一、设计目标及意义
1. MATLAB软件功效介绍
MATLAB名称源自Matrix Laboratory,1984年由美国Mathworks企业推向市场。它是一个科学计算软件,专门以矩阵形式处理数据。MATLAB将高性能数值计算和可视化集成在一起,并提供了大量内置函数,从而被广泛应用于科学计算、控制系统和信息处理等领域分析、仿真和设计工作。
MATLAB软件包含五大通用功效,数值计算功效(Nemeric)、符号运算功效(Symbolic)、数据可视化功效(Graphic)、数字图形文字统一处理功效(Notebook)和建模拟真可视化功效(Simulink)。其中,符号运算功效实现是经过请求MAPLE内核计算并将结果返回到MATLAB命令窗口。该软件有三大特点,一是功效强大;二是界面友善、语言自然;三是开放性强。现在,Mathworks企业已推出30多个应用工具箱。MATLAB在线性代数、矩阵分析、数值及优化、数值统计和随机信号分析、电路和系统、系统动力学、次那好和图像处理、控制理论分析和系统设计、过程控制、建模和仿真、通信系统和财政金融等众多领域理论研究和工程设计中得到了广泛应用。
MATLAB在信号和系统中应用关键包含符号运算和数值计算仿真分析。因为信号和系统课程很多内容全部是基于公式演算,而MATLAB借助符号数学工具箱提供符号运算功效,能基础满足信号和系统课程需求。比如解微分方程、傅里叶正反变换、拉普拉斯正反变换和z正反变换等。MATLAB在信号和系统中另一关键应用是数值计算和仿真分析,关键包含函数波形绘制、函数运算、冲击响应和阶跃响应仿真分析、信号时域分析、信号频谱分析、系统S域分析和零极点图绘制等内容。数值计算仿真分析能够帮助学生更深入地了解理论知识,并为未来使用MATLAB进行信号处理领域多种分析和实际应用打下基础。
2. 本题目标意义
此次课程设计课题为《基于MATLAB语音信号采集和处理》,学会利用MATLAB信号处理功效,采集语音信号,并对语音信号进行滤波及变换处理,观察其时域和频域特征,加深对信号处理理论了解,并为以后熟练使用MATLAB进行系统分析仿真和设计奠定基础。
此次实习课程关键是为了深入熟悉对matlab软件使用,和学会利用matlab对声音信号这种实际问题进行处理,将理论应用于实际,加深对它了解。
二、设计任务及指标
利用MATLAB对语音信号进行分析和处理,采集语音信号后,利用MATLAB软件平台进行频谱分析;并对所采集语音信号加入干扰噪声,对加入噪声信号进行频谱分析,设计适宜滤波器滤除噪声,恢复原信号。语音信号“ 短时谱”对于非平稳信号, 它是非周期, 频谱随时间连续改变, 所以由傅里叶变换得到频谱无法获知其在各个时刻频谱特征。假如利用加窗方法从语音流中取出其中一个短断, 再进行傅里叶变换, 就能够得到该语音短时谱。
。
三、设计过程
(1). 语音信号采集及分析
基于声卡进行数字信号采集。将话筒插入计算机语音输入插口上,开启录音机。按下录音按钮,对话筒说话,说完后停止录音。要保留文件时,利用了计算机上A/D转换器,把模拟声音信号变成了离散量化了数字信号,放音时,它又经过D/A转换器,把保留数字数据恢复为原来模拟声音信号。在 Matlab软件平台下能够利用函数wavread对语音信号进行采样,得到了声音数据变量x1,同时把x1采样频率fs=22050Hz和数据位Nbits=16Bit放进了MATALB工作空间。图figure 1为原始语音信号时域图形。从图中能够看出在时域环境下,信号展现出6不规则信号峰值。经过freqz函数绘制原始语音信号频率响应图figure 2 。然后对语音信号进行频谱分析,在Matlab中能够利用函数fft对信号行快速傅里叶变换,得到信号频谱图figure 3,从图中能够看出对各个频点上随机信号在频域进行抽样 ,抽样频率为 22050Hz。
(2). 给原始信号加上一个高频噪声
在Matlab中人为设计一个固定频率5500Hz噪声干扰信号。噪声信号通常为随机序列,在本设计中用正弦序列替换,干扰信号构建命令函数为d=[Au*sin(2*pi*5500*t)]',给出干扰信号为一个正弦信号,针对上面语音信号 ,采集了其中一段。再对噪音信号进行频谱变换得到其频谱图,从图中能够看出干扰信号,在4000Hz和 6000Hz频点处有一高峰 ,其中 5500Hz 正是本设计所要利用。
(3). 设计一个滤波器,滤除高频噪声
由模拟滤波器变换为数字滤波器时,采取是双线性变换法, 它保留是从模拟到数字域系统函数表示。在滤波器选择时, 因为设计方法侧关键不一样, 作出比较是困难。假如FIR滤波器情况下,最优设计将是椭圆滤波器。用双线性变换法设计低通滤波器。本设计是用双线性变换法设计BW带阻型滤波器。在 MATLAB中 ,能够利用函数 butterworth,设计FIR滤波器,利用 MATLAB 中函数freqz 画出各滤波器频率响应。用设计好带阻滤波器对含噪语音信号进行滤波,在Matlab中 FIR滤波器利用函数fftfilt对信号进行滤波,FIR滤波器利用函数filter对信号进行滤波。在一个窗口同时画出滤波前后波形及频谱。从图中能够看出 ,5500Hz看到高峰消失了 ,语音信号和开始一样 ,滤波器成功滤除了干扰信号。利用MATLAB对语音信号进行分析和处理,采集语音信号后,利用MATLAB软件平台进行频谱分析;并对所采集语音信号加入干扰噪声,对加入噪声信号进行频谱分析,设计适宜滤波器滤除噪声,恢复原信号。
四、结论及分析
1.用MATLAB对原始语音信号进行分析,画出它时域波形和频谱
程序:
fs=22050; %语音信号采样频率为22050
x1=wavread('C:\Documents and Settings\Administrator\桌面\声音文件.wav');
%读取语音信号数据,赋给变量x1,
sound(x1,22050); %播放语音信号
y1=fft(x1,1024); %对信号做1024点FFT变换
f=fs*(0:511)/1024; %将0到511,步长为1序列值和fs相乘并除以1024值,赋值给f
figure(1) %创建图形窗1
plot(x1) %做原始语音信号时域图形
title('原始语音信号');
xlabel('time n'); %x轴名字是“time n”
ylabel('fuzhi n'); %y轴名字是“fuzhi n”
figure(2)
freqz(x1) %绘制原始语音信号频率响应图
title('频率响应图')
figure(3)
subplot(2,1,1); %创建两行一列绘图区间第1个绘图区间
plot(abs(y1(1:512))) %做原始语音信号FFT频谱图
title('原始语音信号FFT频谱')
subplot(2,1,2);
plot(f,abs(y1(1:512))); %abs是绝对值,plot是直角坐标下线性刻度曲线
title('原始语音信号频谱')
xlabel('Hz');
ylabel('幅值');
时域波形和频谱:
图1 原始语音信号
图2 语音信号频率响应图
图3 原始语音信号FFT和信号频谱
2. 给原始语音信号加上一个高频余弦噪声,频率为5500hz。对加噪后语音进行分析,并画出其信号时域和频谱图。
程序:
fs=22050;
x1=wavread('C:\Documents and Settings\Administrator\桌面\声音文件.wav');
%读取语音信号数据,赋给变量x1
f=fs*(0:511)/1024; %将0到511,步长为1序列值和fs相乘并除以1024值,赋值给f
t=0:1/fs:(length(x1)-1)/fs; %将0到x1长度减1后值除以fs值,且步长为1/fs值,序列值,给予t
Au=0.03; %噪声幅值
d=[Au*sin(2*pi*5500*t)]'; %所加噪声是正弦信号
x2=x1+d; %将正弦信号噪声加在语音信号上
sound(x2,22050); %播放语音信号
y1=fft(x1,1024); %对信号y1做1024点FFT变换
y2=fft(x2,1024); %对信号y2做1024点FFT变换
figure(1); %创建图形窗1
plot(t,x2); %做加噪后信号时域图形(绘出t对x2线性图)
title('加噪后信号');
xlabel('time n'); %x轴名字是“time n”
ylabel('fuzhi n'); %y轴名字是“fuzhi n”
figure(2) %创建图形窗2
subplot(2,1,1); % 创建两行一列绘图区间第1个绘图区间
plot(f,abs(y1(1:512))); %做原始语音信号频谱图
title('原始语音信号频谱');
xlabel('Hz'); %x轴名字是“time n”
ylabel('fuzhi'); % y轴名字是“fuzhi”
subplot(2,1,2); %创建两行一列绘图区间第2个绘图区间
plot(f,abs(y2(1:512))); %做加噪后语音信号频谱图(abs是绝对值,plot是直角坐标下线性刻度曲线)
title('加噪后信号频谱');
xlabel('Hz'); %x轴名字是“time n”
ylabel('fuzhi'); % y轴名字是“fuzhi”
时域波形和频谱:
图4 加噪后信号时域图
图5 原始信号和加噪后信号频谱对比
和原始信号对比,区分:
先原始信号没加噪音之前0到有幅值,在4000到6000之间没有幅值,不过在加了噪音以后4000到6000之间出现最大幅值12,超出正常值。图5原始信号和加噪后信号频谱对比图所表示。
3. 设计适宜滤波器,滤除高频噪声,绘出滤波后信号频域和时域波形:
程序:
%用双线性变换法设计巴特沃思低通滤波器
wp=0.25*pi; %通带截止频率
ws=0.3*pi; %阻带截止频率
Rp=1; %通带最大衰减(db)
Rs=15; %阻带最大衰减(db)
Fs=22050;
Ts=1/Fs;
wp1=2/Ts*tan(wp/2); %将模拟指标转换成数字指标
ws1=2/Ts*tan(ws/2); %将模拟指标转换成数字指标
[N,Wn]=buttord(wp1,ws1,Rp,Rs,'s'); %选择滤波器最小阶数(估算得到Butterworth低通滤波器最小阶数N和3dB截止频率Wc)
[Z,P,K]=buttap(N); %创建Butterworth低通滤波器原型
[Bap,Aap]=zp2tf(Z,P,K); %将零极点增益转换为普遍分子,分母
[b,a]=lp2lp(Bap,Aap,Wn); %将普遍分子和分母转换为以Wn为截止频率
[bz,az]=bilinear(b,a,Fs); %用双线性变换法实现模拟滤波器到数字滤波器转换(模拟转换为数字)
[H,W]=freqz(bz,az); %求频率响应
figure(9)
plot(W*Fs/(2*pi),abs(H)) %绘制Butterworth低通滤波器频率响应曲线
grid %添加图格
xlabel('频率/Hz')
ylabel('频率响应幅度')
title('Butterworth')
f1=filter(bz,az,z); %利用上面已做好滤波器(已bz和az为特征滤波器)对x2信号进行滤波,赋值给f1
figure(10)
subplot(2,1,1) %创建两行一列绘图区间第1绘图区间
plot(t,z) %做加噪后信号时域图形
title('滤波前时域波形');
subplot(2,1,2) %创建两行一列绘图区间第2绘图区间
plot(t,f1);
title('滤波后时域波形');
sound(f1,22050); %播放语音信号
p=length(f1);
F0=fft(f1,p);
f=0:fs/p:fs*(s-1)/p;
figure(11)
y2=fft(z,1024); %对信号y2做1024点FFT变换
subplot(2,1,1); %创建两行一列绘图区间第1绘图区间
plot(f,abs(y4));
title('滤波前频谱')
xlabel('Hz'); %x轴名字是“Hz”
ylabel('fuzhi'); %y轴名字是“fuzhi”
subplot(2,1,2)
F1=plot(f,abs(F0));
title('滤波后频谱')
xlabel('Hz');
ylabel('fuzhi');
时域波形和频谱:
图6 低通滤波器频率响应曲线
图7 滤波前后时域波形图
图8 滤波前后频谱图
和原噪音信号对比,区分:
经过对比分析可知,滤波后输出波形和原始语音加噪声信号图形发生了部分改变,在3000-6000Hz之间信号消失,出现0-1000和7000-8000之间信号。滤波后输出波形显著在对应时间幅度比原语音加噪声信号要小,而且滤波效果也和滤波器选择相关,能够看出滤波器性能差异和参数调整会对滤波器产生一定影响,而且经过回放能够发觉滤波前后声音有改变.低通滤波后,已很靠近原来声音,人耳几乎分辨不出 。从频谱图中我们还能够看出声音能量信号关键集中在低频部分,说明高频语音信号被滤出,滤波器达成既定要求。
五、设计体会
正所谓“纸上得来终觉浅,觉知此事要躬行。”学习任何知识,仅从理论上去求知,而不去实践、探索是不够。所以在学期末来临之际,我们迎来了MATLAB课程设计。
经过为期一周半MATLAB课程设计,我对MATLAB这个仿真软件有了更深入认识和了解。在这一周半时间里,我经过自己探索,查阅资料,而且在老师指导下完成了:语音信号采集及分析;给原始信号加上一个高频噪声;设计一个滤波器,滤除高频噪声;并最终将课程设计汇报总结完成。
在整个设计过程中我知道了很多东西,也培养了独立思索和设计能力,树立了对知识应用信心,相信会对以后学习工作和生活有很大帮助,而且提升了自己动手实践操作能力, 使自己充足体会到了在设计过程中成功喜悦。即使这个设计做不怎么好,不过在设计过程中所学到东西是这次课程设计最大收获和财富,使我终生受益。
在没有做课程设计以前,认为课程设计只是对知识单纯总结,不过经过这次课程设计发觉自己见解有点太片面,课程设计不仅是对前面所学知识一个检验,也是对自己能力一个提升,经过这次课程设计使自己明白了原来那点知识是很欠缺,要学习东西还很多,经过这次课程设计,明白学习是一个长久积累过程,在以后工作和生活中全部应该不停学习,努力提升自己知识和综合素质。期望以后像这么课程设计在多一点。
参考文件:
[1] 姚东.MATLAB及在电子信息课程中应用[M].第二版.北京:北京电子工业出版社,
[2]张智星.MATLAB程序设计和应用.北京:清华大学出版社,
[3]陈怀琛.MATLAB及其在理工课程中应用指南.西安:西安电子科技大学出版社,1999.10
[4]肖伟、刘忠. MATLAB程序设计和应用[M].北京:清华大学出版社
程序清单:
fs=22050; %语音信号采样频率为22050
x1=wavread('C:\Documents and Settings\Administrator\桌面\声音文件.wav');
%读取语音信号数据,赋给变量x1,
sound(x1,22050); %播放语音信号
y1=fft(x1,1024); %对信号做1024点FFT变换
f=fs*(0:511)/1024; %将0到511,步长为1序列值和fs相乘并除以1024值,赋值给f
figure(1) %创建图形窗1
plot(x1) %做原始语音信号时域图形
title('原始语音信号');
xlabel('time n'); %x轴名字是“time n”
ylabel('fuzhi n'); %y轴名字是“fuzhi n”
figure(2)
freqz(x1) %绘制原始语音信号频率响应图
title('频率响应图')
figure(3)
subplot(2,1,1); %创建两行一列绘图区间第1个绘图区间
plot(abs(y1(1:512))) %做原始语音信号FFT频谱图
title('原始语音信号FFT频谱')
subplot(2,1,2);
plot(f,abs(y1(1:512))); %abs是绝对值,plot是直角坐标下线性刻度曲线
title('原始语音信号频谱')
xlabel('Hz');
ylabel('幅值');
fs=22050;
x1=wavread('C:\Documents and Settings\Administrator\桌面\声音文件.wav');
%读取语音信号数据,赋给变量x1
f=fs*(0:511)/1024; %将0到511,步长为1序列值和fs相乘并除以1024值,赋值给f
t=0:1/fs:(length(x1)-1)/fs; %将0到x1长度减1后值除以fs值,且步长为1/fs值,序列值,给予t
Au=0.03; %噪声幅值
d=[Au*sin(2*pi*5500*t)]'; %所加噪声是正弦信号
x2=x1+d; %将正弦信号噪声加在语音信号上
sound(x2,22050); %播放语音信号
y1=fft(x1,1024); %对信号y1做1024点FFT变换
y2=fft(x2,1024); %对信号y2做1024点FFT变换
figure(1); %创建图形窗1
plot(t,x2); %做加噪后信号时域图形(绘出t对x2线性图)
title('加噪后信号');
xlabel('time n'); %x轴名字是“time n”
ylabel('fuzhi n'); %y轴名字是“fuzhi n”
figure(2) %创建图形窗2
subplot(2,1,1); % 创建两行一列绘图区间第1个绘图区间
plot(f,abs(y1(1:512))); %做原始语音信号频谱图
title('原始语音信号频谱');
xlabel('Hz'); %x轴名字是“time n”
ylabel('fuzhi'); % y轴名字是“fuzhi”
subplot(2,1,2); %创建两行一列绘图区间第2个绘图区间
plot(f,abs(y2(1:512))); %做加噪后语音信号频谱图(abs是绝对值,plot是直角坐标下线性刻度曲线)
title('加噪后信号频谱');
xlabel('Hz'); %x轴名字是“time n”
ylabel('fuzhi'); % y轴名字是“fuzhi”
%用双线性变换法设计巴特沃思低通滤波器
wp=0.25*pi; %通带截止频率
ws=0.3*pi; %阻带截止频率
Rp=1; %通带最大衰减(db)
Rs=15; %阻带最大衰减(db)
Fs=22050;
Ts=1/Fs;
wp1=2/Ts*tan(wp/2); %将模拟指标转换成数字指标
ws1=2/Ts*tan(ws/2); %将模拟指标转换成数字指标
[N,Wn]=buttord(wp1,ws1,Rp,Rs,'s'); %选择滤波器最小阶数(估算得到Butterworth低通滤波器最小阶数N和3dB截止频率Wc)
[Z,P,K]=buttap(N); %创建Butterworth低通滤波器原型
[Bap,Aap]=zp2tf(Z,P,K); %将零极点增益转换为普遍分子,分母
[b,a]=lp2lp(Bap,Aap,Wn); %将普遍分子和分母转换为以Wn为截止频率
[bz,az]=bilinear(b,a,Fs); %用双线性变换法实现模拟滤波器到数字滤波器转换(模拟转换为数字)
[H,W]=freqz(bz,az); %求频率响应
figure(9)
plot(W*Fs/(2*pi),abs(H)) %绘制Butterworth低通滤波器频率响应曲线
grid %添加图格
xlabel('频率/Hz')
ylabel('频率响应幅度')
title('Butterworth')
f1=filter(bz,az,z); %利用上面已做好滤波器(已bz和az为特征滤波器)对x2信号进行滤波,赋值给f1
figure(10)
subplot(2,1,1) %创建两行一列绘图区间第1绘图区间
plot(t,z) %做加噪后信号时域图形
title('滤波前时域波形');
subplot(2,1,2) %创建两行一列绘图区间第2绘图区间
plot(t,f1);
title('滤波后时域波形');
sound(f1,22050); %播放语音信号
p=length(f1);
F0=fft(f1,p);
f=0:fs/p:fs*(s-1)/p;
figure(11)
y2=fft(z,1024); %对信号y2做1024点FFT变换
subplot(2,1,1); %创建两行一列绘图区间第1绘图区间
plot(f,abs(y4));
title('滤波前频谱')
xlabel('Hz'); %x轴名字是“Hz”
ylabel('fuzhi'); %y轴名字是“fuzhi”
subplot(2,1,2)
F1=plot(f,abs(F0));
title('滤波后频谱')
xlabel('Hz');
ylabel('fuzhi');
展开阅读全文