matlab音乐合成实验报告.docx

上传人:b****1 文档编号:134145 上传时间:2022-10-04 格式:DOCX 页数:22 大小:272.92KB
下载 相关 举报
matlab音乐合成实验报告.docx_第1页
第1页 / 共22页
matlab音乐合成实验报告.docx_第2页
第2页 / 共22页
matlab音乐合成实验报告.docx_第3页
第3页 / 共22页
matlab音乐合成实验报告.docx_第4页
第4页 / 共22页
matlab音乐合成实验报告.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

matlab音乐合成实验报告.docx

《matlab音乐合成实验报告.docx》由会员分享,可在线阅读,更多相关《matlab音乐合成实验报告.docx(22页珍藏版)》请在冰豆网上搜索。

matlab音乐合成实验报告.docx

音乐合成实验

目录

音乐合成实验 1

摘要:

2

第一部分 简单的合成音乐 2

1.1 合成《东方红》 2

1.2除噪音,加包络 3

1.3 改变程序,实现1.2中的音乐升高和降低一个八度 9

1.4 在1.2的音乐中加入谐波 10

1.5 自选音乐合成——《两只老虎》 11

第二部分 用傅里叶变换分析音乐 12

2.1 载入fmt.wav并播放 12

2.2 载入文件Guitar.mat,处理原始数据realwave 12

2.3 分析wave2proc的基波和谐波 14

2.4 自动分析fmt.wav的音调和节拍 17

第三部分 基于傅里叶级数的音乐合成 20

3.1用2.3分析出来的结果重新加谐波 20

3.2通过2.4提取的吉他音调信息弹奏《东方红》 20

实验收获 22

摘要:

本文共有三大部分:

第一部分,简单的音乐合成;第二部分,用傅里叶变换分析音乐;第三部分,基于傅里叶级数的音乐合成。

由潜入深,一步一步分析了用MATLAB进行音乐合成的过程。

通过本实验达到了加深对傅里叶级数和傅里叶分析的理解,熟悉对MATLAB基本使用的目标。

第一部分 简单的合成音乐

1.1 合成《东方红》

根据《东方红》第一小节的简谱和十二平均律计算出该小节每个乐音的频率,在MATLAB中生成幅度为1,抽样频率为8kHz的正弦信号表示这些乐音,用sound播放合成的音乐

由图可知《东方红》的曲调定为F,即1=F,对应的频率为349.23Hz,据此可以计算出其他乐音的频率,例如5对应的频率为,一次类推计算出第一小节各乐音对应的频率为:

乐音

5

5

6

2

1

1

6

2

频率

523.25

523.25

587.33

392

349.23

349.23

293.66

392

在确定了各乐音的频率之后需要确定每个乐音的持续时间。

每小节有两拍,一拍的时间是0.5s,因此各乐音的持续时间为:

乐音

5

5

6

2

1

1

6

2

时间

0.5

0.25

0.25

1

0.5

0.25

0.25

1

而在MATLAB中表示乐音所用的抽样频率为fs=8000Hz,也就是所1s钟内有8000个点,抽样点数的多少就可表示出每个乐音的持续时间的长短。

用一个行向量来存储这段音乐对应的抽样点,在用sound函数播放即可。

根据以上分析在MATLAB中编写如下程序:

sound_1_1.m

clear;clc;

fs=8000; %抽样频率

f=[523.25523.25587.33392349.23349.23293.66392];

%各个乐音对应的频率

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;

fornum=1:

N %利用循环产生抽样数据,num表示乐音编号

t=1/fs:

1/fs:

time(num)/fs; %产生第num个乐音的抽样点

east(n:

n+time(num)-1)=sin(2*pi*f(num)*t);

%抽样点对应的幅值

n=n+time(num);

end

sound(east,8000); %播放音乐

在MATLAB中运行sound_1_1.m,播放出了《东方红》的第一段,但是可以听出效果很不好,只能听出具有《东方红》的调子而已。

1.2除噪音,加包络

在1.1中听到有“啪”的杂声,下面通过加包络来消噪音。

最简单的包络为指数衰减。

最简单的指数衰减是对每个音乘以因子,在实验中首先加的是的衰减,这种衰减方法使用的是相同速度的衰减,但是发现噪音并没有完全消除,播放的音乐效果不是很好,感觉音乐起伏性不强。

于是采用不同速度的衰减,根据乐音持续时间的长短来确定衰减的快慢,乐音持续时间越长,衰减的越慢,持续时间越短,衰减的越快。

