音乐合成实验
目录
音乐合成实验 1
摘要: 1
第一部分 简单的合成音乐 2
《东方红》 2
除噪音,加包络 3
, 8
%这段音乐的总抽样点数
east=zeros(1,N); %用 east向量来储存抽样点
n=1;
for num=1:N %利用循环产生抽样数据,nun表示乐音编号
t=1/fs:1/fs:time(num)/fs; %产生第 nun个乐音的抽样点
G=zeros(1,time( num)); %为存储包络数据的向量
G(1:time( nu m))=exp(1:(-1/time( num)):1/8000);
%产生包络点
east( n:n+time( nu m)-1)=s in (2*pi*f( num)*t).*G(1:time( num));
%合第nun个乐音加上包络
n=n+time( nu m);
end
sou nd(east,8000); %播放
plot(east);
3
播放后可以听出噪音已经消除,同时因为不同时长的乐音衰减的快慢不一样, 音乐听起来更有起伏感,下图是加包络后的 east图像。
2
1
0
-1
-2
0 1 2 3
4
x 10
-3
更科学的包络如下图所示,每个乐音都经过冲激、衰减、持续、消失四个阶
由上图可以看出这个包络是四段直线段构成的, 因此只要确定了每段线段的 端点,即可用端点数据写出直线方程,因为直线方程可以用通式写出(我用的是 斜截式),因此这段包络可以用简单的循环来完成。例如认为包络线上的数据如 下图所示:
据此在MATLA中编写如下程序:
clear;clc; fs=8000;
%抽样频率
f=[ 392 392];
%各个乐音对应的频率
time=fs*[1/2,1/4,1/4,1,1/2,1/4,1/4,1]; %各个乐音的抽样点数
N=le ngth(time); %这段音乐的总抽样点数
east=zeros(1,N); %用 east向量来储存抽样点
n=1;
for num=1:N %利用循环产生抽样数据,nun表示乐音编号
t=1/fs:1/fs:(time(num))/fs; %产生第 nun个乐音的抽样点
P=zeros(1,time( num)); %为存储包络数据的向量
L=(time( nu m))*[0 1/5 333/1000 333/500 1];
T=[0 1 1 0]; s=1;
b=1:1:time( nu m);
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)*o nes(1,L(k+1)-s))+T(k+1)* on es(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));
%合第nun个乐音加上包络
n=n+time( nu m);
end
sou nd(east,8000); plot(east);
运行得到的图像为:
2
2
-
-1
-
-2
0
II
■i:
4
X 10
下图是两个乐音交接处的局部放大图,可以看到前一个乐音一直衰减到 0,
后一个乐音从0开始增加,因此消除了噪音。
2
若不需要每个音都衰减到0,例如只需衰减到持续阶段幅值的20%对程序做
简单的修改即可,将T=[0 1 1 0] 改为T=[ 1 1 ] 运行得到的结果
为:
9
4
x 10
由图可见,每个乐音都是衰减到一较小值而不是 0,也能消除噪音,同时音 乐听起来更加连续。
改变程序,
升高
Matlab音乐合成实验报告 来自淘豆网m.daumloan.com转载请标明出处.