Matlab音乐合成实验报告(共22页)

上传人:壹****1 文档编号:498651899 上传时间:2023-11-23 格式:DOCX 页数:22 大小:255.13KB
返回 下载 相关 举报
Matlab音乐合成实验报告(共22页)_第1页
第1页 / 共22页
Matlab音乐合成实验报告(共22页)_第2页
第2页 / 共22页
Matlab音乐合成实验报告(共22页)_第3页
第3页 / 共22页
Matlab音乐合成实验报告(共22页)_第4页
第4页 / 共22页
Matlab音乐合成实验报告(共22页)_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《Matlab音乐合成实验报告(共22页)》由会员分享,可在线阅读,更多相关《Matlab音乐合成实验报告(共22页)(22页珍藏版)》请在金锄头文库上搜索。

1、精选优质文档-倾情为你奉上音乐合成实验目录摘要:本文共有三大部分:第一部分,简单的音乐合成;第二部分,用傅里叶变换分析音乐;第三部分,基于傅里叶级数的音乐合成。由潜入深,一步一步分析了用MATLAB进行音乐合成的过程。通过本实验达到了加深对傅里叶级数和傅里叶分析的理解,熟悉对MATLAB基本使用的目标。第一部分简单的合成音乐1.1合成东方红根据东方红第一小节的简谱和十二平均律计算出该小节每个乐音的频率,在MATLAB中生成幅度为1,抽样频率为8kHz的正弦信号表示这些乐音,用sound播放合成的音乐由图可知东方红的曲调定为F,即1=F,对应的频率为349.23Hz,据此可以计算出其他乐音的频率

2、,例如5对应的频率为,一次类推计算出第一小节各乐音对应的频率为:乐音55621162频率523.25523.25587.33392349.23349.23293.66392在确定了各乐音的频率之后需要确定每个乐音的持续时间。每小节有两拍,一拍的时间是0.5s,因此各乐音的持续时间为:乐音55621162时间0.50.250.2510.50.250.251而在MATLAB中表示乐音所用的抽样频率为fs=8000Hz,也就是所1s钟内有8000个点,抽样点数的多少就可表示出每个乐音的持续时间的长短。用一个行向量来存储这段音乐对应的抽样点,在用sound函数播放即可。根据以上分析在MATLAB中编写

3、如下程序:sound_1_1.mclear;clc;fs=8000;%抽样频率f=523.25 523.25 587.33 392 349.23 349.23 293.66 392; %各个乐音对应的频率time=fs*1/2,1/4,1/4,1,1/2,1/4,1/4,1;%各个乐音的抽样点数N=length(time);%这段音乐的总抽样点数east=zeros(1,N);%用east向量来储存抽样点n=1;for num=1:N%利用循环产生抽样数据,num表示乐音编号 t=1/fs:1/fs:time(num)/fs;%产生第num个乐音的抽样点east(n:n+time(num)-1

4、)=sin(2*pi*f(num)*t);%抽样点对应的幅值 n=n+time(num);endsound(east,8000);%播放音乐在MATLAB中运行sound_1_1.m,播放出了东方红的第一段,但是可以听出效果很不好,只能听出具有东方红的调子而已。1.2 除噪音,加包络在1.1中听到有“啪”的杂声,下面通过加包络来消噪音。最简单的包络为指数衰减。最简单的指数衰减是对每个音乘以因子,在实验中首先加的是的衰减,这种衰减方法使用的是相同速度的衰减,但是发现噪音并没有完全消除,播放的音乐效果不是很好,感觉音乐起伏性不强。于是采用不同速度的衰减,根据乐音持续时间的长短来确定衰减的快慢,乐音

5、持续时间越长,衰减的越慢,持续时间越短,衰减的越快。在1.1程序的基础上加上包络,编写如下程序:sound_1_21.mclear;clc;fs=8000;%抽样频率f=523.25 523.25 587.33 392 349.23 349.23 293.66 392; %各个乐音对应的频率time=fs*1/2,1/4,1/4,1,1/2,1/4,1/4,1;%各个乐音的抽样点数N=length(time);%这段音乐的总抽样点数east=zeros(1,N);%用east向量来储存抽样点n=1;for num=1:N%利用循环产生抽样数据,num表示乐音编号 t=1/fs:1/fs:tim