在1.1程序的基础上加上包络,编写如下程序:

sound_1_21.m

clear;clc;

fs=8000; %抽样频率

f=[523.25523.25587.33392349.23349.23293.66392];

%各个乐音对应的频率

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;

fornum=1:

N %利用循环产生抽样数据,num表示乐音编号

t=1/fs:

1/fs:

time(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);

end

sound(east,8000); %播放

plot(east);

播放后可以听出噪音已经消除,同时因为不同时长的乐音衰减的快慢不一样,音乐听起来更有起伏感,下图是加包络后的east图像。

更科学的包络如下图所示,每个乐音都经过冲激、衰减、持续、消失四个阶段。

由上图可以看出这个包络是四段直线段构成的,因此只要确定了每段线段的端点,即可用端点数据写出直线方程,因为直线方程可以用通式写出(我用的是斜截式),因此这段包络可以用简单的循环来完成。

例如认为包络线上的数据如下图所示:

据此在MATLAB中编写如下程序:

sound_1_22.m

clear;clc;

fs=8000; %抽样频率

f=[523.25523.25587.33392349.23349.23293.66392];

%各个乐音对应的频率

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;

fornum=1:

N %利用循环产生抽样数据,num表示乐音编号

t=1/fs:

1/fs:

(time(num))/fs; %产生第num个乐音的抽样点

P=zeros(1,time(num)); %P为存储包络数据的向量

L=(time(num))*[01/5333/1000333/5001];

%包络线端点对应的横坐标

T=[01.5110]; %包络线端点对应的纵坐标

s=1;

b=1:

1:

time(num); %产生包络线抽样点

fork=1:

4P(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);

endeast(n:

n+time(num)-1)=sin(2*pi*f(num)*t).*P(1:

time(num));

%给第num个乐音加上包络

n=n+time(num);

end

sound(east,8000);

plot(east);

运行得到的图像为:

下图是两个乐音交接处的局部放大图,可以看到前一个乐音一直衰减到0,后一个乐音从0开始增加,因此消除了噪音。

若不需要每个音都衰减到0,例如只需衰减到持续阶段幅值的20%,对程序做简单的修改即可,将T=[01.5110]改为T=[0.21.5110.2]运行得到的结果为:

由图可见,每个乐音都是衰减到一较小值而不是0,也能消除噪音,同时音乐听起来更加连续。

1.3 改变程序,实现1.2中的音乐升高和降低一个八度

升高一个八度即每个乐音的频率都提高一倍,变为原来的2被;降低一个八度即每个乐音的频率都减小一倍,变为原来的1/2。

因此最简单的办法是将存储乐音频率的向量每个元素改变为2或1/2倍。

即将程序中的f=[523.25523.25587.33392349.23349.23293.66392];改为

f=[523.25523.25587.33392349.23349.23293.66392]*2;或

f=[523.25523.25587.33392349.23349.23293.66392]/2;

将上述音乐上高半个音阶,即将频率变为原来的(1.06)倍,可以利用resamlpe函数对原来的数据点进行重采样来实现

east=resample(east,100,106);

因为resample进行重新采样后会使每个乐音的持续时间改变,但是因为升高半个音阶,频率改变不大,所以每个音的持续时间是基本不变的。

1.4 在1.2的音乐中加入谐波

在1.2的音乐中加上二、三、四次谐波,基波幅度为1,高次谐波幅度分别为0.2、0.3、0.1。

只需将1.2程序改为

sound_1_4.m

clear;clc;

fs=8000; %抽样频率

f=[523.25523.25587.33392349.23349.23293.66392];

%各个乐音对应的频率

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;

fornum=1:

N %利用循环产生抽样数据,num表示乐音编号

t=1/fs:

1/fs:

(time(num))/fs; %产生第num个乐音的抽样点

P=zeros(1,time(num)); %P为存储包络数据的向量

L=(time(num))*[01/5333/1000333/5001];

%包络线端点对应的横坐标

T=[01.5110]; %包络线端点对应的纵坐标

s=1;

b=1:

1:

time(num); %产生包络线抽样点

fork=1:

4P(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=[10.30.2]; %波形幅值矩阵

ss=zeros(1,length(t));

fori=1:

length(m)

ss=ss+m(i)*sin(2*i*pi*f(num)*t); %加谐波

end

east(n:

n+t

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1