《数字信号处理》课程设计
说明书
设计题目:基于MATLAB 的简单音乐合成
姓名:_________________________________________
专业年级:______________________________________
学号:_________________________________________
指导老师:______________________________________
时间:2015 年 6 月25 日
《数字信号处理课程设计》任务书
指导老师(签名):
1设计基础....................................
1.1 MATLAB软件简介..............................
1.2乐曲解析..................................
2设计与实现...................................
2.1 简单的音乐合成 ................................
2.1.1原理分析 ................................
2.1.2 Matlab 源代码 ..............................
2.1.3运行结果分析 ...............................
2.2除噪音,加包络.................................
2.2.1原理分析 ................................
2.2.2 Matlab 源代码 ..............................
2.2.3运行结果分析 ..............................
2.3加谐波....................................
2.3.1原理分析 ................................
2.3.2 Matlab 源代码 ..............................
2.3.2运行结果分析 .............................. 3总结与体会...................................
4参考文献....................................
1 设计基础
1.1 MATLAB 软件简介
MATLAB 是matrix&laboratory 两个词的组合,意为矩阵工厂(矩阵实验室MATLAB 工作界面)。是由美国mathworks 公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB 和Mathematica、Maple 并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB 可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB 的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB 来解算问题要比用C,FORTRAN 等语言完成相同的事情简捷得多,并且MATLAB 也吸收了像Maple 等软件的优点,使MATLAB 成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN ,C++,JAVA 的支持。可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB 函数库中方便自己以后调用,此外许多的MATLAB 爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。
1.2 乐曲解析
乐音的基本特征可以用基波频率、谐波频率和包络波形三个方面来描述,我们用大写英文字母CDEFGAB 表示每个音的“音名”(或称为“音调”),当指定某一音名时,它对应固定的基波信号频率。
图 1 表示钢琴的键盘结构,并注明了每个琴键对应的音名和基波频率值。这些频率值是按“十二平均律”计算导出,下面解释计算规则:
图1-1 钢琴键盘和相应频率
从图1-1可以看到,靠下边的A键称为小字组A,它的频率值fA0= 220Hz,而靠上面的另一个A键是小字一组A,它的频率值是fA仁440Hz。两者为二倍频率关系,即fA1相当于fA0的二次谐波。也称为8度音或倍频程Octave(即我们画频响特性图时所用的术语
“倍频程” )。
根据《两只老虎》简谱和十二平均律计算出该小节每个乐音的频率,在MATLAB 中生成幅度为1,抽样频率为8000kHz的正弦信号表示这些乐音,用sou nd播放合成的音乐
图1-2乐曲《两只老虎》曲谱
由图可知《两只老虎》的曲调定为C,即仁C,对应的频率为261.63Hz,据此可以计算出其他乐音的频率,类推计算出各乐音对应的频率见表1-1部分乐音对应的频率:
表1-1部分乐音对应的频率
在确定了各乐音的频率之后需要确定每个乐音的持续时间。每小节有两拍,一拍的时间是0.5此部分乐音的持续时间见表1-2部分乐音对应的时间:
表1-2部分乐音对应的时间
而在MATLAB中表示乐音所用的抽样频率为fs=8000Hz,也就是所1s钟内有8000个点,抽样点数的多少就可表示出每个乐音的持续时间的长短。用一个行向量来存储这段音乐对应的抽样点,在用sounc函数播放即可。
根据以上分析在MATLAB中编写如下程序:
soun d_1_1.m
clear;clc;
fs=8000; %抽样频率
f=[261.63 293.66 329.63 261.63 261.63 293.66 329.63 261.63 329.63 349.23
392 329.63 349.23 392];
%各个乐音对应的频率
time=fs*[0.5 , 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1, 0.5,0.5,1]; %各个乐音的抽样点数
N=length(time); %这段音乐的总抽样点数east=zeros(1,N); %用eas向量来储存抽样点n=1; for num=1:N %利用循环产生抽样数据,num表示乐音编号
t=1/fs:1/fs:time(num)/fs; %产生第num个乐音的抽样点
east( n:n+time( nu m)-1)=si n(2*pi*f( nu m)*t);
%抽样点对应的幅值
n=n+time( nu m);
end
soun d(east,8000); %播放音乐
2设计与实现
2.1简单的音乐合成
根据《两只老虎》片段的简谱和“十二平均律”计算出该片段中各个乐音的频率,在MATLAB中生成幅度为1、抽样频率为8000kHz的正弦信号表示这些乐音。请用sound函数播放每个乐音,听一听音调是否正确,最后用这一系列乐音信号拼出《两只老虎》片段,注意控制每个乐音持续的时间要符合节拍,用sou nd函数播放合成的乐音。
2.12 Matlab 源代码
clear;clc; fs=8000; %抽样频率
f=[261.63 293.66 329.63 261.63 261.63 293.66 329.63 261.63 329.63 349.23
392 329.63 349.23 392];
%各个乐音对应的频率
time=fs*[0.5,0.5, 0.5,0.5, 0.5,0.5, 0.5,0.5,0.5,0.5,1,0.5,0.5,1]; %各个乐音的抽样点数
N=le ngth(time); n=1;
for num=1:N %利用循环产生抽样数据,num表示乐音编号
t=1/fs:1/fs:time(num)/fs; %产生第num个乐音的抽样点east( n:n+time( nu m)-1)=si
n(2*pi*f( nu m)*t);
%抽样点对应的幅值
n=n+time( nu m); end
soun d(east,8000); %播放音乐
2.1.3运行结果分析
初步合成的音乐音调符合曲谱,能听出《两只老虎》的旋律。
2.2除噪音,加包络
2.2.1原理分析
你一定注意到⑴的乐曲中相邻乐音之间有“啪”的杂声,这是由于相位不连续产生了高频分量。这种噪声严重影响合成音乐的质量,丧失真实感,下面通过加包络来消
噪音。
t 最简单的包络为指数衰减。最简单的指数衰减是对每个音乘以e「t因子,在实验-1 5t
中首先加的是e .的衰减,这种衰减方法使用的是相同速度的衰减,但是发现噪音并没有完全消除,播放的音乐效果不是很好,感觉音乐起伏性不强。于是采用不同速度的衰减,根据乐音持续时间的长短来确定衰减的快慢,乐音持续时间越长,衰减的越慢,
持续时间越短,衰减的越快。
2.2.2 Matlab 源代码
clear;clc; fs=8000;
%抽样频率
f=[261.63 293.66 329.63 261.63 261.63 293.66 329.63 261.63 329.63 349.23 392 329.63 349.23 392]; %各个乐音对应的频率
time=fs*[0.5 ,0.5,0.5,0.5, 0.5,0.5,0.5,0.5, 0.5,0.5,1,0.5,0.5,1];%各个 乐音的抽样点数
%各个乐音对应的频率
N=length(time); % 这段音乐的总抽样点数 xio=zeros(1,N); %用east 向量来储存抽样点 n=1;
for num=1:N %利用循环产生抽样数据, num 表示乐音编号
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)*ones(1,L(k+1)-s))+T(k+ 1)*ones(1,L(k+1)-s);
%包络线直线方程通式
s=L(k+1);
end laohu (n:n+time(num)-1 )=sin(2*pi*f(num)*t).*P(1 :time(num)) ;
%给第 num 个乐音加上包络
n=n+time(num); end
sound(laohu ,8000); plot(laohu );
wavw ri t e ( laohu , ' laohu 2')
t=1/fs:1/fs:(time(num))/fs; P=zeros(1,time(num)); L=(time(num))*[ 0 1/5 3/8 5/8 1];
T=[0 1.5 1 1 0];
s=1; b=1:1:time(num); for
%产生第 num 个乐音的抽样点
%P 为存储包络数据的向量
%包络线端点对应的横坐标
%包络线端点对应的纵坐标
%产生包络线抽样点