matlab音乐合成报告.docx

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

matlab音乐合成报告.docx

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

matlab音乐合成报告.docx

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,高次谐波幅值分别为:

 

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

当前位置:首页 > 经管营销 > 公共行政管理

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

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