数字信号处理课程设计语音信号合成.doc_第1页
数字信号处理课程设计语音信号合成.doc_第2页
数字信号处理课程设计语音信号合成.doc_第3页
数字信号处理课程设计语音信号合成.doc_第4页
数字信号处理课程设计语音信号合成.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计说明书设计题目:基于幅度调制法的语音信号合成专业:电子信息工程 班级: 2011级1班 设计人:王钱磊 201101101530山 东 科 技 大 学2013年12月27日山 东 科 技 大 学课 程 设 计 任 务 书 电子信息工程 专业 2011级1 班 学生 王钱磊 一、 课程设计题目: 基于幅度调制法的语音信号合成 二、 设计原始资料: MATLAB软件编程环境;PentiumIV计算机 三、 设计应解决下列各主要问题: 1、掌握幅度调制法的概念,设计GUI界面。 2、采集语音信号,运用MATLAB软件计算信号的时域图和频谱图。 3、利用幅度调制法进行语音合成。 四、 设计说明书应附有下列图纸: 五、命题发出日期: 2013-12-15 设计应完成日期: 2013-12-27 设计指导教师(签章) 教研室主任(签章) 指导教师对课程设计的评语 指导教师(签章): 年 月 日 31山东科技大学学生课程设计摘 要语音信号处理是一门比较实用的电子工程专业课程,语音是人类获取信息的的重要来源和利用信息的重要手段。通过语言相互传递信息是人类最重要的基本功能之一。语音信号是一种非平稳的时变信号,它携带着各种信息。在语音编码、语音合成、语音识别和语音增强等语音处理中无一例外需要提取语音中包含的各种信息。Matlab是一个数据分析和处理功能十分强大的工程实用软件。本文介绍了利用matlab软件及其中的图形用户界面(GUI)实现驱动声卡采集语音信号和语音信号采集后的文档处理方法,并通过实例利用matlab分析了语音信号处理的过程。关键词:语音信号处理 MATLAB 频谱分析 语音合成 目 录1 绪论32 软件设计与实现 4 2.1 MATLAB软件介绍4 2.2 GUI用户界面介绍 5 2.3 软件总体设计及框图 6 2.4 软件设计原理 8 2.5 软件实现过程103设计中遇到的问题及解决过程144设计总结与心得体会 195 附录20 5.1参考文献 20 5.2 程序代码 211 绪论 语音信号处理是研究用数字信号处理技术和语音学知识对语音信号进行处理的新兴的学科,是目前发展最为迅速的信息科学研究领域的核心技术之一。通过语音传递信息是人类最重要、最有效、最常用和最方便的交换信息形式。同时,语言也是人与机器之间进行通信的重要工具,它是一种理想的人机通信方式,因而可为信息处理系统建立良好的人机交互环境,进一步推动计算机和其他智能机器的应用,提高社会的信息化程度。 语音信号处理是一门新兴的学科,同时又是综合性的多学科领域和涉及面很广的交叉学科。虽然从事这一领域研究的人员主要来自信号与信息处理及计算机应用等学科,但是它与语音学、语言学、声学、认知科学、生理学、心理学等许多学科也有非常密切的联系。 20世纪60年代中期形成的一系列数字信号处理的理论和算法,如数字滤波器、快速傅立叶变换(FFT)等是语音信号数字处理的理论和技术基础。随着信息科学技术的飞速发展,语音信号处理取得了重大的进展。进入70年代之后,提出了用于语音信号的信息压缩和特征提取的线性预测技术(LPC),并已成为语音信号处理最强有力的工具,广泛应用于语音信号的分析、合成及各个应用领域,以及用于输入语音与参考样本之间时间匹配的动态规划方法。80年代初一种新的基于聚类分析的高效数据压缩技术(矢量量化)应用于语音信号处理中。近年来人工神经网络(ANN)的研究取得了迅速发展,语音信号处理的各项课题是促进其发展的重要动力之一,同时,它的许多成果也体现在有关语音信号处理的各项技术之中。2软件设计与实现本课程设计利用MATLAB软件进行设计,主要涉及到两个子函数的设计,一是线性预测函数,二是语音信号的合成,通过主函数对两个子函数的调用来完成设计功能。2.1 MATLAB软件介绍本次课程设计用到的编辑软件是MATLAB,下面对它做一下简要介绍:MATLAB是一种科学计算软件,主要适用于矩阵运算及控制和信息处理领域的分析设计。它使用方便,输入简捷,内容丰富,运算高效,并且很容易由用户自行扩展,因此,当前己成为美国和其他发达国家大学教学和科学研究中最常用而必不可少的工具。MATLAB是矩阵实验室(MATRIX LABORATORY)的缩写,主要用于方便矩阵的存取,其基本元素是无须定义维数的矩阵。MATLAB自问世以来,就是以数值计算称雄。MATLAB进行数值计算的基本单位是复数数组(或称阵列),这使得MATLAB高度“向量化”。经过十几年的完善和扩充,现已发展成为线性代数课程的标准工具。由于它不需定义数组的维数,并给出矩阵函数、特殊矩阵专门的库函数,使之在求解诸如信号处理、建模、系统识别、控制、优化等领域的问题时,显得大为简捷、高效、方便,这是其它高级语言所不能比拟的。与其他计算机语言相比,其特点是简洁和智能化,适应科技专业人员的思维方式和书写习惯,使得编程和调试效率大大提高。它用解释方式工作,键入程序立即得出结果,人机交互性能好,深得科技人员喜爱。MATLAB具有起点高、人机界面适台科技人员、强大而简易的作图功能、智能化程度高、功能丰富,可扩展性强等诸多特点,可以充分满足大学理工科本科的计算需要,在控制系统、信号处理、图像处理、系统辨识、模糊集合、神经元网络和小波分析等领域具有广泛的应用。MATLAB的工作环境主要由命令窗(Command Window)、图形窗(figure window)和文本编辑窗(File Editor)组成。本次课程设计也主要是在这三个窗口中进行编辑调试。2.2 图形用户界面介绍GUIDE 是 Graphic User Interface Design Environment 的简称。它是一个 设计 图形用户界面的集成开发环境。它使得图形对象的生成和管理变得简单、直接。在MATLAB 的命令窗口中输入guide 命令,即可开启 GUIDE 的主界面图形用户界面(GUI)是包含图形的对象,如:窗口、图标、菜单和文本的用户界面。它以某种方式选择或激活这些对象,通常引起动作或发生变化。MATLAB 的GUI 的基本图形对象分为两类:用户界面控件对象(uicontrol)和用户界面菜单对象(uimenu)。uicontrol对象能建立如按钮,滚动条,弹出式菜单以及文本框等对象。控件对象是这样一类图形界面对象:用户用鼠标在控件对象上进行操作,单击鼠标时,将会是应用程序作出响应并执行某些预定的功能子程序(Callback)。Uicontrol产生UI控件对象n 坐标轴(Axes)n 静态文本框(Text)n 可编辑文本框(Edit)n 弹出式菜单(PopupMenu)n 滑标(Slider)n 框架(Frame)n 命令按钮(PushButton)n 单选按钮(RadioButton)n 复选框(CheckBox)n 列表框(ListBox)uimenu对象能在图形窗口中产生下拉式菜单和子菜单。在每一个窗口系统中使用菜单让用户选择命令和选项。通常在显示屏或窗口的顶部有一菜单条。移动鼠标指针到菜单标志上按下鼠标按键,顶层菜单就被选中,一列菜单项就从菜单标志拉下来。这种款式菜单就叫下拉式菜单。按下鼠标将指针移动至菜单项并松开鼠标,则完成菜单项的选择。 MATLAB 的 GUI 的特性是 MATLAB 图形句柄系统的子系统。“句柄图形”的理解是设计和实现GUI的先决条件。2.3 软件总体设计及框图分析和处理音频信号,首先要对声音信号进行采集,MATLAB 的数据采集工具箱提供了一整套命令和函数,通过调用这些函数和命令,可直接控制声卡进行数据采集。Windows 自带的录音机程序也可驱动声卡来采集语音信号,并能保存为WAV 格式文件,供MATLAB 相关函数直接读取、写入或播放。本文以WAV 格式音频信号作为分析处理的输入数据,用MATLAB 处理音频信号的基本流程是:先将WAV 格式音频信号经wavread 函数转换MATLAB 列数组变量;再用MATLAB 强大的运算能力进行数据分析和处理,如时域分析、频域分析、数字滤波、信号合成、信号变换、识别和增强等等;处理后的数据如是音频数据,则可用wavwrite 转换成WAV 格式文件或用sound、wavplay 等函数直接回放。图1.1为本次课程设计的语音合成流程图。图1.1语音合成流程图。 图1.2为GUI界面设计 该界面分为两部分。第一部分为坐标显示区域,左侧一列坐标图,由上到下依次为所录入女生声音信号的时域波形图和频谱图;中间一列坐标图,由上到下依次为所录入男生声音信号的时域波形图和频谱图。第二部分为按钮区。其意义由按钮上的汉字所说明。若想获得合成器上的坐标图,可以在plot函数前加figure命令。图1.2 语音合成器的GUI界面 2. 4 软件设计原理 2. 4.1语音信号的频谱分析过程傅里叶频谱分析是语音信号频域分析中广泛采用的一种方法。语音波是一个非平稳过程,因此适用于周期、瞬变或平稳随机信号的标准傅里叶变换不能直接表示语音信号,而应该用短时傅里叶变换对语音信号的频谱进行分析,相应的频谱称为“短时谱”。进行频谱分析时,在时域数据进行短时FFT处理之前都要进行加窗处理。在FFT处理之后,普通频谱分析可以进行频域上的滤波处理,从而使频谱更加平滑。 2.4.2信号调制所谓调制,就是将调制信号加载在三个参数中的某一个参数上,或幅值、或频率、或相位随调制信号大小成线性变化的过程。主要有三种基本调制方法,分别如下: 第一种是把调制信号加载在载波信号的幅值上,称为幅度调制 ,简称AM。第二种是把调制信号装载在载波的频率上,称为频率调制,简称FM。第三种是把调制信号装载在载波的相位上,称为相位调制,简称PM。本设计采用的是第一种方法,用采集到的男生信号去对女生信号进行幅度调制,实现语音合成的目的。下面以简单的调制信号为单频余弦波来说明幅度调制的原理。设单频余弦波调制信号为设载波信号为由幅度调制定义可知,幅度调制是用基带信号控制载波的振幅,使载波的振幅随基带信号的规律变化,因此调制后形成的已调波 可表示为 已调信号的振幅部分也可以表示为 式中因此,普通调幅信号可以表示为 按照上述简单分析,只要已知基带信号和载波,就可以画出已调波的波形。 在一个信号周期内,其最大振幅为最小振幅为由上两式可得有上式可知,且越大,调幅波的外包络线凹陷越深,即调制越深。 普通调幅信号的波形与频谱,简单而直观的表示出了幅度调制的基本原理。2.4.3Hilbert变换MATLAB提供了计算Hilbert变换的函数,其格式为y=Hilbert(x)。但需注意的是,该函数计算出的结果是序列的解析信号,其虚部才是序列的Hilbert变换。Hilbert变换具有两个性质:性质1 序列x(n)通过Hilbert变换器后,信号频谱的幅度不发生变化,这是因为Hilbert变换器是全通滤波器,引起频谱变化的只是其相位。性质2 序列x(n与其Hilbert变换是正交的。)2.5 软件实现过程 2.5.1 语音信号采集本设计以女音和男音为分析样本。在MATLAB 中使用wavrecord录音函数,采样频率FS 为16 000Hz,获取语音信号。利用sound函数, 可清晰地听到女生读音为: “a”,男生读音“b”,采集数据并画出波形图,女生和男生的时域波形图分别如图1.3和和图1.4. 图1.3 女生声音时域波形图 图1.4 男生声音时域波形图 2.5.2语音信号频谱分析对采集到的语音信号分别做快速傅里叶变换进行频谱分析,并将频谱图画出来,观察各自的频谱特性。女生和男生的声音频谱图如图4.5和图4.6。 由频谱图可清楚地看到样本声音主要以低频为主。人的语音信号频率一般集中在1kHz之前,从声音频谱的包络来看, 样本声音的能量集中在2000Hz以内,4kHz 以外的高频部分很少。所以信号宽度近似取为1kHz, 由采样定理可得FS2F0 =21 102.5=2 205Hz,重放语音后仍可较清晰的听出原声, 不存在声音混叠现象。 图1.5 女生信号FFT频谱图 图1.6 男生信号FFT频谱图2.5.3语音合成首先对男声信号进行hilbert变换得到包络,然后信号对齐并用男声包络调制女生振幅,将生成的数据归一化处理,最后对生成文件进行FFT分析,做出频谱图。 图1.7 合成语音信号时域波形图 图1.8 合成信号FFT频谱图图1.9 语音合成信号总界面3设计中的问题及解决过程3.1GUI界面的问题及解决办法 为了只管的体现语音信号合成,本次设计需要建立一个用户界面,通过上网查资料了解了matlab软件中有GUI界面可以实现这个功能。但是对于GUI 界面还是一无所知。于是试着建立了几个按钮和坐标轴。 通过熟悉GUI界面了解了GUI界面与m文件之间的联系,push button按钮通过callback来调用m文件里的内容。接着建立了完整的GUI界面3.2GUI界面调用函数问题及解决 接下来的任务就是编制代码,编完代码以后运行整个程序发现有错误。 通过上网查询知道在GUI界面中按钮的creatfcn和delefcn按钮必须清空,否则的话就会出现上述情况。 清空之后,GUI界面就可以调用m文件里的函数。3.3合成声音混叠问题及解决办法 合成的声音产生了混叠现象,通过检验代码发现,基波信号和载波信号没有对齐。于是编制代码让他们对齐for i=1:sigLength-4, a(i)=y(i).*y(i+1).*y(i+2).*y(i+3).*y(i+4); if a(i)=0 break; else i=i+0; end end; I=i;for j=1:sigLength1-4, a(j)=y1(j).*y1(j+1).*y1(j+2).*y1(j+3).*y1(j+4); if a(j)=0 break; else j=j+0; end end; J=j; 4设计总结与心得体会通过本次课程设计,我学会了使用MATLAB分析连续时间信号的频谱,能够基本运用了MATLAB的图形用户界面(GUI)编程。实验之初由于对课题和相关知识理解不深,因而设计起来很困难。通过查阅相关书籍,同学之间相互讨论以及询问老师,我理解并掌握了课题的实质。由于之前很少接触MATLAB软件, MATLAB中的许多函数,如fft,plot,subplot,abs等用起来比较吃力。通过老师的讲解以及下课后自己对MATLAB的学习,我基本可运用MATLAB软件做一些简单的程序来看信号的频谱或各种信号的波形。通过分析连续时间信号的频谱,使我更加深入的理解了书本上的知识。要真正熟练运用MATLAB还要靠自己多学习和使用。而且在写MATLAB程序时不能马虎,否则程序很容易出错,这培养了自己的细心和耐心。通过不断使用MATLAB,我发现并解决了很多问题,使我更加了解MATLAB。在以后的学习中我会加强学习并熟练使用MATLAB的各种功能。我懂得了无论什么事都要去做才会发现问题,才有可能去解决问题。对知识的学习,不能浅尝辄止,要深入去学习,去了解,这样才会有所收获。有许多问题不是想像中的那么容易,不去实践,永远也不会有提高,不能只是学习和重视书本上的理论知识,所以日后在学习过程中,我会更加注视实践操作,注重理论与实践的结合。课程设计虽然是一门专业课,但是通过课设使我专业知识得到了丰富,专业技能上的提升。同时,在老师的身上我学得到很多实用的知识,在此我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示衷心的感谢!4附录4.1参考文献 1高西全,丁玉梅,数字信号处理(第三版),西安电子科技大学出版社,2008.8,110122页2陈怀琛,吴大正,高西全,MATLAB及在电子信息课程中的应用, 北京: 电子工业出版社,2006.3,24页3楼顺天,刘小东,李博菡,基于MATLAB 7.x的系统分析与设计信号处理, 西安: 西安电子科技大学出版社,2005.5,163171页、328335页 4Thomas F .Quatieri,离散时间语音信号处理原理与应用,北京:电子工业出版社 ,2004.8,5557页4.2 程序代码function varargout = yuyin(varargin)% YUYIN M-file for yuyin.fig% YUYIN, by itself, creates a new YUYIN or raises the existing% singleton*.% H = YUYIN returns the handle to a new YUYIN or the handle to% the existing singleton*.% YUYIN(CALLBACK,hObject,eventData,handles,.) calls the local% function named CALLBACK in YUYIN.M with the given input arguments.% YUYIN(Property,Value,.) creates a new YUYIN or raises the% existing singleton*. Starting from the left, property value pairs are% applied to the GUI before yuyin_OpeningFunction gets called. An% unrecognized property name or invalid value makes property application% stop. All inputs are passed to yuyin_OpeningFcn via varargin.% *See GUI Options on GUIDEs Tools menu. Choose GUI allows only one% instance to run (singleton).% See also: GUIDE, GUIDATA, GUIHANDLES% Copyright 2002-2003 The MathWorks, Inc.% Edit the above text to modify the response to help yuyin% Last Modified by GUIDE v2.5 24-Dec-2013 18:51:08% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct(gui_Name, mfilename, . gui_Singleton, gui_Singleton, . gui_OpeningFcn, yuyin_OpeningFcn, . gui_OutputFcn, yuyin_OutputFcn, . gui_LayoutFcn, , . gui_Callback, );if nargin & ischar(varargin1) gui_State.gui_Callback = str2func(varargin1);endif nargout varargout1:nargout = gui_mainfcn(gui_State, varargin:);else gui_mainfcn(gui_State, varargin:);end% End initialization code - DO NOT EDIT% - Executes just before yuyin is made visible.function yuyin_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 yuyin (see VARARGIN)% Choose default command line output for yuyinhandles.output = hObject;% Update handles structureguidata(hObject, handles);% UIWAIT makes yuyin wait for user response (see UIRESUME)% uiwait(handles.figure1);% - Outputs from this function are returned to the command line.function varargout = yuyin_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 structurevarargout1 = handles.output;% - Executes on button press in NVYINLURU.function nvshenglr_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)global fs;global y;fs=16000; duration=2; y=wavrecord(duration*fs,fs); % - Executes on button press in YUYINBOFANG1.function nsbf_Callback(hObject, eventdata, handles)% hObject handle to YUYINBOFANG1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global fs;global y;fs=16000; wavplay(y,fs);% - Executes on button press in PINPUTU1.function pinputu1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton7 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global fs;global y;global sigLength;fs=16000; y=y(:,1); t=(0:length(y)-1)/fs;sigLength=length(y);Y=fft(y,sigLength); halflength=floor(sigLength/2);f=fs*(0:(halflength-1)/sigLength;axes(handles.axes2);plot(f,abs(Y(1:halflength) grid on;axis tight;% - Executes on button press in XINHAOBOXING1.function boxingbofang1_Callback(hObject, eventdata, handles)global fs;global y;global sigLength;fs=16000; y=y(:,1); t=(0:length(y)-1)/fs;sigLength=length(y);Y=fft(y,sigLength); halflength=floor(sigLength/2);f=fs*(0:(halflength-1)/sigLength;axes(handles.axes1);plot(t,y); grid on;axis tight;% 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)% - Executes on button press in NANYINLURU.function pushbutton8_Callback(hObject, eventdata, handles)%nanshengluruuuuuglobal fs;global y1;fs=16000; duration=2; y1=wavrecord(duration*fs,fs); % hObject handle to pushbutton8 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% - Executes on button press in YUYINBOFANG2.function pushbutton9_Callback(hObject, eventdata, handles)%nanshengbofangglobal fs;global y1;fs=16000; wavplay(y1,fs);% 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)% - Executes on button press in PINPUTU2.function pushbutton11_Callback(hObject, eventdata, handles)%pinputu222% hObject handle to PINPUTU2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global fs;global y1;global sigLength1;fs=16000; y1=y1(:,1); t=(0:length(y1)-1)/fs;sigLength1=length(y1);Y1=fft(y1,sigLength1); halflength1=floor(sigLength1/2);f=fs*(0:(halflength1-1)/sigLength1;axes(handles.axes4);plot(f,abs(Y1(1:halflength1) grid on;axis tight;% - Executes on button press in XINHAOBOXING2.function pushbutton10_Callback(hObject, eventdata, handles)%boxingtuuuu2% hObject handle to XINHAOBOXING2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global fs;global y1;global sigLength1;fs=16000; y1=y1(:,1); t=(0:length(y1)-1)/fs;sigLength1=length(y1);Y1=fft(y1,sigLength1); halflength1=floor(sigLength1/2);f=fs*(0:(halflength1-1)/sigLength1;axes(handles.axes3);plot(t,y1); grid on;axis tight;% - Executes on button press in YUYINHECHENG.function pushbutton12_Callback(hObject, eventdata, handles)%yuyinhechenguuuu% hObject handle to YUYINHECHENG (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 y1;global sigLength;global sigLength1;for i=1:sigLength-4, a(i)=y(i).*y(i+1).*y(i+2).*y(i+3).*y(i+4); if a(i)=0 break; else i=i+0; end end; I=i;for j=1:sigLength1-4, a(j)=y1(j).*y1(j+1).*y1(j+2).*y1(j+3).*y1(j+4); if a(j)=0 break; else j=j+0; end end; J=j;H=hilbert(y1);max1=max(I,J); for k=1:sigLength-max1, N(k)=y(i).*H(j);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论