河北经贸大学毕业论文
而且十二平均律能够解决转调问题,所以,它被广泛应用在键盘乐器与交响乐队中。
根据国际标准音的规定,相邻的半音之间的频率之比定为2^(1/12)≈1.059,作为最常见的应用十二平均律而制成的乐器就是钢琴,钢琴的琴键a1的频率规定为440Hz,那么就可以根据比值得出钢琴其他的琴键音对应的频率。例如与a1左边相邻#g1频率是440/1.059=415.03Hz,同理,与a1右边相邻的半音#a1的频率是466.16Hz,也可以算出不同音调下“1(do)”的对应的基波频率,即C:261.63Hz ,F:349.23Hz和G:392Hz 等 。
3.2 傅里叶变换与频谱分析
合成一段简单的音乐,需要综合考虑音乐的三要素,也就是必须知道该段音乐的基波与谐波频率成分以及包络的形状特征。为了便于分析上述特征,就要进行信号的频谱分析,也就是利用傅里叶变化,得出该音乐信号的频谱结构,来进行其频谱特征的提取。
有限长序列的离散傅氏变换(DFT),在信号处理的理论上有重要意义,它将频域也离散化,是现代信号频谱分析主要方法。N点DFT实质上是其频谱的离散频域采样,对频率具有选择性(ωk=2πk/N),在这些点上反映了信号的频谱。
但DFT计算量大,处理复杂,所以引用了快速傅里叶变化(FFT)算法最简单、编程最容易的是基2FFT,还有基4FFT、基8FFT等快速算法。根据采样定律,FFT变换相当于对有限长序列进行频域采样,而不丢失任何信息。所以只要时域序列的长度足够长,采样的点数足够多,频域采样也可以很好地反映信号的频谱趋势,所以在设计中可以用FFT进行语音信号的频谱分析。
6
河北经贸大学毕业论文
4 MATLAB音乐合成系统的总体设计
4.1 系统的总体设计
MATLAB音乐合成系统,能实现音乐的简单合成、音乐的降噪处理、音乐的加谐波处理、音乐的升八度处理、音乐的降八度处理、音乐时域与频域波形显示、利用傅里叶级数合成音乐以及音乐字幕的动态显示的操作。该系统的全部功能都通过GUI图形用户界面显示出来,并且使用模块化的设计方法,将系统分为四个模块,如图4-1所示。
基于MATLAB 软件的音乐合成系统 简单合成及处理音乐的模块 音乐的傅里叶频域分析模块 傅里叶级数合成音乐模块 音乐的字幕动态显示模块
图4-1 系统总体设计结构图
4.2 GUI界面的设计
GUIDE(Graphic User Interface Design Environment)是专门设计图形用户界面GUI的集成开发环境。GUI界面一般包括窗口、菜单、按钮和文本框等各种图形对象。在设计GUI时,可以通过鼠标操作就能产生各种GUI控件,这样让用户对图形界面的生成与管理变得直接、方便,能让用户定制用户与MATLAB2013a
7
河北经贸大学毕业论文
的交互方式。可以形成一种除命令窗口之外的与MATLAB2013a的交互方式。 4.2.1 启动GUIDE
在MATLAB2013a中Command窗口里面输入guide 按回车键,或者从菜单里面均可进入GUIDE。MATLAB2013a为GUI图形应用界面的设计准备了以下四种模板,如图4-2所示。
图4-2 GUI设计模板选择对话框
在GUI设计模板中选中第一个模板,新建并且保存为yinyuehecheng后,MATLAB2013a会自动产生相应的.fig文件和.m文件。 4.2.2 GUIDE设计环境
在进入GUI界面之后,下一步就是进行界面设计编辑。在GUIDE设计环境中用到的事Layout编辑器,操作者可以通过鼠标移动模板左边的控件到中间布局区域,如按钮、坐标轴、文本框等。接下来,通过属性编辑器和对齐编辑器对各控件设置相关属性和进行界面布置,以完善界面功能。本设计总体布局如下图4-3所示。
8
河北经贸大学毕业论文
图4-3 GUI设计面板布局
4.2.3 GUI界面的功能设计
设计好GUI界面的整体布局之后,接下来就该利用程序代码的编写进行各个按钮功能的设置。找到上述的GUI 的M文件yinyuehecheng.m,打开之后,会看到里面已经存在许多自动生成的程序代码,只需要找到各个按钮及文本编辑框对应的函数。在对应的函数名下输入要实现相应功能所需要的程序。例如在yinyuehecheng.m文件中找到函数:function button1_Callback在这个函数名称下面写入具有简单音乐合成功能的程序。 global flag global west fs f time f_flag; flag = 1; f_flag=0;
fs=8000;%该段音乐抽样频率
F=[493.88 493.88 493.88 587.33 493.88 440 392 329.63 392 440 493.88]; %各个唱名对应的频率
time=fs*[1/4,1/4,1/4,1/4,3/4,1/4,1/4,1/4,1/4,1/4,1];%各个唱名的持续时间值 N=length(time); %这段音乐的总抽样点数 west=zeros(1,N); %用west向量来储存抽样点 n=1;
9
河北经贸大学毕业论文
for a=1:N %利用循环产生抽样数据,a表示乐音编号 t=1/fs:1/fs:time(a)/fs; %产生第a个乐音的抽样点 west(n:n+time(a)-1)=sin(2*pi*f(a)*t); %抽样点对应的幅值 n=n+time(a); End
然后定位相应的简单音乐合成按钮的坐标程序。 t1=linspace(0,length(west)/fs,length(west));
set(handles.axes1,'HandleVisibility','ON');%开始使用坐标,便于操作 axes(handles.axes1);%使用图像,操作在坐标1 plot(t1,west');axis([-0.2 4.2 -1.2 1.2]); xlabel('t/s');ylabel('幅度');
这样相应设置好各个功能按钮所对应的程序,就算基本完成了GUI界面的设置。
10