数字信号处理课程设计.docx
《数字信号处理课程设计.docx》由会员分享,可在线阅读,更多相关《数字信号处理课程设计.docx(32页珍藏版)》请在冰豆网上搜索。
数字信号处理课程设计
《数字信号处理课程设计》
课程总结报告
题目
运用matlab的数字音效处理系统设计
学院
电子信息工程学院
专业
通信工程
姓名
赵亚
学号
P2*******
队员
吴双胜程勇
2015年12月21日
安徽大学电子学院通信工程系
1、设计的目的和意义
1.1设计的目的和意义
现在随着时代的发展,人类已开始进入了信息化时代,用现代手段研究语音信号,使人们能更加有效地产生、传输、存储、获取和应用语音信息,这对于促进社会的发展具有十分重要的意义。
学习了数字信号处理以及相关课程,就想自己动手做一段音频处理,来锻炼自己的动手能力,把知识学以致用。
一般的录音是单声道的,放音时也是由一个扬声器发出声音,感觉不到立体感,因此就需要我们对声音进行处理,使得声音信号在平时听起来也可以产生立体感。
综合所学的数字信号处理知识,利用MATLAB语言编程进行单回声、多回声、混音和和声的设计,并对处理后的信号进行频谱分析,实现的单回声、多回声、混音及和声的产生。
同时通过处理音乐,我们也能更加的了解编码,熟悉运用MATLAB软件来处理音乐、声音,并熟悉数字信号处理方面的理论知识。
1.2关于MATLAB软件:
1.MATLAB语言具备高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来;
2.具有完备的图形处理功能,实现计算结果和编程的可视化;
3.友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握;
4.功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等),为用户提供了大量方便实用的处理工具。
1.3课题要求
1.课题要求
(1).录制采集一段自己的语音信号;
(2).设计滤波器,实现单回声、多回声、混响效果和和声效果;
2、实现方案
2.1总体方案
首先,对原始的音频信号进行频谱分析;然后通过数字信号处理对原声信号进行延时,衰减,产生单回声信号及多回声信号,通过图形与原声信号进行比较。
混响效果主要是用于增加音源的融合感。
自然音源的延时声阵列非常密集、复杂,所以模拟混响效果也复杂多变。
声音在一个密闭的控件到达听众时,包含直达声、早期的反射和混响几部分。
早期的反射有几个空间上临近的直达声的基本延迟和衰减组成,而混响则有密集的回声组成。
当振幅有少量变换并声音之间有很少的时间差别时,会产生和声效果。
延时可用如下函数实现:
注意:
在时刻n处
的值通常是一个非整数值,在实际视线中,输出样本值需要用到内插法进行计算。
2.2设计流程图
打开界面选择功能
原信号分析
输出原信号分析波形
原信号取样
设计一个FIR滤波器,进行延时及衰减处理,得到回声信号。
频谱分析,绘出信号的频谱图以及时域波形
单回声
设计一个IIR滤波器,进行延时及衰减处理,得到回声信号。
将每一级回声相对于上一级回声一次衰减和延时R个周期
频谱分析,绘出信号的频谱图以及时域波形
多回声
设计全通滤波器,进行延时和叠加,达到混响效果。
频谱分析,绘出信号的频谱图以及时域波形
混响
设计滤波器,把原信号进行不同延迟和衰减,叠加达到和声效果。
频谱分析,绘出信号的频谱图以及时域波形
和声
1.通过计算机中的y=fft(x)傅里叶变换,对原声信号和回声信号进行频谱分析。
2.通过设计FIR、IIR滤波器对原声信号进行衰减、延时产生一次、多次(次数可通过N改变,此处以三次为例)。
三、设计原理
3.1回声部分设计原理
回声的定义:
当声音投射到距离声源有一段距离的大面积上时,声能的一部分被吸收,而另一部分声能会被反射会俩,如果听者听到由声源直接发出的声和反射回来的声的时间间隔超过1/10秒,就能分辨这是两个声音,将返回的声音成为“回声”。
1、单回声滤波器:
回声可以由简单的延时单元产生。
直达声和在R抽样周期后出现的一种单个回音可以用FIR滤波器产生。
微分方程为:
y(n)=x(n)+αx(n-R)
该差分方程的系统函数可表示为:
H(z)=1+
传递函数的幅频响应形状像梳子,这种滤波器又叫做梳状滤波器
此滤波器为FIR滤波器,其结构图如下:
α
图2.2FIR滤波器结构
2、多重回声滤波器:
为了产生以间隔R个抽样周期分开的具有指数衰减振幅的多重回声,可用一个以下形式传输函数的IIR滤波器:
无限个振幅以指数衰减间隔为R个抽样周期的多重回声可用以下形式传输函数的IIR滤波器生成:
IIR滤波器结构图:
图2.3IIR滤波器结构图
3.2混响部分设计原理
混响则有密集的回声组成。
上述多重回声滤波器不能提供自然声音混响。
有其幅频特性可知其幅度响应对于所有频率不是常数,不能达到应产生的效果。
为了产生更真实的混响效果,采用全通结构的混响器器,其传输函数为:
3.3和声部分设计原理
和声是对原始信号进行不同程度的衰减和延时,最后这些信号和原信号进行叠加会产生和声效果。
延时可用如下函数实现:
四、设计过程
4.1设计方案
1.读取语音信号与回放
一段合适的原声信号,用“[x,fs]=audioread('d:
\v4.mp3');”来读取录制好的语音信号,这是以采样频率fs来读取语音,并将采样信号值放入x中。
用sound(x,fs)对声音信号进行回放。
2.傅里叶变换FFT
傅里叶变换调用格式:
y=fft(x)
其中,x是序列,y是序列的FFT,x可以为一向量或矩阵,若x为一向量,y是x的FFT。
且和x相同长度。
若x为一矩阵,则y是对矩阵的每一列向量进行FFT。
如果x长度是2的幂次方,函数fft执行高速基-2FFT算法;否则fft执行一种混合基离散傅里叶变换算法,计算速度大较慢。
3.函数filter
函数filter的调用格式为:
y=filter(b,a,x)
该格式采用数字滤波器对数据进行滤波,既可以用于IIR滤波器,也可以用于FIR滤波器。
其中向量b和a分别表示系统函数的分子、分母多项式的系数,若a=1,此时表示FIR滤波器,否则就是IIR滤波器。
该函数是利用给出的向量b和a,对x中的数据进行滤波,结果放入向量y。
4.函数zearos
函数的一种调用格式为:
B=zeros(n)
返回一个n*n的矩阵,其元素都为0,如果参数n不是一个标量就会报错。
函数的另一种调用格式为:
B=zeros(m,n)或B=zeros([mn])
返回一个m*n的零矩阵。
函数的另一种调用格式为:
B=zeros(m,n,p,...)或B=zeros([mnp...])
返回一个m*n*p*...的零矩阵。
注意:
参数m,n,p都是非负整数,负整数都会看成0。
4.2实验程序
4.2.1原始信号分析
读取一段语音信号,画出其时域波形图,用fft对语音信号进行傅里叶变换,并画出其相位与幅值。
(1)实验程序:
[x,fs]=audioread('d:
\v4.mp3');
x=x(:
1);
n1=0:
2000;
N=size(x,1);
figure
(1);
subplot(2,1,1);
plot(x);
title('原始信号的时域波形');
Y=fft(x);
subplot(2,1,2);
plot(n1(1:
1000),Y(1:
1000));
title('原始信号的频谱图');
figure
(2);
subplot(2,1,1);
plot(abs(Y));
title('幅值');
subplot(2,1,2);
plot(angle(Y));
title('相位');
sound(x,fs);
(2)实验结果
4.2.2回声信号的产生
对原始信号取出单声道信号,并用filter函数对其进行衰减和延时,得到回声信号。
1、FIR滤波器产生一次回声
(1)实验程序:
[x,fs]=audioread('d:
\v4.mp3');
R=5000;
n1=0:
2000;
num=[1,zeros(1,R-1),0.8];
den=[1];
y=filter(num,den,x);
figure
(1);
subplot(2,1,1);
plot(y);
title('单回声后信号时域波形');
y1=fft(y);
subplot(2,1,2);
plot(n1(1:
1000),y1(1:
1000));
title('单回声后信号频谱图');
figure
(2);
subplot(2,1,1);
plot(abs(y1));
title('单回声后信号幅值');
subplot(2,1,2);
plot(angle(y1));
title('单回声后信号相频响应');
sound(y,fs);
(2)实验结果:
2.IIR滤波器产生多次回声:
yy2=filter(1,[1,zeros(1,80000/(N+1)),0.7],[b’,zeros(1,40000)]);通过改变的N的数值可设置回声的次数,
(1)实验程序:
[x,fs]=audioread('d:
\v4.mp3');
N=3;
a=0.8;
R=5000;
n1=0:
2000;
num=[1,zeros(1,N*R-1),0.8^N];
den=[1,zeros(1,N*R-1),0.8];
z=filter(num,den,x);
figure
(1);
subplot(2,1,1);
plot(z);
title('多回声后信号时域波形');
z1=fft(z);
subplot(2,1,2);
plot(n1(1:
1000),z1(1:
1000));
title('多回声后信号频谱图');
figure
(2);
subplot(2,1,1);
plot(abs(z1));
title('多回声后信号幅频响应');
subplot(2,1,2);
plot(angle(z1));
title('多回声后信号相频响应');
sound(z,fs);
(2)实验结果:
4.2.3混响的产生
在整理资料时发现,其中对原信号的读取位数大小和FFT变换的点数都会影响其频谱图。
(1)实验程序:
[x,fs]=audioread('d:
\v4.mp3');
N1=3;
a1=0.6;
R1=2000;
n1=0:
2000;
num1=[1,zeros(1,N1*R1-1),0.6^N1];
den1=[1,zeros(1,R1-1),0.6];
p1=filter(num1,den1,x);
N2=4;
a2=0.7;
R2=2000;
num2=[1,zeros(1,N2*R2-1),0.7^N2];
den2=[1,zeros(1,R2-1),0.7];
p2=filter(num2,den2,x);
p3=p1+p2;
a8=0.8;
R8=1100;
num11=[0.8,zeros(1,R8-1),1];
den11=[1,zeros(1,R8-1),0.8];
p4=filter(num11,den11,p3);
y=x+p4;
[h1,w1]=freqz(num1,den1);
[h2,w2]=freqz(num2,den2);
[h3,w3]=freqz(num11,den11);
H=(h1+h2).*h3;
figure
(1);
subplot(2,1,1);
plot(y);
title('混响时域波形');
y1=fft(y);
subplot(2,1,2);
plot(n1(1:
1000),y1(1:
1000));
title('混响频谱图');
figure
(2)
subplot(2,1,1);
H1=fft(y);
plot(abs(H1));
title('混响信号幅频响应');
subplot(2,1,2);
plot(angle(H1));
title('混响信号相频响应');
sound(y,fs);
(2)实验结果:
4.2.4和声的产生
和声是对原始信号进行不同程度的衰减和延时,最后这些信号和原信号进行叠加产生的:
(1)实验程序:
[x,fs]=audioread('d:
\v4.mp3');
x1=x(1:
526463);
N=length(x);
fori=1:
N;
w1=2*pi;
a1=0.6;
R1=800;
D1=R1/2*(1-cos(w1*i)/fs);
DC1=ceil(D1);
if(D1<=(i-1));
y1(i)=a1*(x(i-DC1)+(x(i-DC1+1)-x(i-DC1))*(DC1-D1));
end
end
N=length(x);
fori=1:
N;
w2=2*2*pi;
a2=0.5;
R2=600;
D2=R2/2*(1-cos(w2*i)/fs);
DC2=ceil(D2);
if(D2<=(i-1));
y2(i)=a2*(x(i-DC2)+(x(i-DC2+1)-x(i-DC2))*(DC2-D2));
end
end
fori=1:
N;
w3=2*3*pi;
a3=0.7;
R3=750;
D3=R3/2*(1-cos(w3*i)/fs);
DC3=ceil(D3);
if(D3<=(i-1));
y3(i)=a3*(x(i-DC3)+(x(i-DC3+1)-x(i-DC3))*(DC3-D3));
end
end
y4=x1+y2+y3;
sound(y4,fs);
figure
(1)
subplot(2,1,1);
Y=fft(y4);
plot(abs(Y));
title('和声幅频');
subplot(2,1,2);
plot(angle(Y));
title('和声相频');
sound(y4,fs);
(2)实验结果:
4.4.5简易的界面设计
4.5实验结果分析
通过实验得到的频谱图分析发现,多重回声效果叫单回声效果更加明显,如果延时调试得当,会得到更好的回声效果,混响较前两者更加明显,和声的效果由于叠加的声音较少导致效果不明显,但可以分辨出和声效果与会声效果的区别。
(完整程序代码见附录一)
五、设计总结
本次DSP课程设计,我主要做的是混响部分的设计。
通过编程与GUI界面的实现,完成回声信号产生器的基本功能与混响、和声功能的实现。
通过实验得到的频谱图分析发现,多重回声效果较单回声效果更加明显,如果延时得当,会得到很好的回声效果,产生类似在演唱会现场的效果,自然混响的效果则较前两个更加明显,和声的效果由于人数较少不太明显,但能确实的分辨出和声效果与回声效果的区别。
5.1课程设计的可取之处:
1.回声信号产生器可设置N的值自主选择产生多少次的回声,并且可设置回声的延时时长。
2.可对声音信号进行不同的混响及和音效果。
5.2课程设计的不足
1.回声信号采用点增多,执行程序时间过长,在GUI演示时已经体现出来
2.GUI界面插入背景图片会影响下静态文本框界面,因而造成不太美观
5.3编程中遇到的问题
1.之前并没有接触过matlab这个软件,所以从软件的安装到后期的编程都学习了很多的知识,包括从图书馆借的书和利用网络资源进行学习。
2.分析声音信号时,要注意选择单声道信号进行分析。
由于起初并没有进行选择,出现了很多问题。
至于单声道问题,我觉得应该是对信号的收集是单边调制的缘故。
3.在读取语音信号程序中,用”[x,fs,bits]=wavread(‘y’,[140000])”读取出现音频读不全的现象,后来改动数值40000读取的声音更多,但后来又读取较长音频文件时发现仍不能完全读出,所以后来就缺省采样位数[140000],最终实现了声音的完美呈现。
六、收获与感受
通过实验,是我对MATLAB有了一个基础的了解,在学习MATLAB编程中需要很多的参考书,要尽量多的熟悉matlab自带的函数及其作用,因为matlab的自带函数特别多,基本上能够满足一般的数据和矩阵的计算,所以基本上不用你自己编函数。
这一点对程序非常有帮助,可以使程序简单,运行效率高,可以节省很多时间。
本次课设中用了很多MATLAB自带的函数,使程序变得很简单而有效。
在编程的过程中学习,程序需要什么知识再去补充,编程是一点一点积累的,所以需要做一些随手笔记什么的。
课题需要什么函数,需要什么模块就应该去着重看那个知识点,就应该一步一步学,如果太急于把所有东西都学到,也是不好的,更是实现不了的。
总之,通过这次学习,我了解了一下这个软件总体的功能,以及通过自己编写一些代码也学到了一些用法和知识。
我相信通过不时的积累,我会慢慢的学会使用MATLAB。
七、参考文献
[1]《数字信号处理》,朱军,合肥工业大学出版社
[2]《MATLAB6.5及其在信号处理中的应用》王宏,清华大学出版社,2004
[3]《数字信号处理教程[M]》,程佩青,清华大学出版社,2002
附录一
functionvarargout=cy(varargin)
%CYMATLABcodeforcy.fig
%CY,byitself,createsanewCYorraisestheexisting
%singleton*.
%
%H=CYreturnsthehandletoanewCYorthehandleto
%theexistingsingleton*.
%
%CY('CALLBACK',hObject,eventData,handles,...)callsthelocal
%functionnamedCALLBACKinCY.Mwiththegiveninputarguments.
%
%CY('Property','Value',...)createsanewCYorraisesthe
%existingsingleton*.Startingfromtheleft,propertyvaluepairsare
%appliedtotheGUIbeforecy_OpeningFcngetscalled.An
%unrecognizedpropertynameorinvalidvaluemakespropertyapplication
%stop.Allinputsarepassedtocy_OpeningFcnviavarargin.
%
%*SeeGUIOptionsonGUIDE'sToolsmenu.Choose"GUIallowsonlyone
%instancetorun(singleton)".
%
%Seealso:
GUIDE,GUIDATA,GUIHANDLES
%Edittheabovetexttomodifytheresponsetohelpcy
%LastModifiedbyGUIDEv2.521-Dec-201520:
51:
55
%Begininitializationcode-DONOTEDIT
gui_Singleton=1;
gui_State=struct('gui_Name',mfilename,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@cy_OpeningFcn,...
'gui_OutputFcn',@cy_OutputFcn,...
'gui_LayoutFcn',[],...
'gui_Callback',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
%Endinitializationcode-DONOTEDIT
%---Executesjustbeforecyismadevisible.
functioncy_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstocy(seeVARARGIN)
%Choosedefaultcommandlineoutputforcy
handles.output=hObject;
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakescywaitforuserresponse(seeUIRESUME)
%uiwait(handles.figure1);
%---Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=cy_OutputFcn(hObject,eventdata,handles)
%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Getdefaultcommandlineoutputfromhandlesstructure
varargout{1}=handles.output;
%---Executesonbuttonpressinpushbutton1.