6、e(num)/fs;%产生第num个乐音的抽样点 G=zeros(1,time(num); %G为存储包络数据的向量G(1:time(num)=exp(1:(-1/time(num):1/8000);%产生包络点 east(n:n+time(num)-1)=sin(2*pi*f(num)*t).*G(1:time(num); %给第num个乐音加上包络 n=n+time(num);endsound(east,8000);%播放plot(east);播放后可以听出噪音已经消除,同时因为不同时长的乐音衰减的快慢不一样,音乐听起来更有起伏感,下图是加包络后的east图像。更科学的包络如下图所示,每个

7、乐音都经过冲激、衰减、持续、消失四个阶段。由上图可以看出这个包络是四段直线段构成的,因此只要确定了每段线段的端点,即可用端点数据写出直线方程,因为直线方程可以用通式写出(我用的是斜截式),因此这段包络可以用简单的循环来完成。例如认为包络线上的数据如下图所示:据此在MATLAB中编写如下程序:sound_1_22.mclear;clc;fs=8000;%抽样频率f=523.25 523.25 587.33 392 349.23 349.23 293.66 392; %各个乐音对应的频率time=fs*1/2,1/4,1/4,1,1/2,1/4,1/4,1;%各个乐音的抽样点数N=length(t

8、ime);%这段音乐的总抽样点数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);%产生包络线抽样点 for k=1:4 P(s:L(k+1)-1)=(T(k+1)-T(k

9、)/(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 east(n:n+time(num)-1)=sin(2*pi*f(num)*t).*P(1:time(num);%给第num个乐音加上包络 n=n+time(num);endsound(east,8000);plot(east);运行得到的图像为:下图是两个乐音交接处的局部放大图,可以看到前一个乐音一直衰减到0,后一个乐音从0开始增加,因此消除了噪音。若不需要每个音都衰减到0,例如只需衰减到持

10、续阶段幅值的20%,对程序做简单的修改即可,将T=0 1.5 1 1 0改为T=0.2 1.5 1 1 0.2运行得到的结果为:由图可见,每个乐音都是衰减到一较小值而不是0,也能消除噪音,同时音乐听起来更加连续。1.3改变程序,实现1.2中的音乐升高和降低一个八度升高一个八度即每个乐音的频率都提高一倍,变为原来的2被;降低一个八度即每个乐音的频率都减小一倍,变为原来的1/2。因此最简单的办法是将存储乐音频率的向量每个元素改变为2或1/2倍。即将程序中的f=523.25 523.25 587.33 392 349.23 349.23 293.66 392;改为f=523.25 523.25 58

11、7.33 392 349.23 349.23 293.66 392*2;或f=523.25 523.25 587.33 392 349.23 349.23 293.66 392/2;将上述音乐上高半个音阶,即将频率变为原来的(1.06)倍,可以利用resamlpe函数对原来的数据点进行重采样来实现east=resample(east,100,106);因为resample进行重新采样后会使每个乐音的持续时间改变,但是因为升高半个音阶,频率改变不大,所以每个音的持续时间是基本不变的。1.4 在1.2的音乐中加入谐波在1.2的音乐中加上二、三、四次谐波,基波幅度为1,高次谐波幅度分别为0.2、0.

12、3、0.1。只需将1.2程序改为sound_1_4.mclear;clc;fs=8000;%抽样频率f=523.25 523.25 587.33 392 349.23 349.23 293.66 392; %各个乐音对应的频率time=fs*1/2,1/4,1/4,1,1/2,1/4,1/4,1;%各个乐音的抽样点数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

13、(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);%产生包络线抽样点 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

14、(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个乐音加上包络 n=n+time(num);endsound(2*east,8000);plot(east);即可,加颜色部分为修改的部分,加上谐波后音乐效果变得更好了。1.5自选音乐合成两只老虎两只老虎曲调为C,因此可以得到每个乐音对应的频率分别为:12345262.63293.66329.63349.23392每小节有四拍,一拍的时间是0.5s,因此各乐音的持续时间为:乐音12311231

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号