1、中北大学课 程 设 计 说 明 书学生姓名: 学 号: 学生姓名: 学 号: 学生姓名: 学 号: 学 院: 信息与通信工程学院 专 业: 电子信息工程 题 目:信息处理实践: 语言信号的合成 指导教师: 杨 娜 职称: 副教授 2016 年 1 月 3 日中北大学课程设计任务书15/16 学年第 一 学期学 院: 信息与通信工程学院 专 业: 电子信息工程 学生姓名: 学 号: 学生姓名: 学 号: 学生姓名: 学 号: 课程设计题目:信息处理实践: 语言信号的合成 起 迄 日 期: 2016 年 1 月 4 日2016 年 1 月 22 日 课程设计地点: 201,503,1 号楼教室 指
2、 导 教 师: 杨 娜 系 主 任: 王浩全 下达任务书日期: 2016 年 1 月 3 日课 程 设 计 任 务 书1设计目的:通过本次课程设计使学生掌握信息处理理论的相关知识。通过具体的设计问题将理论与实践相结合,培养学生运用所学独立解决问题的能力。(1)了解信号的读取、保存、截取、拼接等技术。(2)了解 MATLAB 的信号处理技术。(3)掌握 MATLAB 实现语音信号的读取、保存、拼接。2设计内容和要求(包括原始数据、技术参数、条件、设计要求等):(1)利用 windows 的录音机或其他外部设备获取两种或两种以上音乐信号,并将信号进行转换和存储。(2)自行截取各采集信号中的一段进行
3、信号的拼接。(3)保存拼接后的音乐信号,并进行播放证实存储的正确性。3设计工作任务及工作量的要求包括课程设计计算说明书(论文) 、图纸、实物样品等:(1)要求设计组的每个成员都要了解设计的要求和思路;(2)编写详细的设计说明书三份;(3)要求有正确的运行结果及结果分析。I课 程 设 计 任 务 书4主要参考文献:1程佩青. 数字信号处理教程. 北京:清华大学出版社,20022刘敏,魏玲. Matlab 通信仿真与应用. 北京:国防工业出版社,20013高政. 信号处理与系统分析. 北京:中国水利水电出版社,20014俞一彪,孙兵. 数字信号处理理论与应用. 南京:东南大学出版社,20005数字
4、信号处理 孙洪等译 电子工业出版社 6精通 MATLAB6.5 版 张志涌等编著 北京航空航天大学出版社 7 MATLAB 扩展编程 何强 何英 编著 清华大学出版社 8数字信号处理教程 程佩青编著 清华大学出版社5设计成果形式及要求:(1)提供详细的设计说明书三份;(2)提供详细数据及分析结果。6工作计划及进度:2007 年 6 月 25 日 2007 年 7 月 1 日:查资料2007 年 7 月 2 日 7 月 5 日:在指导教师指导下设计方案及程序7 月 6 日 7 月 10 日:学生上机调试程序,指导教师辅导7 月 11 日 7 月 12 日:完成课程设计说明书7 月 13 日:答辩
5、系主任审查意见:签字: 年 月 日II目 录摘 要.(1)1.MATLAB 简介.(1)2.GUI 简介.(1)1. 设计方案.2设计步骤及结果1.语音信号的采集2.语音信号的截取.3.语音信号的合成.4.合成语音的验证.5.GUI 界面设计及实现.3设计评述参考文献附 录0摘 要语音信号处理是一门比较实用的电子工程专业课程,语音是人类获取信息的的重要来源和利用信息的重要手段。通过语言相互传递信息是人类最重要的基本功能之一。语音信号是一种非平稳的时变信号,它携带着各种信息。在语音编码、语音合成、语音识别和语音增强等语音处理中无一例外需要提取语音中包含的各种信息。 Matlab 是一个数据分析和
6、处理功能十分强大的工程实用软件。本文介绍了利用 matlab 软件及其中的图形用户界面 (GUI)实现驱动声卡采集语音信号和语音信号采集后的文档处理方法,并通过实例利用 matlab 分析了语音信号处理的过程。关键词:语音信号处理 MATLAB 频谱分析 语音合成1.MATLAB 简介MATLAB 是美国 Math Works 公司推出的一种面向工程和科学计算的交互式计算软件,它以矩阵运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式工作环境中。同时由于 MATLAB 是一个数据分析和处理功能十分强大的工程实用软件,它的信号处理与分析工具箱为语音信号分析提供了十分丰富的功能函数,
7、利用这些功能函数可以快捷而又方便地完成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。2.GUI 简介GUIDE 是 Graphic User Interface Design Environment 的简称。它是一个设计图形用户界面的集成开发环境。它使得图形对象的生成和管理变得简单、直接。在 MATLAB 的命令窗口中输入 guide 命令,即可开启 GUIDE 的主界面 图形用户界面(GUI)是包含图形的对象,如:窗口、图标、菜单和文本的用户界面。12一设计方案图 1-1 总体设计方案图 1-2 具体运行流程图本实验通过应用 MATLAB 软件实现声音信号的采集、截取、拼接与结果
8、分析。分析和处理音频信号,首先要对声音信号进行采集,MATLAB 的数据采集工具箱提供了一整套命令和函数,通过调用这些函数和命令,可直接控制声卡进行数据采集。Windows 自带的录音机程序也可驱动声卡来采集语音信号,并能保存为WAV 格式文件,供 MATLAB 相关函数直接读取、写入或播放。本实验以 WAV 格式音频信号作为分析处理的输入数据,用 MATLAB 处理音频信号的基本流程是:先将 WAV 格式音频信号经过 wavread 函数转换成 MATLAB 列数组变量;再用MATLAB 强大的运算能力进行数据分析和处理,如时域分析、频域分析、数字滤信号采集男声录入时频分析提取信号提取信号时
9、频分析女声录入信号的合成分析处理信号截取 信号拼接 语音验证3波、信号合成、信号变换、识别和增强等等;处理后的数据如是音频数据,则可用 wavwrite 转换成 WAV 格式文件或用 sound 函数直接回放。二设计步骤及结果1.语音信号的采集首先利用 windows 下的录音机,录制一段信号,时间控制在 10 秒左右,然后将音频文件保存“yuan1.wav”、“yuan2.wav”。再在 MATLAB 软件平台下,利用函数 audioread 对语音信号进行采样,记住采样频率和采样点数。然后进行语音信号的分析,首先画出语音信号的时域波形图,并利用 fft 画出频域图。参数设定:采样频率 88
10、060Hz,采样时间 10s,作 88060 点 fft。程序如下:fs=88060; %采样频率 x1=audiorecorder(fs,16,1);recordblocking(x1,10);%10 秒y1 = getaudiodata(x1);subplot(2,2,1);plot(y1);title(男声录入波形图);xlabel(样本数);ylabel(幅值);Y1=fft(y1);subplot(2,2,3);plot(abs(Y1);title(男声录入频谱图);xlabel(Freq/HZ);ylabel(幅值);filename= yuan1.wavaudiowrite(fi
11、lename,y1,fs);4x2=audiorecorder(fs,16,1);recordblocking(x2,10);y2 = getaudiodata(x2);subplot(2,2,2);plot(y2);title(女声录入波形图);xlabel(样本数);ylabel(幅值);Y2=fft(y2);subplot(2,2,4);plot(abs(Y2);title(女声录入频谱图);xlabel(Freq/HZ);ylabel(幅值);filename= yuan2.wavaudiowrite(filename,y2,fs);结果如下:5图 2-1 采集信号波形和频谱图图 2-
12、2 生成原始信号文件2.语音信号的截取自行设定截取起始时间和结束时间,对原始信号进行截取,并将截取后的数据保存为 wav 格式文件;再对截取后的信号波形图显示。程序如下:%截取信号sec1= 2 %剪切开始的时间sec2= 5 %剪切结束的时间filename=yuan1.wavn1,F=audioread(filename);n1_new=n1(F*sec1+1):F*sec2),:);subplot(1,2,1);plot(n1_new);title(截取男声波形图);xlabel(样本数);ylabel(幅值);filename=yuan1new.wavaudiowrite(filena
13、me,n1_new,F); filename=yuan2.wavn2,F=audioread(filename);n2_new=n2(F*sec1+1):F*sec2),:);subplot(1,2,2);plot(n2_new);title(截取女声波形图);6xlabel(样本数);ylabel(幅值);filename=yuan2new.wavaudiowrite(filename,n2_new,F);结果如下:图 2-3 截取信号的波形图对比图 2-1,可以发现截取信号的波形正是图 2-1 波形中设定截取的一段。图 2-4 生成截取信号文件3.语音信号的合成按照设计要求将截取的语音信号
14、进行拼接,并保存在新的 wav 文件中。但7设计过程中发现单纯的拼接信号,在拼接处会给听者极大的突兀感,所以在设计中加入信号的延迟混响,以达到减少突兀感,使语音过渡更加平滑。合成后,生成波形和频谱图进行分析。所谓延迟混响,就是在各自截取段的基础上,对第一段的末尾进行延时补零,再对第二段的开头进行延时补零,在此基础上采取部分相加的方法实现该时段内的混响,延长的时长设定在 0.1s,混响的时间取在 1s。程序如下:sec1= 2 %剪切开始的时间sec2= 5 %剪切结束的时间filename= yuan1new.wavnew1,F=audioread(filename);filename= yu
15、an2new.wavnew2,F=audioread(filename);n_1=new1(sec2-sec1-1)*F:(sec2-sec1)*F);n_2=new2(1:F);j=10;z1=n_1;zeros(F/j,1);z2=zeros(F/j+1,1);n_2;z=z1+z2;new3(1:(sec2-sec1-1)*F)=new1(1:(sec2-sec1-1)*F);new3(sec2-sec1-1)*F:(sec2-sec1+1/j)*F)=z;new3(sec2-sec1+1/j)*F-1:(2*(sec2-sec1)-1+1/j)*F)=new2(F:(sec2-sec1
16、)*F);subplot(1,2,1);plot(new3);title(合成波形图);xlabel(样本数);ylabel(幅值);N1=fft(new3);subplot(1,2,2);plot(abs(N1);8title(合成频谱图);xlabel(Freq/HZ);ylabel(幅值);filename= hecheng.wavaudiowrite(filename,new3,F);结果如下:图 2-5 合成信号波形与频谱图对比图 2-3,可看出波形大致为两个阶段信号的拼接合成。图 2-6 生成合成信号文件4.合成语音的验证通过 sound 函数实现在 matlab 在直接听取截取段
17、的语音和合成之后的录音。程序如下:filename=yuan1new.wavyan1,F=audioread(filename);9sound(yan1,F)filename=yuan2new.wavyan2,F=audioread(filename);sound(yan2,F)filename=hecheng.wavyan3,F=audioread(filename);sound(yan3,F);5.GUI 界面设计及实现考虑到系统的实现目的是为了让用户有更好的体验,借助于 matlab 的图形用户界面(以下成为 GUI),做出完整的用户界面来完成本次课程设计。由于程序部分较长,详细程序见附
18、录,此处只展示结果。结果如下:图 2-7 GUI 设计界面10图 2-8 最终结果实现界面三设计评述通过本次课程设计,我学会了使用 MATLAB 分析连续时间信号的频谱,能够基本运用了 MATLAB 的图形用户界面(GUI)编程。实验之初由于对课题和相关知识理解不深,因而设计起来很困难。通过查阅相关书籍,同学之间相互讨论以及询问老师,我理解并掌握了课题的实质。由于之前很少接触 MATLAB 软件, MATLAB 中的许多函数,如 fft,plot,subplot,abs 等用起来比较吃力。通过老师的讲解以及下课后自己对 MATLAB 的学习,我基本可运用 MATLAB 软件做一些简单的程序来看
19、信号的频谱或各种信号的波形。通过分析连续时间信号的频谱,使我更加深入的理解了书本上的知识。要真正熟练运用 MATLAB 还要靠自己多学习和使用。而且在写 MATLAB 程序时不能马虎,否则程序很容易出错,这培养了自己的细心和耐心。通过不断使用 MATLAB,我发现并解决了很多问题,使我更加了解 MATLAB。课程设计虽然是一门专业课,但是通过课设使我专业知识得到了丰富,专业技能上的提升。这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在谢老师和林老师的辛勤指导下,终于迎刃而解。同时,在老师的身上我学得到很多实用的知识,在此我表示感谢!同时,对给过我帮助的所有同学和各11位指导老师再
20、次表示衷心的感谢!参 考 文 献1程佩青. 数字信号处理教程. 北京:清华大学出版社,20022刘敏,魏玲. Matlab 通信仿真与应用. 北京:国防工业出版社,20013高政. 信号处理与系统分析. 北京:中国水利水电出版社,20014俞一彪,孙兵. 数字信号处理理论与应用 . 南京:东南大学出版社,20005数字信号处理 孙洪等译 电子工业出版社 6精通 MATLAB6.5 版 张志涌等编著 北京航空航天大学出版社 7MATLAB 扩展编程 何强 何英 编著 清华大学出版社 8数字信号处理教程 程佩青编著 清华大学出版社12附 录GUI 设计界面程序如下:function varargo
21、ut = shiyan1(varargin)% SHIYAN1 MATLAB code for shiyan1.fig% SHIYAN1, by itself, creates a new SHIYAN1 or raises the existing% singleton*.% H = SHIYAN1 returns the handle to a new SHIYAN1 or the handle to% the existing singleton*.% SHIYAN1(CALLBACK,hObject,eventData,handles,.) calls the local% funct
22、ion named CALLBACK in SHIYAN1.M with the given input arguments.% SHIYAN1(Property,Value,.) creates a new SHIYAN1 or raises the% existing singleton*. Starting from the left, property value pairs are% applied to the GUI before shiyan1_OpeningFcn gets called. An% unrecognized property name or invalid v
23、alue makes property application% stop. All inputs are passed to shiyan1_OpeningFcn via varargin.% *See GUI Options on GUIDEs 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 shiyan1% Last
24、Modified by GUIDE v2.5 14-Jan-2016 09:18:41% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct(gui_Name, mfilename, .gui_Singleton, gui_Singleton, .gui_OpeningFcn, shiyan1_OpeningFcn, .gui_OutputFcn, shiyan1_OutputFcn, .gui_LayoutFcn, , .gui_Callback, );if nargin end13if na
25、rgoutvarargout1:nargout = gui_mainfcn(gui_State, varargin:);elsegui_mainfcn(gui_State, varargin:);end% End initialization code - DO NOT EDIT% - Executes just before shiyan1 is made visible.function shiyan1_OpeningFcn(hObject, eventdata, handles, varargin)% This function has no output args, see Outpu
26、tFcn.% 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 shiyan1 (see VARARGIN)% Choose default command line output for shiyan1handles.output = hObject;% Update ha
27、ndles structureguidata(hObject, handles);% UIWAIT makes shiyan1 wait for user response (see UIRESUME)% uiwait(handles.figure1);% - Outputs from this function are returned to the command line.function varargout = shiyan1_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning outp
28、ut 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 structurevarargout1 = handles.output;% - Executes on button press in pushbutt
29、on1.function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)fs=88060; %采样频率 sd =get(handles.edit1,string);14sheding=str2double(sd)
30、 x1=audiorecorder(fs,16,1);recordblocking(x1,sheding);%8 秒y1 = getaudiodata(x1);axes(handles.axes1); plot(y1);title(男声录入波形图);xlabel(样本数);ylabel(幅值);Y1=fft(y1);axes(handles.axes4); plot(abs(Y1);title(男声录入频谱图);xlabel(Freq/HZ);ylabel(幅值);filename= yuan1.wavaudiowrite(filename,y1,fs);guidata(hObject, ha
31、ndles);% - Executes on button press in pushbutton2.function pushbutton2_Callback(hObject, eventdata, handles)% hObject handle to pushbutton2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)fs=88060; %采样频率 sd =get
32、(handles.edit1,string);sheding=str2double(sd) x2=audiorecorder(fs,16,1);recordblocking(x2,sheding);y2 = getaudiodata(x2);axes(handles.axes5);plot(y2);title(女声录入波形图);xlabel(样本数);ylabel(幅值);Y2=fft(y2);axes(handles.axes6);plot(abs(Y2);title(女声录入频谱图);xlabel(Freq/HZ);ylabel(幅值);filename= yuan2.wavaudiowr
33、ite(filename,y2,fs);guidata(hObject, handles);15% - Executes during object creation, after setting all properties.function pushbutton2_CreateFcn(hObject, eventdata, handles)% hObject handle to pushbutton2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - h
34、andles not created until after all CreateFcns calledfunction edit1_Callback(hObject, eventdata, handles)% hObject handle to edit1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hints: get(hObject,String) retur
35、ns contents of edit1 as text% str2double(get(hObject,String) returns contents of edit1 as a double% - Executes during object creation, after setting all properties.function edit1_CreateFcn(hObject, eventdata, handles)% hObject handle to edit1 (see GCBO)% eventdata reserved - to be defined in a futur
36、e version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc endfunction edit2_CreateFcn(hObject, eventdata, handles)% hObject handle to edit2 (see GCBO)% eventdata reserved
37、- to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc end16function edit3_Callback(hObject, eventdata, handles)% hObject handle to edit3 (see
38、 GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hints: get(hObject,String) returns contents of edit3 as text% str2double(get(hObject,String) returns contents of edit3 as a double% - Executes during object creation,
39、 after setting all properties.function edit3_CreateFcn(hObject, eventdata, handles)% hObject handle to edit3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white b
40、ackground on Windows.% See ISPC and COMPUTER.if ispc end% - Executes on button press in pushbutton3.function pushbutton3_Callback(hObject, eventdata, handles)% hObject handle to pushbutton3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles a
41、nd user data (see GUIDATA)s1=get(handles.edit3,string);sec1=str2double(s1) s2=get(handles.edit2,string);sec2=str2double(s2) filename=yuan1.wavn1,F=audioread(filename);n1_new=n1(F*sec1+1):F*sec2),:);axes(handles.axes7);plot(n1_new);title(截取男声波形图);17xlabel(样本数);ylabel(幅值);filename=yuan1new.wavaudiowri
42、te(filename,n1_new,F); filename=yuan2.wavn2,F=audioread(filename);n2_new=n2(F*sec1+1):F*sec2),:);axes(handles.axes8);plot(n2_new);title(截取女声波形图);xlabel(样本数);ylabel(幅值);filename=yuan2new.wavaudiowrite(filename,n2_new,F);guidata(hObject, handles); % - Executes on button press in pushbutton4.function p
43、ushbutton4_Callback(hObject, eventdata, handles)% hObject handle to pushbutton4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)s1=get(handles.edit3,string);sec1=str2double(s1) s2=get(handles.edit2,string);sec2=s
44、tr2double(s2) filename= yuan1new.wavnew1,F=audioread(filename);filename= yuan2new.wavnew2,F=audioread(filename);n_1=new1(sec2-sec1-1)*F:(sec2-sec1)*F);n_2=new2(1:F);j=10;z1=n_1;zeros(F/j,1);z2=zeros(F/j+1,1);n_2;z=z1+z2;new3(1:(sec2-sec1-1)*F)=new1(1:(sec2-sec1-1)*F);new3(sec2-sec1-1)*F:(sec2-sec1+1
45、/j)*F)=z;new3(sec2-sec1+1/j)*F-1:(2*(sec2-sec1)-1+1/j)*F)=new2(F:(sec2-sec1)*F);axes(handles.axes9);plot(new3);title(合成波形图);xlabel(样本数);ylabel(幅值);18N1=fft(new3);axes(handles.axes10);plot(abs(N1);title(合成频谱图);xlabel(Freq/HZ);ylabel(幅值);filename= hecheng.wavaudiowrite(filename,new3,F);guidata(hObject
46、, handles); % - Executes on button press in pushbutton5.function pushbutton5_Callback(hObject, eventdata, handles)% hObject handle to pushbutton5 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)filename=yuan1new.
47、wavyan1,F=audioread(filename);sound(yan1,F)guidata(hObject, handles); % - Executes on button press in pushbutton6.function pushbutton6_Callback(hObject, eventdata, handles)% hObject handle to pushbutton6 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)filename=yuan2new.wavyan2,F=audioread(filename);sound(yan2,F)guidata(hObject, handles); % - Executes on button press in pushbutton7.function pushbutton7_Callback(hObject, eventdata, handles)