matlab音乐合成报告.docx
- 文档编号:30057609
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:56
- 大小:468.21KB
matlab音乐合成报告.docx
《matlab音乐合成报告.docx》由会员分享,可在线阅读,更多相关《matlab音乐合成报告.docx(56页珍藏版)》请在冰豆网上搜索。
matlab音乐合成报告
MATLAB音乐合成综合实验
学院:
班级:
指导老师:
吴宪祥
同做者:
二0一六年十二月
摘要
本实验共有三部分:
1.简单的音乐合成;2.用傅里叶变换剖析音
乐;3.鉴于傅里叶级数的音乐合成。
一步一步剖析了用MATLAB进行音
乐合成的过程。
经过本实验达到加深对傅里叶级数和傅里叶剖析的理
解,熟习对MATLAB基本使用的目标。
该实验采纳MATLAB软件仿真来实
现。
第一,经过编程对一段真切的音乐进行剖析、办理,求得这段音乐
的基频、谐波重量、等数据;而后,经过对乐理的研究,依据剖析中求
得的数据编写程序,进行鉴于傅里叶剖析的音乐合成设计,并设计了
图形用户界面。
1.绪论
前言3
实验要求3
实验原理3
2.简单的合成音乐
乐理知识介绍..................................................
4
利用MATLAB实现音乐合成器,生成WAV文件.......................
5
除噪音,加包络................................................
5
音乐高升和降八度..............................................
9
加入谐波......................................................
9
3.用傅里叶变换剖析音乐
载入并播放11
办理realware11
剖析wave2proc的基波和睦波13
自动剖析的音调解节拍16
4.鉴于傅里叶级数的音乐合成
从头加谐波...................................................
17
经过音调信息弹奏《送别》.....................................
19
5.
制作GUI界面......................................................
20
6.
实验难点及问题...................................................
21
7.
实查收获.........................................................
22
1.绪论
1.1前言
信号与系统的观点及剖析方法宽泛应用于通讯、自动控制、航空航天、电子信息、地震学、生物工程等领域,所以“信号与系统”是一门电子信息学科有关专业的骨干技术课程。
MATLAB是国际上公认的优异的科技应用软件,跟着版本的不停升级,内容也在不停扩大。
鉴于MATLAB的音乐剖析与合成实验是针对“信号与系统”课程的要点和难点之一的傅里叶变换和傅里叶级数等内容而设计的。
因为该实验是真切音乐的实质应用,能够增进对傅里叶级数和傅里叶变换的理解,加深对信号剖析工程应用的理解,提高在信号剖析领域的应用能力。
1.2实验要求
1、3-5人一组,选择不同乐曲,利用MATLAB实现音乐合成器,生成WAV文件;
2、给乐音加包络消噪;
3、实现音乐的升八度和降八度;
4、在音乐中增添谐波;
5、用傅里叶级数剖析音乐的基频、音调解节拍;
6、模拟一些常用乐器(如钢琴、吉他等)实现音乐合成;
7、设计GUI界面;
8、提交设计报告。
1.3实验原理
傅里叶变换成立了信号频谱的观点。
所谓傅里叶剖析即剖析信号的频谱(频次组成)、频带宽度等。
要想合成出一段音乐,就要认识该段音乐的基波频次、谐
波组成等。
所以,一定采纳傅里叶变换这一工具。
关于连续时间信号f(t),其傅里叶变换为:
F(w)
jwt
f(t)edt
因为其变换两边的函数f(t)和F(w)都是连续函数,不合适于计算机办理。
MATLAB语言供给了符号函数FOURIER来实现傅里叶变换,但该函数需要信号的解
析表达式。
而工程应用中常常需要对抽样数据进行傅里叶剖析,这类状况下常常没法获得信号的分析表达式,一定采纳傅里叶变换的数值计算方法。
假如f(t)的主要取值区间为[t1,t2],定义T=t2-t1为区间长度。
在该区间内抽样N个点,抽样间隔为:
T
t
N
则有:
F(w)
N1
f(t1nt)e
jw(t1nt)
t
0
能够计算出随意频点的傅里叶变换值,假定F(ω)的主要取值区间位于[ω1,ω2],要计算此间均匀抽样的k个值,则有:
F(w1
N1
j(w1kw)(t1nt)
kw)t
0
f(t1nt)e
t
ww2w1
式中,k为频域抽样间隔。
2.简单的合成音乐
乐理知识介绍
乐音的基本特点能够用基波频次、谐波频谱和包络波形3个方面来描绘。
基波频次:
每个指定音调的唱名都对应固定的基波信号频次。
所谓唱名是指平常
读曲谱唱出的1(do)、2(re)、3(mi),每个唱名并未固定基波频次。
当指
定乐曲的音调时才知道此时唱名对应的频次值。
如C调“1”的基波频次为
261.63HZ,F调“1”的基波频次为349.23HZ,F调“5”的基波频次为。
谐波频谱:
在音乐领域中称谐波为“泛音”,由谐波产生的作用称为音色变化。
当指定音调以后,仅指定了乐音信号的基波频次,谐波状况并未说明。
各样乐器,如钢琴或单簧管,都能够发出某一音调下的唱名,而人的听觉会明显感觉二者不同,
这是因为谐波成分有所差别,频谱构造各异。
包络波形:
不同种类的乐器,包络形状也不同样。
在音乐合成实验中,为简化编程描绘,往常把复杂的包络函数用少许直线近似。
于是,乐音波形的包络呈拆线。
有时为了保证在乐音的毗邻处信号幅度为零,也能够用指数衰减的包络来表示,这也是最简单的方法。
利用MATLAB实现音乐合成器,生成WAV文件
而在MATLAB中表示乐音所用的抽样频次为fs=10000Hz,也就是所1s钟内有1000个点,抽样点数的多少便可表示出每个乐音的连续时间的长短。
用一个行向量来储存这段音乐对应的抽样点,在用sound函数播放即可。
依据以上剖析在
MATLAB中编写以下程序:
Clearclc;
fs=10000;
f=[78465978410478801047784784523587659587523587784659784104798888010477847845876596984945238801047104798888098810478809881047880880784659523587];
time=fs*[10.50.5211210.50.510.50.5410.50.510.5112
10.50.510.5411210.50.520.50.50.50.50.50.50.50.54];N=length(time);%这段音乐的总抽样点数
y=zeros(1,N);%用y向量来储藏抽样点
n=1;
fornum=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);
end
sound(y,fs);
Wavwrite(y,
’test4
’);
在MATLAB中运转,可是能够听出成效不是很好。
除噪音,加包络
下边经过加包络来消噪音。
最简单的包络为指数衰减。
最简单的指数衰减是
对每个音乘以et因子,在实验中第一加的是e1.5t的衰减,这类衰减方法使用
的是同样速度的衰减,可是发现噪音并无完整除去,播放的音乐成效不是很好,感觉音乐起伏性不强。
于是采纳不同速度的衰减,依据乐音连续时间的长短来确立衰减的快慢,乐音连续时间越长,衰减的越慢,连续时间越短,衰减的越快。
在1.1程序的基础上加上包络,编写以下程序:
加包络前:
clear;clc;
fs=10000;
f=[78465978410478801047784784523587659587523587784659784104798888010477847845876596984945238801047104798888098810478809881047880880784659523587];
time=fs*[10.50.5211210.50.510.50.5410.50.510.5112
10.50.510.5411210.50.520.50.50.50.50.50.50.50.54];N=length(time);%这段音乐的总抽样点数
y=zeros(1,N);%用y向量来储藏抽样点
n=1;
fornum=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);
end
sound(y,fs);
播放后能够听出噪音已经除去,同时因为不同时长的乐音衰减的快慢不同样,音乐听起来更有起伏感,下列图是加包络后的east图像(未放大):
更科学的包络以下列图所示,每个乐音都经过冲激、衰减、连续、消逝四个阶段。
由上图能够看出这个包络是四段直线段组成的,所以只需确立了每段线段的端点,即可用端点数据写出直线方程,因为直线方程能够用通式写出(我用的是斜截式),所以这段包络能够用简单的循环来达成。
比如以为包络线上的数据以下列图所示:
据此在MATLAB中编写以下程序:
clear;clc;
fs=10000;
f=[78465978410478801047784784523587659587523587784659784104798888010477847845876596984945238801047104798888098810478809881047880880784659523587];
time=fs*[10.50.5211210.50.510.50.5410.50.510.5112
10.50.510.5411210.50.520.50.50.50.50.50.50.50.54];
N=length(time);y=zeros(1,N);
%这段音乐的总抽样点数
%用y向量来储藏抽样点
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=[010.50.50];%包络线端点对应的纵坐标
s=1;
b=1:
1:
time(num);%产生包络线抽样点
fork=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);
end
sound(y,fs);
plot(y);
运转获得的图像为:
下列图是两个乐音交接处的局部放大图,能够看到前一个乐音向来衰减到0,后一个乐音从0开始增添,所以除去了噪音。
音乐高升和降八度
高升一个八度即每个乐音的频次都提高一倍,变成本来的2被;降低一个八度即每个乐音的频次都减小一倍,变成本来的1/2。
所以最简单的方法是将储存乐音频次的向量每个元素改变成2或1/2倍。
马上程序中的f=[78465978410478801047784784523587659587523587
78465978410479888801047784784587659698494
52388010471047
98888098810478809881047880880784659523587
]
改为
f=[78465978410478801047784784523587659587523587784659784
10479888801047784784587659698494
52388010471047988880988
10478809881047880880784659523587
]*2
或
f=[78465978410478801047784784523587659587523587784659784
10479888801047784784587659698494
52388010471047988880988
10478809881047880880784659523587
]/2.
将上述音乐上高半个音阶,马上频次变成本来的
21/12()倍,能够利用
resamlpe函数对本来的数据点进行重采样来实现,因为resample进行从头采样后会使每个乐音的连续时间改变,可是因为高升半个音阶,频次改变不大,所以每个音的连续时间是基本不变的。
加入谐波
在1.2的音乐中加上二、三、四次谐波,基波幅度为1,高次谐波幅度分别为0.2、0.3、0.1。
只需将1.2程序改为:
clear;clc;
fs=10000;
%抽样频次
f=[78465978410478801047784784523
587
659587
523587784659784
10479888801047784784587659
698494
52388010471047988880988
10478809881047880880784659
523587
];
4
1
0.50.51
0.50.50.50.54];
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:
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=[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+time(num)-1)=ss.*P(1:
time(num));
%加谐波
%给第num个乐音加上包络
n=n+time(num);
end
sound(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是怎么由realwave获得的。
利
用loadGuitar.mat;载入并用plot函数将realwave、wave2proc分别画出,获得以下两幅图
wave2proc
能够看到,wave2proc比realwave的周期性好得多,去掉了非线性谐波和噪声。
在时域做,从图上能够看到,realwave的数据大概是10个周期的共243个数
据,所以能够用resample函数对realwave进行从头采样,将采样点提高到250个,那么重采样后每个周期有25个点,将这25个点对应相加求均匀值后获得一个周期的值,因为进行了均匀,减小了非线性谐波和噪音,而后将这25个数据延托成十个周期即250个点,在利用resample函数对获得的函数从头采样将采样点数恢复
到243个。
依据以上剖析,编写实现这个思路的程序以下:
clear;clc;
loadGuitar.mat;
wave=resample(realwave,250,243);
%重采样,将点数变成
250
w=zeros(1,25);
fori=1:
25
fork=0:
9
w(i)=w(i)+wave(25*k+i);
%10个周期的对应点分别乞降
end
end
w=w/10;%取均匀值
wave2=repmat(w,1,10);%将1个周期的10个点延拓至250个点
wave2=resample(wave2,243,250);%重采样,将点数变回243
holdon,plot(wave2,'r'),holdoff;%将办理后的数据绘出,红色
holdon,plot(wave2proc);%将所给的数据绘出,蓝色
运转后的结果为:
由图可见,两组数据重合的很好,说明这类方法是很不错的方法。
剖析wave2proc的基波和睦波
为了剖析wave2proc的基波和睦波,能够对wave2proc进行傅里叶变换,获得
wave2proc的幅值谱,在频谱图上的第一个突出的波峰对应的频次即为wave2proc
基频,利用helpfft学习了MATLAB中迅速傅里叶变换函数fft的用法,编写了以下程序:
clear;clc;
loadGuitar.mat;
fs=8000;
NFFT=2^nextpow2(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=2^nextpow2(length(wave2proc))改为
NFFT=8^nextpow2(length(wave2proc))
获得的结果以下
;
由图可见固然频域的抽样频次提高了好多,可是获得的包络依旧不精准,这
是因为wave2proc是周期函数,可是此刻的wave2proc只有243个数据点,其实不可以
特别明显的表现出其周期性,所以它的幅值谱的失散化程度不高,固然提高了频
域的抽样频次,可是wave2proc数据点的周期性并无增添,所以要显示出失散
化程度高的幅值谱,就要增添wave2proc的周期性,即让wave2proc在时域重复多次后在进行傅里叶变换。
利用repmat函数能够将wave2proc在时域重复。
将程序改正为:
clear;clc;
loadGuitar.mat;
fs=8000;
wave2proc=repmat(wave2proc,20,1);%将wave2proc重复20次NFFT=2^nextpow2(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的基频为,幅值为0.05401,高次谐波幅值分别为:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab 音乐 合成 报告