Matlab音乐合成实验报告(重大 通院)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

重庆大学Matlab音乐合成实验报告

班级:实验班

指导老师:***

学生: 覃继良

学号:********

重庆大学通信工程学院

音乐合成实验

介绍

本文共有三大部分:第一部分,简单的音乐合成;第二部分,用傅里叶变换分析音乐;第三部分,基于傅里叶级数的音乐合成。由潜入深,一步一步分析了用MATLAB 进行音乐合成的过程。通过本实验达到了加深对傅里叶级数和傅里叶分析的理解,熟悉对MATLAB 基本使用的目标。

第一部分 简单的合成音乐

1.1 合成《东方红》

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

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

在确定了各乐音的频率之后需要确定每个乐音的持续时间。每小节有两拍,一拍的时间是0.5s ,因此各乐音的持续时间为:

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

在用sound函数播放即可。

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

east1.m

clear;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)=sin(2*pi*f(num)*t);

%抽样点对应的幅值

n=n+time(num);

end

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

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

图1-1

由图1-1我们可以看到,每一个调子并没有能够区分出来,就是连续一片的。幅度也是相当的,都是1。

1.2 除噪音,加包络

在east1中,连接的音符产生了一个杂音,下面通过加包络来消噪音。

eα-因子,在实验中首先加最简单的包络为指数衰减。最简单的指数衰减是对每个音乘以t

e-的衰减,这种衰减方法使用的是相同速度的衰减,但是发现噪音并没有完全消除,的是 1.5t

播放的音乐效果不是很好,感觉音乐起伏性不强。于是采用不同速度的衰减,根据乐音持续时间的长短来确定衰减的快慢,乐音持续时间越长,衰减的越慢,持续时间越短,衰减的越快。在1.1程序的基础上加上包络,编写如下程序:

East2.m

clear;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个乐音的抽样点

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图像。

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

由上图可以看出这个包络是四段直线段构成的,因此只要确定了每段线段的端点,即可用端点数据写出直线方程,因此这段包络可以用简单的循环来完成。例如认为包络线上的数据如下图所示:

包络的通式可以这样表示

2111

21

()y y y x x y x x -=-+-

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

East3.m

clear;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); n=1;

for num=1:N

t=1/fs:1/fs:(time(num))/fs; P=zeros(1,time(num));

X=(time(num))*[0 1/5 333/1000 333/500 1]; Y=[0 1.5 1 1 0]; s=1;

b=1:1:time(num); for k=1:4

P(s:X(k+1)-1)=(Y(k+1)-Y(k))/(X(k+1)-X(k))*(b(s:X(k+1)-1)-X(k+1)*ones(1,X(k+1)-s))+Y(k+1)*ones(1,X(k+1)-s); s=X(k+1); end

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

sound(east,8000); plot(east);

相关文档
最新文档