您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > matlab音乐合成报告
MATLAB音乐合成综合实验学院:班级:指导老师:吴宪祥同做者:二0一六年十二月摘要本实验共有三部分:1.简单的音乐合成;2.用傅里叶变换分析音乐;3.基于傅里叶级数的音乐合成。一步一步分析了用MATLAB进行音乐合成的过程。通过本实验达到加深对傅里叶级数和傅里叶分析的理解,熟悉对MATLAB基本使用的目标。该实验采用MATLAB软件仿真来实现。首先,通过编程对一段真实的音乐进行分析、处理,求得这段音乐的基频、谐波分量、等数据;然后,通过对乐理的研究,根据分析中求得的数据编写程序,进行基于傅里叶分析的音乐合成设计,并设计了图形用户界面。目录1.绪论1.1引言..........................................................31.2实验要求......................................................31.3实验原理......................................................32.简单的合成音乐2.1乐理知识介绍..................................................42.2利用MATLAB实现音乐合成器,生成WAV文件.......................52.3除噪音,加包络................................................52.4音乐升高和降八度..............................................92.5加入谐波......................................................93.用傅里叶变换分析音乐3.1载入fmt.wav并播放............................................113.2处理realware.................................................113.3分析wave2proc的基波和谐波....................................133.4自动分析fmt.wav的音调和节拍..................................164.基于傅里叶级数的音乐合成4.1重新加谐波...................................................174.2通过音调信息弹奏《送别》.....................................195.制作GUI界面......................................................206.实验难点及问题...................................................217.实验收获.........................................................221.绪论1.1引言信号与系统的概念及分析方法广泛应用于通信、自动控制、航空航天、电子信息、地震学、生物工程等领域,因此“信号与系统”是一门电子信息学科相关专业的主干技术课程。MATLAB是国际上公认的优秀的科技应用软件,随着版本的不断升级,内容也在不断扩充。基于MATLAB的音乐分析与合成实验是针对“信号与系统”课程的重点和难点之一的傅里叶变换和傅里叶级数等内容而设计的。由于该实验是真实音乐的实际应用,可以增进对傅里叶级数和傅里叶变换的理解,加深对信号分析工程应用的理解,提高在信号分析领域的应用能力。1.2实验要求1、3-5人一组,选择不同乐曲,利用MATLAB实现音乐合成器,生成WAV文件;2、给乐音加包络消噪;3、实现音乐的升八度和降八度;4、在音乐中添加谐波;5、用傅里叶级数分析音乐的基频、音调和节拍;6、模仿一些常用乐器(如钢琴、吉他等)实现音乐合成;7、设计GUI界面;8、提交设计报告。1.3实验原理傅里叶变换建立了信号频谱的概念。所谓傅里叶分析即分析信号的频谱(频率构成)、频带宽度等。要想合成出一段音乐,就要了解该段音乐的基波频率、谐波构成等。因此,必须采用傅里叶变换这一工具。对于连续时间信号f(t),其傅里叶变换为:dtjwtetfw)(F)(由于其变换两边的函数f(t)和F(w)都是连续函数,不适合于计算机处理。MATLAB语言提供了符号函数FOURIER来实现傅里叶变换,但该函数需要信号的解析表达式。而工程应用中经常需要对抽样数据进行傅里叶分析,这种情况下往往无法得到信号的解析表达式,必须采用傅里叶变换的数值计算方法。如果f(t)的主要取值区间为[t1,t2],定义T=t2-t1为区间长度。在该区间内抽样N个点,抽样间隔为:NTt则有:ttnjwetnfwttN)()(F1101)(可以计算出任意频点的傅里叶变换值,假设F(ω)的主要取值区间位于[ω1,ω2],要计算其间均匀抽样的k个值,则有:ttnkwjetntftwktwwN))(()1(F11101)(式中,k为频域抽样间隔。2.简单的合成音乐2.1乐理知识介绍乐音的基本特征可以用基波频率、谐波频谱和包络波形3个方面来描述。基波频率:每个指定音调的唱名都对应固定的基波信号频率。所谓唱名是指平日读乐谱唱出的1(do)、2(re)、3(mi)……,每个唱名并未固定基波频率。当指定乐曲的音调时才知道此时唱名对应的频率值。如C调“1”的基波频率为261.63HZ,F调“1”的基波频率为349.23HZ,F调“5”的基波频率为523.25HZ。谐波频谱:在音乐领域中称谐波为“泛音”,由谐波产生的作用称为音色变化。当指定音调之后,仅指定了乐音信号的基波频率,谐波情况并未说明。各种乐器,如钢琴或单簧管,都可以发出某一音调下的唱名,而人的听觉会明显感觉两者不同,这是由于谐波成分有所区别,频谱结构各异。包络波形:不同类型的乐器,包络形状也不相同。在音乐合成实验中,为简化编程描述,通常把复杂的包络函数用少量直线近似。于是,乐音波形的包络呈拆线。有时为了保证在乐音的邻接处信号幅度为零,也可以用指数衰减的包络来表示,这也是最简单的办法。2.2利用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.511210.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);endsound(y,fs);Wavwrite(y,’test4’);在MATLAB中运行,但是可以听出效果不是很好。2.3除噪音,加包络下面通过加包络来消噪音。最简单的包络为指数衰减。最简单的指数衰减是对每个音乘以te因子,在实验中首先加的是1.5te的衰减,这种衰减方法使用的是相同速度的衰减,但是发现噪音并没有完全消除,播放的音乐效果不是很好,感觉音乐起伏性不强。于是采用不同速度的衰减,根据乐音持续时间的长短来确定衰减的快慢,乐音持续时间越长,衰减的越慢,持续时间越短,衰减的越快。在1.1程序的基础上加上包络,编写如下程序:加包络前:clear;clc;fs=10000;f=[78465978410478801047784784523587659587523587784659784104798888010477847845876596984945238801047104798888098810478809881047880880784659523587];time=fs*[10.50.5211210.50.510.50.5410.50.510.511210.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);endsound(y,fs);播放后可以听出噪音已经消除,同时因为不同时长的乐音衰减的快慢不一样,音乐听起来更有起伏感,下图是加包络后的east图像(未放大):更科学的包络如下图所示,每个乐音都经过冲激、衰减、持续、消失四个阶段。由上图可以看出这个包络是四段直线段构成的,因此只要确定了每段线段的端点,即可用端点数据写出直线方程,因为直线方程可以用通式写出(我用的是斜截式),因此这段包络可以用简单的循环来完成。例如认为包络线上的数据如下图所示:据此在MATLAB中编写如下程序:clear;clc;fs=10000;f=[78465978410478801047784784523587659587523587784659784104798888010477847845876596984945238801047104798888098810478809881047880880784659523587];time=fs*[10.50.5211210.50.510.50.5410.50.510.511210.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: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);endy(n:n+time(num)-1)=sin(2*pi*f(num)*t).*P(1:time(num));%给第num个乐音加上包络n=n+time(num);end
本文标题:matlab音乐合成报告
链接地址:https://www.777doc.com/doc-2344733 .html