1、MATLAB音乐合成综合实验 学院: 班级: 指导老师:吴宪祥 同做者: 二0一六年十二月24摘 要 本实验共有三部分:1.简单的音乐合成;2.用傅里叶变换分析音乐;3.基于傅里叶级数的音乐合成。一步一步分析了用MATLAB进行音乐合成的过程。通过本实验达到加深对傅里叶级数和傅里叶分析的理解,熟悉对MATLAB基本使用的目标。该实验采用MATLAB软件仿真来实现。首先,通过编程对一段真实的音乐进行分析、处理,求得这段音乐的基频、谐波分量、等数据;然后,通过对乐理的研究,根据分析中求得的数据编写程序,进行基于傅里叶分析的音乐合成设计,并设计了图形用户界面。目 录1. 绪论 1.1 引言.3 1.
2、2 实验要求.3 1.3 实验原理.32. 简单的合成音乐 2.1 乐理知识介绍.4 2.2 利用MATLAB实现音乐合成器,生成 WAV文件.5 2.3 除噪音,加包络.5 2.4 音乐升高和降八度.9 2.5 加入谐波.93. 用傅里叶变换分析音乐 3.1 载入fmt.wav并播放.11 3.2 处理realware.11 3.3 分析wave2proc的基波和谐波.13 3.4 自动分析fmt.wav的音调和节拍.164. 基于傅里叶级数的音乐合成 4.1 重新加谐波.17 4.2 通过音调信息弹奏送别.195. 制作GUI界面.206.实验难点及问题.217.实验收获.22 1.绪论1
3、1 引言信号与系统的概念及分析方法广泛应用于通信、自动控制、航空航天、电子信息、地震学、生物工程等领域,因此“信号与系统”是一门电子信息学科相关专业的主干技术课程。MATLAB是国际上公认的优秀的科技应用软件,随着版本的不断升级,内容也在不断扩充。基于MATLAB的音乐分析与合成实验是针对“信号与系统”课程的重点和难点之一的傅里叶变换和傅里叶级数等内容而设计的。由于该实验是真实音乐的实际应用,可以增进对傅里叶级数和傅里叶变换的理解,加深对信号分析工程应用的理解,提高在信号分析领域的应用能力。1.2 实验要求1、3-5人一组,选择不同乐曲,利用MATLAB实现音乐合成器,生成WAV文件;2、给
4、乐音加包络消噪;3、实现音乐的升八度和降八度;4、在音乐中添加谐波;5、用傅里叶级数分析音乐的基频、音调和节拍;6、模仿一些常用乐器(如钢琴、吉他等)实现音乐合成;7、设计GUI界面;8、提交设计报告。1.3实验原理 傅里叶变换建立了信号频谱的概念。所谓傅里叶分析即分析信号的频谱(频率构成)、频带宽度等。要想合成出一段音乐,就要了解该段音乐的基波频率、谐波构成等。因此,必须采用傅里叶变换这一工具。对于连续时间信号f(t),其傅里叶变换为:由于其变换两边的函数f (t) 和F(w)都是连续函数,不适合于计算机处理。MATLAB语言提供了符号函数FOURIER来实现傅里叶变换,但该函数需要信号的解
5、析表达式。而工程应用中经常需要对抽样数据进行傅里叶分析,这种情况下往往无法得到信号的解析表达式,必须采用傅里叶变换的数值计算方法。如果f(t)的主要取值区间为t1,t2,定义T=t2-t1为区间长度。在该区间内抽样N个点,抽样间隔为: 则有:可以计算出任意频点的傅里叶变换值,假设F()的主要取值区间位于1,2,要计算其间均匀抽样的k个值,则有:式中 ,为频域抽样间隔。2. 简单的合成音乐2.1 乐理知识介绍 乐音的基本特征可以用基波频率、谐波频谱和包络波形3个方面来描述。基波频率:每个指定音调的唱名都对应固定的基波信号频率。所谓唱名是指平日读乐谱唱出的1(do)、2(re)、3(mi) ,每个
6、唱名并未固定基波频率。当指定乐曲的音调时才知道此时唱名对应的频率值。如C调“ 1”的基波频率为261.63HZ,F调“1”的基波频率为349.23HZ,F调“ 5”的基波频率为523.25HZ。谐波频谱:在音乐领域中称谐波为“泛音”,由谐波产生的作用称为音色变化。当指定音调之后,仅指定了乐音信号的基波频率,谐波情况并未说明。各种乐器,如钢琴或单簧管,都可以发出某一音调下的唱名,而人的听觉会明显感觉两者不同,这是由于谐波成分有所区别,频谱结构各异。包络波形:不同类型的乐器,包络形状也不相同。在音乐合成实验中,为简化编程描述,通常把复杂的包络函数用少量直线近似。于是,乐音波形的包络呈拆线。有时为了
7、保证在乐音的邻接处信号幅度为零,也可以用指数衰减的包络来表示,这也是最简单的办法。2.2 利用MATLAB实现音乐合成器,生成 WAV文件而在MATLAB中表示乐音所用的抽样频率为fs=10000Hz,也就是所1s钟内有1000个点,抽样点数的多少就可表示出每个乐音的持续时间的长短。用一个行向量来存储这段音乐对应的抽样点,在用sound函数播放即可。根据以上分析在MATLAB中编写如下程序:Clear clc;fs=10000;f=784 659 784 1047 880 1047 784 784 523 587 659 587 523 587 784 659 784 1047 988 880
8、 1047 784 784 587 659 698 494 523 880 1047 1047 988 880 988 1047 880 988 1047 880 880 784 659 523 587 ;time=fs*1 0.5 0.5 2 1 1 2 1 0.5 0.5 1 0.5 0.5 4 1 0.5 0.5 1 0.5 1 1 2 1 0.5 0.5 1 0.5 4 1 1 2 1 0.5 0.5 2 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 4 ;N=length(time); %这段音乐的总抽样点数y=zeros(1,N); %用y向量来储存抽样点n=1;
9、for num=1:N %利用循环产生抽样数据,num表示乐音编号 t=1/fs:1/fs:time(num)/fs; %产生第num个乐音的抽样点y(n:n+time(num)-1)=sin(2*pi*f(num)*t); %抽样点对应的幅值 n=n+time(num);endsound(y,fs); Wavwrite(y,test4);在MATLAB中运行,但是可以听出效果不是很好。2.3 除噪音,加包络下面通过加包络来消噪音。最简单的包络为指数衰减。最简单的指数衰减是对每个音乘以因子,在实验中首先加的是的衰减,这种衰减方法使用的是相同速度的衰减,但是发现噪音并没有完全消除,播放的音乐效果
10、不是很好,感觉音乐起伏性不强。于是采用不同速度的衰减,根据乐音持续时间的长短来确定衰减的快慢,乐音持续时间越长,衰减的越慢,持续时间越短,衰减的越快。在1.1程序的基础上加上包络,编写如下程序:加包络前:clear;clc;fs=10000;f=784 659 784 1047 880 1047 784 784 523 587 659 587 523 587 784 659 784 1047 988 880 1047 784 784 587 659 698 494 523 880 1047 1047 988 880 988 1047 880 988 1047 880 880 784 659 5
11、23 587 ;time=fs*1 0.5 0.5 2 1 1 2 1 0.5 0.5 1 0.5 0.5 4 1 0.5 0.5 1 0.5 1 1 2 1 0.5 0.5 1 0.5 4 1 1 2 1 0.5 0.5 2 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 4 ;N=length(time); %这段音乐的总抽样点数y=zeros(1,N); %用y向量来储存抽样点n=1;for num=1:N %利用循环产生抽样数据,num表示乐音编号 t=1/fs:1/fs:time(num)/fs; %产生第num个乐音的抽样点y(n:n+time(num)-1)=si
12、n(2*pi*f(num)*t); %抽样点对应的幅值 n=n+time(num);endsound(y,fs); 播放后可以听出噪音已经消除,同时因为不同时长的乐音衰减的快慢不一样,音乐听起来更有起伏感,下图是加包络后的east图像(未放大):更科学的包络如下图所示,每个乐音都经过冲激、衰减、持续、消失四个阶段。由上图可以看出这个包络是四段直线段构成的,因此只要确定了每段线段的端点,即可用端点数据写出直线方程,因为直线方程可以用通式写出(我用的是斜截式),因此这段包络可以用简单的循环来完成。例如认为包络线上的数据如下图所示:据此在MATLAB中编写如下程序:clear;clc;fs=1000
13、0;f=784 659 784 1047 880 1047 784 784 523 587 659 587 523 587 784 659 784 1047 988 880 1047 784 784 587 659 698 494 523 880 1047 1047 988 880 988 1047 880 988 1047 880 880 784 659 523 587 ;time=fs*1 0.5 0.5 2 1 1 2 1 0.5 0.5 1 0.5 0.5 4 1 0.5 0.5 1 0.5 1 1 2 1 0.5 0.5 1 0.5 4 1 1 2 1 0.5 0.5 2 0.5 0
14、5 0.5 0.5 0.5 0.5 0.5 0.5 4 ; N=length(time); %这段音乐的总抽样点数y=zeros(1,N); %用y向量来储存抽样点n=1;for num=1:N %利用循环产生抽样数据,num表示乐音编号 t=1/fs:1/fs:(time(num)/fs; %产生第num个乐音的抽样点 P=zeros(1,time(num); %P为存储包络数据的向量L=(time(num)*0 1/5 333/1000 333/500 1; %包络线端点对应的横坐标 T=0 1 0.5 0.5 0; %包络线端点对应的纵坐标 s=1; b=1:1:time(num);
15、产生包络线抽样点 for k=1:4 P(s:L(k+1)-1)=(T(k+1)-T(k)/(L(k+1)-L(k)*(b(s:L(k+1)-1)-L(k+1)*ones(1,L(k+1)-s)+T(k+1)*ones(1,L(k+1)-s); %包络线直线方程通式 s=L(k+1); end y(n:n+time(num)-1)=sin(2*pi*f(num)*t).*P(1:time(num); %给第num个乐音加上包络 n=n+time(num);endsound(y,fs);plot(y);运行得到的图像为:下图是两个乐音交接处的局部放大图,可以看到前一个乐音一直衰减到0,后一个乐
16、音从0开始增加,因此消除了噪音。 2.4 音乐升高和降八度升高一个八度即每个乐音的频率都提高一倍,变为原来的2被;降低一个八度即每个乐音的频率都减小一倍,变为原来的1/2。因此最简单的办法是将存储乐音频率的向量每个元素改变为2或1/2倍。即将程序中的f=784 659 784 1047 880 1047 784 784 523 587 659 587 523 587 784 659 784 1047 988 880 1047 784 784 587 659 698 494 523 880 1047 1047 988 880 988 1047 880 988 1047 880 880 784 6
17、59 523 587 改为f=784 659 784 1047 880 1047 784 784 523 587 659 587 523 587 784 659 784 1047 988 880 1047 784 784 587 659 698 494 523 880 1047 1047 988 880 988 1047 880 988 1047 880 880 784 659 523 587 *2或f=784 659 784 1047 880 1047 784 784 523 587 659 587 523 587 784 659 784 1047 988 880 1047 784 784
18、587 659 698 494 523 880 1047 1047 988 880 988 1047 880 988 1047 880 880 784 659 523 587 /2.将上述音乐上高半个音阶,即将频率变为原来的(1.06)倍,可以利用resamlpe函数对原来的数据点进行重采样来实现,因为resample进行重新采样后会使每个乐音的持续时间改变,但是因为升高半个音阶,频率改变不大,所以每个音的持续时间是基本不变的。2.5 加入谐波在1.2的音乐中加上二、三、四次谐波,基波幅度为1,高次谐波幅度分别为0.2、0.3、0.1。只需将1.2程序改为:clear;clc;fs=10000
19、抽样频率f=784 659 784 1047 880 1047 784 784 523 587 659 587 523 587 784 659 784 1047 988 880 1047 784 784 587 659 698 494 523 880 1047 1047 988 880 988 1047 880 988 1047 880 880 784 659 523 587 ;time=fs*1 0.5 0.5 2 1 1 2 1 0.5 0.5 1 0.5 0.5 4 1 0.5 0.5 1 0.5 1 1 2 1 0.5 0.5 1 0.5 4 1 1 2 1 0.5 0.5 2 0
20、5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 4 ;N=length(time);%这段音乐的总抽样点数east=zeros(1,N);%用east向量来储存抽样点n=1;for num=1:N%利用循环产生抽样数据,num表示乐音编号 t=1/fs:1/fs:(time(num)/fs;%产生第num个乐音的抽样点 P=zeros(1,time(num);%P为存储包络数据的向量L=(time(num)*0 1/5 333/1000 333/500 1;%包络线端点对应的横坐标 T=0 1.5 1 1 0;%包络线端点对应的纵坐标 s=1; b=1:1:time(num);%
21、产生包络线抽样点 for k=1:4 P(s:L(k+1)-1)=(T(k+1)-T(k)/(L(k+1)-L(k)*(b(s:L(k+1)-1)-L(k+1)*ones(1,L(k+1)-s)+T(k+1)*ones(1,L(k+1)-s);%包络线直线方程通式 s=L(k+1); end m=1 0.3 0.2; %波形幅值矩阵 ss=zeros(1,length(t); for i=1:length(m) ss=ss+m(i)*sin(2*i*pi*f(num)*t);%加谐波 endeast(n:n+time(num)-1)=ss.*P(1:time(num); %给第num个乐音加上
22、包络 n=n+time(num);endsound(2*east,8000);plot(east);即可,加颜色部分为修改的部分,加上谐波后音乐效果变得更好了。运行得到的图像为:3. 用傅里叶变换分析音乐3.1 载入fmt.wav并播放 步骤:载入fmt.wav并播放,利用wavread函数载入,用sound函数播放,程序如下:wave=wavread(fmt.wav);sound(wave)这段音乐听起来比之前合成的音乐更加真实,因为里边含有丰富的谐波。3.2 载入文件Guitar.mat,处理原始数据realwave 步骤:载入文件Guitar.mat,分析wave2proc是怎么由rea
23、lwave得到的。利用load Guitar.mat;载入并用plot函数将realwave、wave2proc分别画出,得到以下两幅图wave2proc可以看到,wave2proc比realwave的周期性好得多,去掉了非线性谐波和噪声。在时域做,从图上可以看到,realwave的数据大约是10个周期的共243个数据,因此可以用resample函数对realwave进行重新采样,将采样点提高到250个,那么重采样后每个周期有25个点,将这25个点对应相加求平均值后得到一个周期的值,因为进行了平均,减小了非线性谐波和噪音,然后将这25个数据延托成十个周期即250个点,在利用resample函数
24、对得到的函数重新采样将采样点数恢复到243个。根据以上分析,编写实现这个思路的程序如下:clear;clc;load Guitar.mat;wave=resample(realwave,250,243); %重采样,将点数变为250w=zeros(1,25);for i=1:25 for k=0:9 w(i)=w(i)+wave(25*k+i);%10个周期的对应点分别求和 endendw=w/10; %取平均值wave2=repmat(w,1,10); %将1个周期的10个点延拓至250个点wave2=resample(wave2,243,250); %重采样,将点数变回243hold on
25、plot(wave2,r),hold off; %将处理后的数据绘出,红色hold on,plot(wave2proc); %将所给的数据绘出,蓝色运行后的结果为:由图可见,两组数据重合的很好,说明这种方法是很不错的方法。3.3 分析wave2proc的基波和谐波为了分析wave2proc的基波和谐波,可以对wave2proc进行傅里叶变换,得到wave2proc的幅值谱,在频谱图上的第一个突出的波峰对应的频率即为wave2proc基频,利用help fft学习了MATLAB中快速傅里叶变换函数fft的用法,编写了如下程序:clear;clc;load Guitar.mat;fs=8000;
26、 NFFT = 2nextpow2(length(wave2proc); Y = fft(wave2proc,NFFT)/length(wave2proc);g = fs/2*linspace(0,1,NFFT/2+1);plot(g,2*abs(Y(1:NFFT/2+1)运行后得到的结果为虽然从图上可以大概看出包络,但是非常不明显,假如提高频域的抽样频率,例如将抽样频率由NFFT = 2nextpow2(length(wave2proc)改为NFFT = 8nextpow2(length(wave2proc)得到的结果如下;由图可见虽然频域的抽样频率提高了很多,但是得到的包络依然不精确,这是
27、因为wave2proc是周期函数,但是现在的wave2proc只有243个数据点,并不能非常明显的体现出其周期性,因此它的幅值谱的离散化程度不高,虽然提高了频域的抽样频率,但是wave2proc数据点的周期性并没有增加,所以要显示出离散化程度高的幅值谱,就要增加wave2proc的周期性,即让wave2proc在时域重复多次后在进行傅里叶变换。利用repmat函数可以将wave2proc在时域重复。将程序修改为:clear;clc;load Guitar.mat;fs=8000; wave2proc =repmat(wave2proc,20,1);%将wave2proc重复20次NFFT =
28、2nextpow2(length(wave2proc); Y = fft(wave2proc,NFFT)/length(wave2proc);g = fs/2*linspace(0,1,NFFT/2+1);plot(g,2*abs(Y(1:NFFT/2+1)由图读出wave2proc的基频为329.1Hz,幅值为0.05401,高次谐波幅值分别为:谐波23456789幅值0.076760.048410.051900.0057090.019230.0067410.0073263.4 自动分析fmt.wav的音调和节拍思路分析: 将fmt.wav导入后得到的是一个向量,它包含了这段音乐的所有信息,
29、要自动分析这段音乐的音调就需要将每个音调对应的点进行傅里叶变换得到其幅值谱,在幅值谱上找到第一个幅值较大的极大值点,该点对应的就是该音调的基频,得到基频后就可以得到高次谐波的幅值。为了使对每个音调进行傅里叶变换后得到的幅值谱离散程度高,应该将每个音调的数据在时域上重复多次,由于这些点都是直接采集的为做处理的点,因此其重复次数应该足够大才能体现出较强周期性,本实验采用重复1000次,虽然重复次数越多越好,但是次数太大,程序运行的速度会大大降低。这里边还有两个关键点:第一,在从幅值谱上找基频时,因为图上的极大值点很多,怎么能让程序自动确定出准确的基频。第二,在程序找到了基频之后,再由基频去获取高次
30、谐波的幅值时需要有一定的容错能力,例如若基频为200Hz,幅值为1,那么对应的二次谐波的频率为400Hz,但是很可能恰好幅值谱上400Hz处的幅值为0.01,但是401Hz处的幅值为0.2,这时实际上的二次谐波应该为401Hz,但是若没有给基频一个容错范围,显然找到的二次谐波的幅值是不正确的。针对以上提出的两个关键点,我找到了两条有针对性的解决办法。对于第一点,因为幅值谱上极大值点的幅值足够大才能将其定位基频,因此在分析了几个音调后发现基频处的幅值都在0.025以上,因此将基频处的限定条件改为幅值大于0.025的,但是在运行后发现,有几个音调没有分析出来,说明它们的基频幅值小于0.025,其实
31、可以观察一下fmt.wav的波形就会发现,有几段的整体幅值很小,因此基频幅值小,于是又在加上限定条件,若所有点的幅值都小于0.02,那么再用0.015作为幅值的限定条件继续找,这样就将剩下的音调基频也确定出来了。对于上述的第二点,可以将确定出的基频的误差设为+-1Hz,例如程序确定的基频为200Hz,实际的基频应该在(200-1)到(200+1)之间,那么k次谐波对应的频率范围是k*(200-1)到k*(200+1),在这个区间中继续找幅值的极大值点就是k次谐波对应点。根据以上思路,下面开始编写用于分析一个音调频率的函数analysis。在取谐波幅值时,幅值小于基波幅值5%的谐波认为其幅值为0
32、最终谐波的幅值用归一化后的数据表示。4. 基于傅里叶级数的音乐合成4.1 用2.3分析出来的结果重新加谐波基频329.1Hz 幅值为0.05401由图读出wave2proc的基频为329.1Hz,幅值为0.05401,高次谐波幅值分别为:谐波23456789幅值0.076760.048410.051900.0057090.019230.0067410.007326再次完成1.4只需将1.4程序中的波形幅度矩阵m=1 0.3 0.2改为m=0.05401 0.07676 0.04841 0.0519 0.005709 0.01923 0.006791 0.007326;即可重新加谐波根据2.4
33、分析的结果可以提取出吉他的音调信息4.2 通过音调信息弹奏送别根据2.4分析的结果可以提取出吉他的音调信息,在“自动分析结果”Excel文件中用黄色标出了出来,一下所用的音调信息用最接近的频率来近似。而所给信息中缺少523.25和587.33的数据,因此用它们的一半来近似频率293.66349.23392523.25587.33近似频率291.97350.65391.942*261.632*295.4511111120.520305440.2757865390.1086165950.3071496930.205838324300.1758122440.06907235600.157080813
34、40000.057298602050.052802710.05603520200.0753863870.08891702260.095940260000700000.065977510将1.4中的程序改为clear;clcfs=10000;f=784 659 784 1047 880 1047 784 784 523 587 659 587 523 587 784 659 784 1047 988 880 1047 784 784 587 659 698 494 523 880 1047 1047 988 880 988 1047 880 988 1047 880 880 784 659 52
35、3 587 ;time=fs*1 0.5 0.5 2 1 1 2 1 0.5 0.5 1 0.5 0.5 4 1 0.5 0.5 1 0.5 1 1 2 1 0.5 0.5 1 0.5 4 1 1 2 1 0.5 0.5 2 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 4 ;N=length(time);y=zeros(1,N);n=1;for num=1:N%利用循环产生抽样数据,num表示乐音编号 t=1/fs:1/fs:(time(num)/fs;%产生第num个乐音的抽样点 P=zeros(1,time(num);%P为存储包络数据的向量L=(time(num)*0
36、 1/5 333/1000 333/500 1;%包络线端点对应的横坐标 T=0 1 0.5 0.5 0;%包络线端点对应的纵坐标 s=1; b=1:1:time(num);%产生包络线抽样点 for k=1:4 P(s:L(k+1)-1)=(T(k+1)-T(k)/(L(k+1)-L(k)*(b(s:L(k+1)-1)-L(k+1)*ones(1,L(k+1)-s)+T(k+1)*ones(1,L(k+1)-s);%包络线直线方程通式 s=L(k+1); end m=1 0.307149693 0 0.057298602 0.075386387 0 0;. 1 0.307149693 0 0
37、057298602 0.075386387 0 0;. 1 0.205838324 0.157080813 0 0.088917022 0 0.06597751;. 1 0.108616595 0.069072356 0 0 0 0;. 1 0.275786539 0.175812244 0 0.056035202 0 0;. 1 0.275786539 0.175812244 0 0.056035202 0 0;. 1 0.52030544 0 0 0.05280271 0.09594026 0;. 1 0.108616595 0.069072356 0 0 0 0;%波形幅值矩阵 ss=
38、zeros(1,length(t); for i=1:8 ss=ss+m(i)*sin(2*i*pi*f(num)*t);%加谐波 end y(n:n+time(num)-1)=sin(2*pi*f(num)*t).*P(1:time(num);%给第num个乐音加上包络 n=n+time(num);endsound(y,fs);plot(y);运行后可以听出声音更加真实了。5. 制作GUI界面GUI是Graphical User Interface 图形用户界面首先新建一个GUI文件:File/New/GUI 如下图所示:选择Blank GUI(Default)进入GUI开发环境以后添加七个
39、编辑文本框,1个波形显示。我们利用editor进行编辑,对文本框添加代码。最后得到图形用户界面:6.实验难点及问题主要有以下几个难点: (1)音乐的时间分割:在对音乐信号进行分析时,要充分考虑采样数据点数是否为MATLAB软件所能承受。如对音乐信号以10000Hz进行采样,那么在1s的时间范围内,采样的数据点数就有10000个,再对这些数据进行一系列的数学运算,其运行时间很长,出现类似死机的现象。因此,如果音乐文件时间达数秒钟,则应将该文件进行时间分割,分成几个小段进行分析,每小段的时间越少,分析速度越快。建议每小段的时间尽量不超过0.5s。在对每小段音乐进行分析时,只需分析每段音乐的最高幅度
40、处,其他处可看成是其幅度的衰减,频率成分不变,这样可以减少对音乐的分析时间,以免做无谓的分析。为防止漏掉基波频率,最好参考该音乐的时域波形,捕捉到每个音的起始时间和持续时间。 (2)音乐的节拍:每个音的起始时间和持续时间在合成音乐的时候也是到至关重要的。因为每个音调都有持续时间,该持续时间就是通常意义上的“拍子”,一拍大约是0.5s。只有了解了每个音的起始时间和持续时间,在音乐合成时才能正确地掌握各基波频率出现的前后顺序及其节拍,以减少失真。 (3)音乐的波形包络:乐音波形包络是描述乐音特性的一个重要因素。通过音乐的时域波形可以判断该乐音是否在下一个乐音开始时衰减为零,以减小音乐合成的误差。包
41、络既可用折线形也可采用指数衰减的方法,关键的问题是如何选择衰减系数。采用折线方法麻烦一些,但折线的斜率可以根据时域波形来判断;若采用指数衰减方法,如能确定衰减系数,就非常简单。本设计采用指数衰减方法,衰减系数可根据电容充放电理论,即工程上认为,当t 3以后,可认为电路已趋稳定,其中,为RC电路的时间常数,=RC。设某段音乐的持续时间为T,且幅度在T时间内衰减为零,当包络采用指数eat时,则衰减因子a= 3/T。(4)参与音乐合成的频率分量。考虑到计算容量和计算速度,并不使用所有的频率分量进行音乐的合成,而只是选用那些真实音乐频谱中超过0.35倍最大幅度的频率分量,否则数据量太大,会超出计算机所能承受的范围,从而导致程序运行错误。(5)对于GUI界面的制作一开始处于空白阶段,对于按钮的添加与界面排版不熟悉。7.实验收获 通过基于MATLAB的音乐分析与合成实验,我们了解了处理音频信号的基本操作。学会了简单的音乐合成,用傅里叶变换分析音乐和基于傅里叶级数的音乐合成。加深了对傅里叶变换的原理、方法所依据理论的理解,培养应用知识和独立思考的能力,提高分析问题和解决问题的能力,从而加深了我们对模拟信号数字处理化