MATLAB课程设计讲解.docx
《MATLAB课程设计讲解.docx》由会员分享,可在线阅读,更多相关《MATLAB课程设计讲解.docx(15页珍藏版)》请在冰豆网上搜索。
MATLAB课程设计讲解
MATLAB
课程设计报告书
课题名称
基于MATLAB的语音信号采集与处理
姓名
胡敬
学号
3120504005
院、系、部
电气信息工程学院
专业
电子信息科学与技术1201
指导教师
许波
2014年7月3日
语音信号的采集与处理
一、实践的目的和要求
本次课程设计的课题为《基于MATLAB的语音信号采集与处理》,学会运用MATLAB的信号处理功能,采集语音信号,并对语音信号进行滤波及变换处理,观察其时域和频域特性,加深对信号处理理论的理解,并为今后熟练使用MATLAB进行系统的分析仿真和设计奠定基础。
此次实习课程主要是为了进一步熟悉对matlab软件的使用,以及学会利用matlab对声音信号这种实际问题进行处理,将理论应用于实际,加深对它的理解。
二、实践原理:
理论原理:
利用MATLAB对语音信号进行分析和处理,采集语音信号后,利用MATLAB软件平台进行频谱分析;并对所采集的语音信号加入干扰噪声,对加入噪声的信号进行频谱分析,设计合适的滤波器滤除噪声,恢复原信号。
语音信号的“短时谱”对于非平稳信号,它是非周期的,频谱随时间连续变化,因此由傅里叶变换得到的频谱无法获知其在各个时刻的频谱特性。
如果利用加窗的方法从语音流中取出其中一个短断,再进行傅里叶变换,就可以得到该语音的短时谱。
课题要求:
课题要求:
1、语音信号的采集
利用Windows下的录音机,录制一段自己的话音,时间在5s左右,然后在Matlab软件平台下,利用函数wavread对语音信号进行采样,记住采样频率和采样点数。
(1)请每位同学都参与录音。
分析鸽子语音信号时域信号的不同点。
(2)请录制两段音乐信号,期中一段为简单音乐信号,一段为和弦音乐信号。
比较时域波形的不同。
2、语音信号的频谱分析
在Matlab中,可以利用函数fft对信号进行快速傅立叶变换,得到信号的频谱特性,要求学生首先画出语音信号的时域波形,然后对语音信号进行频谱分析。
程序:
fs=44100;
[x,fs,Nbits]=wavread('C:
\Users\Administrator\Desktop\matlab\SW');
t=0:
1/44100:
(length(x)-1)/44100;
sound(x,fs);%对加载的语音信号进行回放
figure
(1)
plot(t,x)%做原始语音信号的时域图形
title('原始语音信号');
xlabel('timen');
ylabel('fuzhin');
n=length(x);%求出语音信号的长度
y1=fft(x,n);%傅里叶变换
w=1/n*[0:
n-1]*fs
figure
(2)
plot(w,abs(y1))%做原始语音信号的FFT频谱图
title('原始语音信号FFT频谱')
频谱分析对比:
简单音乐信号:
和弦音乐信号:
男生:
女生:
3、理解傅立叶变换的性质
(1)对信号进行时域的尺度变换,抽取与插值,观察期品与众频谱的变化,回放语音信号,体会时域语音信号变化(实现慢录快放和快录慢放功能)。
在Matlab中,函数sound可以对声音进行回放。
其调用格式:
sound(x,fs,bits);可以感觉滤波前后的声音变化。
程序:
[x,fs,Nbits]=wavread('C:
\Users\Administrator\Desktop\matlab\SW');
t=0:
1/fs:
(length(x)-1)/fs;
a=1
sound(x,a*fs);%对加载的语音信号进行回放
pause(3)
a=2
sound(x,a*fs);%对加载的语音信号进行快发
pause(3)
a=0.5
sound(x,a*fs);%对加载的语音信号进行慢放
(2)信号的调制与解调(负责板块)
语音信号与高频正弦载波相调制,比较其频谱变化,回放信号,比较是与众语音信号变化。
将调制后的信号进行解调,回放信号,比较时域中语音信号变化。
本次课程设计我主要负责的是对载波信号的调制解调部分。
1、所谓调制,就是在传送信号的一方将所要传送的信号附加在高频振荡上,再由天线发射出去。
这里高频振荡波就是携带信号的运载工具,也叫载波。
振幅调制,就是由调制信号去控制高频载波的振幅,直至随调制信号做线性变化。
在线性调制系列中,最先应用的一种幅度调制是全调幅或常规调幅,简称为调幅(AM)。
在频域中已调波频谱是基带调制信号频谱的线性位移;在时域中,已调波包络与调制信号波形呈线性关系。
设正弦载波为:
c(t)=Acos(
)
式中,A为载波幅度;
为载波角频率;
为载波初始相位(假设
=0).
调制信号(基带信号)为m(t)。
根据调制的定义,振幅调制信号(已调信号)一般可以表示为:
设调制信号
的频谱为
,则已调信号
的频谱we为
:
标准调幅波(AM)产生原理:
调制信号是只来来自信源的调制信号(基带信号),这些信号可以是模拟的,亦可以是数字的。
为首调制的高频振荡信号可称为载波,它可以是正弦波,亦可以是非正弦波(如周期性脉冲序列)。
载波由高频信号源直接产生即可,然后经过高频功率放大器进行放大,作为调幅波的载波,调制信号由低频信号源直接产生,二者经过乘法器后即可产生双边带的调幅波。
设载波信号的表达式为
,调制信号的表达式为
,则调幅信号的表达式为
2、解调
从高频已调信号中恢复出调制信号的过程称为解调(demodulation),又称为检波(detection)。
对于振幅调制信号,解调(demodulation)就是从它的幅度变化上提取调制信号的过程。
解调(demodulation)是调制的逆过程。
可利用乘积型同步检波器实现振幅的解调,让已调信号与本地恢复载波信号相乘并通过低通滤波可获得解调信号。
程序:
clear;
dt=1/44100;
fs=44100;
[f1,fs,nbits]=wavread('C:
\Users\Administrator\Desktop\matlab\SW');
figure
(1);
subplot(2,1,1);
N=length(f1);
t=0:
1/fs:
(N-1)/fs;
plot(t,f1);
title('信息信号的时域波形');
fy1=fft(f1);
w1=0:
fs/(N-1):
fs;
subplot(2,1,2);
plot(w1,abs(fy1));
title('信息信号的频谱');
f2=cos(22000*pi*t);
figure
(2);
subplot(2,1,1);
fy2=fft(f2);
N2=length(f2);
w2=fs/N*[0:
N-1];
plot(w2,abs(abs(fy2)));
title('载波信号的频谱');
f1=f1(:
1);
f3=f1'.*f2;
subplot(2,1,2);
fy3=fft(f3);
plot(w1,abs(abs(fy3)));
title('已调信号的频谱');
sound(f3,fs,nbits);
f4=f3.*f2;
figure(3);
subplot(1,1,1);
fy4=fft(f4);
plot(w1,abs(abs(fy4)));
title('解调信号频谱');
sound(f4,fs,nbits);
fp1=0;
fs1=5000;
As1=100;
wp1=2*pi*fp1/fs;
ws1=2*pi*fs1/fs;
BF1=ws1-wp1;
wc1=(wp1+ws1)/2;
M1=ceil((As1-7.95)/(2.286*BF1))+1;
N1=M1+1;
beta1=0.1102*(As1-8.7);
Window=(kaiser(N1,beta1));
b1=fir1(M1,wc1/pi,Window);
figure(4);
freqz(b1,1,512);
title('FIR低通滤波器的频率响应');
f4_low=filter(b1,1,f4);
plot(t,f4_low);
title('滤波后的解调信号时域波形');
sound(f4_low,fs,nbits);
f5=fft(f4_low);
figure(5);
subplot(1,1,1);
plot(w1,abs(f5));
title('滤波后的解调信号频谱')
4、设计数字滤波器和画出其频率响应给出各滤波器的性能指标
低通滤波器的性能指标:
fb=1000Hz,fc=1200Hz,As=100dB,Ap=1dB.
程序fs=48000;
[x,fs,Nbits]=wavread('C:
\Users\Administrator\Desktop\matlab\SW');
t=0:
1/48000:
(length(x)-1)/48000;
sound(x,fs);%对加载的语音信号进行回放
figure
(1)
plot(t/2,x)%做原始语音信号的时域图形
title('原始语音信号');
xlabel('timen');
ylabel('fuzhin');
n=length(x);%求出语音信号的长度
y1=fft(x,n);%傅里叶变换
w=1/n*[0:
n-1]*fs
figure
(2)
plot(abs(y1))%做原始语音信号的FFT频谱图
title('原始语音信号FFT频谱')
[x1,Fs,bits]=wavread('C:
\Users\Administrator\Desktop\matlab\RFS');
derta_Fs=Fs/length(x1);%设置频谱的间隔,分辨率,这里保证了x轴的点数必须和y轴点数一致
fs=Fs;
fp1=1000;
fs1=1200;
As1=100;
wp1=2*pi*fp1/fs;
ws1=2*pi*fs1/fs;
BF1=ws1-wp1;
wc1=(wp1+ws1)/2;
M1=ceil((As1-7.95)/(2.286*BF1))+1;%按凯泽窗计算滤波器阶数
N1=M1+1;
beta1=0.1102*(As1-8.7);
Window=(kaiser(N1,beta1));%求凯泽窗窗函数
b1=fir1(M1,wc1/pi,Window);%wc1/pi为归一化,窗函数法设计函数
figure(3);
freqz(b1,1,512);%[H,w]=freqz(B,A,N),
(1)中B和A分别为离散系统的系统函数分子、分母多项式的系数向量,返回量H则包含了离散系统频响在0~pi范围内N个频率等分点的值(其中N为正整数),w则包含了范围内N个频率等分点。
调用默认的N时,其值是512。
title('FIR低通滤波器的频率响应');
x1_low=filter(b1,1,x1);%对信号进行低通滤波,Y=filter(B,A,X),输入X为滤波前序列,Y为滤波结果序列,B/A提供滤波器系数,B为分子,A为分母
sound(x1_low,Fs,bits);
figure(4);
subplot(2,1,1);
plot(x1_low);
title('信号经过FIR低通滤波器(时域)');
subplot(2,1,2);
plot([-Fs/2:
derta_Fs:
Fs/2-derta_Fs],abs(fftshift(fft(x1_low))));
title('信号经过FIR低通滤波器(频域)');:
5、用滤波器对信号进行滤波
然后用自己设计的滤波器对采集到的信号进行滤波,画出滤波后信号的时域波形及频谱,并对滤波前后的信号进行对比,分析信号的变化。
6、提高部分要求
1)实现对声音信号放大和衰减功能
程序:
fs=22050;
[x,fs,Nbits]=wavread('C:
\Users\Administrator\Desktop\matlab\SW');
t=0:
1/22050:
(length(x)-1)/22050;%对加载信号的语音信号进行回放
a=1;
wavplay(a*x,fs);
fs=22050;
[x,fs,Nbits]=wavread('C:
\Users\Administrator\Desktop\matlab\SW');
t=0:
1/22050:
(length(x)-1)/22050;%对加载信号的语音信号进行回放
a=10;
wavplay(a*x,fs);
2)实现对录音内容倒放
程序:
fs=22050;
[x,fs,Nbits]=wavread('C:
\Users\Administrator\Desktop\matlab\SW');
t=0:
1/22050:
(length(x)-1)/22050;%对加载的语音信号进行回放
x=flipud(x)
wavplay(x,fs);
3)实现混音音效效果
程序:
closeall
clearall
[y,fs]=wavread('C:
\Users\Administrator\Desktop\matlab\SW');%打开音频文件(格式为wav的音频文件),所得y为采样数据,fs为采样率
time=(1:
length(y))/fs;%时间轴的向量【(length(y))/fs即为音频文件播放的时间长度】
subplot(3,1,1);
plot(time,y);%画出时间轴上的波形
title('SW的声音');
%sound(y,fs)
[y6,fs6]=wavread('C:
\Users\Administrator\Desktop\matlab\YWX');%打开音频文件(格式为wav的音频文件),所得y为采样数据,fs为采样率
time6=(1:
length(y6))/fs6;%时间轴的向量【(length(y))/fs即为音频文件播放的时间长度】
subplot(3,1,2);
plot(time6,y6);%画出时间轴上的波形
title('YWX的声音');
%sound(y6,fs6)
%下面将两个音频叠加在一块
[m,n]=size(y);%查看y的大小,【此处y是m行,n列的数据】
[m6,n6]=size(y6);%查看y6的大小,【此处y6是m6行,n6列的数据】
z=zeros(max(m,m6)-min(m,m6),n);%生成0矩阵,用于加在时间较短的那么音频的后面
iflength(y)y1=[y;z];
y8=y1+y6;
sound(y8,fs)
elsey1=[y6;z];
y8=y1+y;
sound(y8,fs)
end;
%%%%wavwrite(y8,fs,'111');%保存合成的音频信号,文件夹在matlab--bin
4)实现回音音效效果
程序:
[x,fs,bits]=wavread('C:
\Users\Administrator\Desktop\matlab\YWX');%读取语音信号?
?
n1=0:
2000;
b=x(:
1);%产生单声道信号?
N=3;
yy2=filter(1,[1,zeros(1,80000/(N+1)),0.7],[b',zeros(1,40000)]);%IIR滤波器进行滤波?
figure(3)
subplot(2,1,1);plot(yy2);%三次回声滤波器时域波形?
title('三次回声滤波器时域波形');
YY2=fft(yy2);%对三次回声信号做FFT变换?
?
subplot(2,1,2);plot(n1(1:
1000),YY2(1:
1000));%三次回声滤波器频谱图?
title('三次回声滤波器频谱图?
');
figure(4)
subplot(2,1,1);plot(abs(YY2));%经傅里叶变换之后的信号的幅值?
title('幅值');
subplot(2,1,2);plot(angle(YY2));%经傅里叶变换之后的信号的相位?
title('相位');
sound(5*yy2,fs,bits);%经三次回声滤波器后的语音信号,乘以5是为了加强信号?
5)实现男女变声音音效效果
6)设计系统界面
为了使编制的程序操作方便,设计处理系统的用户界面,在所设计的系统界面上可以选择滤波器类型,输入滤波器的参数、现实滤波器的频率响应,选择信号等。
3、心得体会
这次MATLAB的课程设计就快结束了,在为期一周的时间里,从未接触过MATLAB与数字信号处理,到与组员们合力完成老师的任务,一切都很值得。
因为由于之前没有接触过这方面的知识,大部分都是在网上找资料,找到许多有用的,当然也有很多有瑕疵的资料,在这么多的资料里,我们从一开始的盲目抄录到发现问题,并且会适当地修正最终得到能用的程序,大家都在一步步地进步。
这次有幸当了组长,组员们对于分配的任务能够有效率地完成,并且帮助还没有完成的同学,我觉得这点很可取,尽管中间有些不愉快的小插曲,但是组员们都是真心为了我们组能够顺利高效完成任务,所有人都在尽力。
中间遇到许多不懂的地方,老师、同学都给了我们很大的帮助。
对于一个课程设计,能够完成任务,做出一些东西固然很重要,但我认为更重要的是我们能够在课程设计中学会如何与人合作,如何在拿到一个自己不熟悉有时甚至是没有接触过的情况下做出东西,这种能力对我们以后的工作学习有很大的帮助。
这次的课程设计对大家是挑战也是一种帮助。
此次课程设计中也存在一些问题,主要是自己不熟悉很多方面便懒得去深入探究,希望今后在了解相关知识后能够有会更出色的表现。