《信号与系统实验》指导书
(补充材料)
音乐的分析与合成
李敏 张维维
大连民族学院
机电信息工程学院
2009 年 12 月
1.实验目的
(1)掌握傅里叶变换的物理意义,深刻理解傅里叶变换的内涵;
(2)了解乐理和电子音乐的基本知识;
(3)熟练运用 MATLAB 的基本指令及音乐处理指令;
(4)学习利用虚拟仿真技术分析音乐信号;
(5)加深学生对信号分析工程应用的理解,拓展学生在信号分析领域的应用能力。
2.实验内容
利用 MATLAB 编程对一段短时音乐进行分析与合成。首先,找出其每个音调的基波频率
及其谐波成份,从而确定该音乐的频带宽度;其次,根据分析的结果,合成出该段音乐;最
后,将合成音乐与真实音乐进行比较,做误差分析。
3.实验原理
(1)乐理知识介绍
乐音的基本特征可以用基波频率、谐波频谱和包络波形三个方面来描述。
① 基波频率
每个指定音调的唱名都有它对应固定的基波信号频率。图 1 所示为钢琴键盘结构,并注
明了每个琴键对应的音名和基波频率值。
图 1 钢琴键盘和相应频率
所谓唱名是指平日读乐谱唱出的 1(do)、2(re)、3(mi)、…。每个唱名并未固定基波
频率。当指定乐曲的音调时才知道此时唱名对应的频率值。如指定的乐曲为 C 调,图 1 中的
“中央 C”即为 C 调的 1,基波频率为 261.63Hz,而 F 调 1 的基波频率为 349.23Hz,5 的基
- 1 -
波频率为 523.25Hz。
如下的一系列 MATLAB 指令完成的是播放 C 调的 1、2、3、4、5、6、7 的一段音乐。
>> t=0:1/8000:0.5;
>> do=sin(2*pi*261.63*t);
>> re=sin(2*pi*293.66*t);
>> mi=sin(2*pi*329.63*t);
>> fa=sin(2*pi*349.23*t);
>> so=sin(2*pi*392*t);
>> la=sin(2*pi*440*t);
>> xi=sin(2*pi*493.88*t);
>> y=[do,re mi,fa,so,la,xi];
>> sound(y)
② 谐波频谱
在音乐领域中称谐波为“泛音”,由谐波产生的作用称为音色变化。
当指定音调之后,仅指定了乐音信号的基波频率,谐波情况并未说明。对于各种乐器如
钢琴或单簧管都可以发出某一音调下的唱名,而人的听觉会明显感觉两者不同,这是由于谐
波成分有所区别,频谱结构各异。例如单簧管的三次、五次谐波成分很强,其他各种乐器都
有自己的谐波分布规律。如果只考虑乐音的基波成分,每个唱名对应不同频率的正弦(余弦)
波,如上面的 MATLAB 指令;当引入谐波分量之后,波形不再是简单的正弦函数。
③ 包络波形
除了前述的基波频率和谐波频谱表征了乐音特性之外,对于不同类型的乐器,它们的包
络形状也不相同。图 2 所示为钢琴与管乐的波形,可以看出两者包络的区别。
图 2 钢琴和管乐的信号波形
在乐音合成实验中,为简化编程描述,通常把复杂的包络函数用少量直线近似。于是,
乐音波形的包络呈拆线,如图 3 所示。有时为了保证在乐音的邻接处信号幅度为零,也可以
用指数衰减的包络来表示,这也是最简单的办法。
- 2 -
图 3 乐音的拆线形包络
(2)音乐分析
傅里叶变换建立了信号频谱的概念。所谓傅里叶分析即分析信号的频谱(频率构成)、
频带宽度等。对音乐信号的分析也不例外。通过前面的介绍可知,要想合成出一段音乐,就
要了解该段音乐的基波频率、谐波构成等。因此,就必须采用傅里叶变换这一工具。
对于连续时间信号 )(tf ,其傅里叶变换
(F 为:
)
F
)
(
f
)(
et
t
j
dt
连续时间傅里叶变换特别适合于对时间连续信号的理论分析(如信号与系统课程中的内
容),但是,由于其变换两边的函数 )(tf 和
(F 都是连续函数,不适合于计算机处理。虽
)
然 MATLAB 语言提供了符号函数 fourier 来实现傅里叶变换,但该函数需要信号的解析表达
式。而工程应用中经常需要对抽样数据进行傅里叶分析,这种情况下往往无法得到信号的解
析表达式,因而必须采用傅里叶变换的数值计算方法。下面介绍傅里叶变换的数值方法。
如果 )(tf 的主要取值区间为[ 1t , 2t ],定义
T
t
2
t
1
为区间长度。在该区间内抽样 N
个点,抽样间隔为
t
T
N
,则有:
F
)
(
1
N
n
0
f
(
t
1
)
etn
(
j
t
1
tn
)
t
t
1
N
n
0
f
(
t
1
)
etn
(
j
t
1
tn
)
上式可以计算出任意频点的傅里叶变换值,假设
(F 的主要取值区间位于[ 1, 2 ],
)
要计算其间均匀抽样的k 个值,则有:
F
(
1
k
)
t
1
N
n
0
其中,
2
1
k
为频域抽样间隔。
k
()
1
t
1
tn
)
jetn
)
(
f
(
t
1
- 3 -
(3)相关的 MATLAB 函数及其功能
为方便使用 MATLAB 编写程序,在这里介绍几个声音信号分析与处理的 MATLAB 函数及其
功能,如表 1 所示。
表 1 相关的 MATLAB 函数及其功能
函 数
wavread
sound
kron
功 能
读.wav 文件
将向量转换成声音
函 数
resample
interp
功 能
改变信号的采样率
上采样(提高采样率)
矩阵的张量积(叉乘)
decimate
下打样(降低采样率)
表中各函数的具体调用方法请查询相关的参考资料或在 MATLAB 命令窗口下使用 help 命
令及相关帮助菜单获得,在此不再详述。
(4)注意事项
① 在对音乐信号进行分析时,要充分考虑所分析的采样数据点数是否为 MATLAB 软件所
能承受。如对音乐信号以 8000Hz 进行采样,那么在 1 秒钟的时间范围内,采样的数据点数
就有 8000 个,再对这些数据进行一系列的数学运算,其运行时间很长,此时 MATLAB 窗口底
部的状态条上显示 Busy 字样,应当使用 Ctrl+C 迅速中断程序的运行。因此,如果所分析的
音乐文件时间达数秒钟,则应将该文件进行时间分割,分成几个小段进行分析,每小段的时
间越少,分析速度越快。每小段的时间尽量不超过 0.5 秒,否则等待的时间太长,造成死机。
② 在分析音乐时,为防止漏掉基波频率,最好参考该音乐的时域波形,捕捉到每个音的
起始时间和持续时间,这样可以减少对音乐的分析时间,以免做无谓的分析。
③ 每个音的起始时间和持续时间在合成音乐的时候也是到至关重要的。因为每个音调都
有持续时间,该持续时间就是通常意义上的“拍子”,一拍大约是 0.5 秒。所以只有了解了每
个音的起始时间和持续时间,在音乐合成时才能正确地掌握各基波频率出现的前后顺序及其
节拍,以减少失真。
④ 乐音波形包络是描述乐音特性的一个重要因素。已知每个音的起始时间和持续时间,
就可以正确地对每个音合理地使用包络,确定每个音包络外形的各个参数。确定参数时,一
定要根据时域波形,通过音乐的时域波形可以判断该乐音是否在下一个乐音开始时衰减为零,
以减小音乐合成的误差。
⑤ 包络既可用拆线形也可采用指数衰减的方法,不管采用哪一种方法,关键的问题是如
何选择衰减系数。采用拆线方法虽然麻烦一些,但拆线的斜率可以根据时域波形来判断;若
采用指数衰减方法,如能确定衰减系数,就非常简单。采用指数衰减方法时,衰减系数可根
以后,可认为电路已趋稳定,其中,为 RC
3t
据电容充放电理论,即工程上认为,当
电路的时间常数, RC
。
⑥ 编写程序时,要求程序的可读性要强,要在关键的地方加注释说明。另外,程序不易
太长,应尽量编写 M 函数文件,以便在 M 程序文件中调用。
- 4 -
4.实验任务
(1)编制一通用的 MATLAB 程序,实现对教师提供的某一乐音进行短时分析与合成。具
体要求如下:
① 指出该乐音的基波频率、谐波谱结构,并画出该乐音的频谱图;
② 在一个图形窗口中比较原乐音与合成乐音的时域波形,指出异同点;
③ 分别播放原乐音和合成乐音,检验合成乐音的效果;
④ 指出合成乐音中出现的误差,并做误差分析。
(2)编制一通用的 MATLAB 程序,实现对教师提供的某一段短时音乐进行分析与合成。
具体要求如:
① 指出该段音乐的基波频率及频带宽度,并画出频谱图;
② 在一个图形窗口中比较原音乐与合成音乐的时域波形,指出异同点;
③ 分别播放原音乐和合成音乐,检验合成乐音的效果;
④ 指出合成音乐中出现的误差,并做误差分析。
5.思考题
(1)在合成音乐时,乐音波形包络既可以采用拆线形,也可以采用指数衰减形。针对本
实验中给出的音乐,请分别尝试一下哪种波形包络合成出来的音乐更适合。
(2)通过本次实验,谈谈对《信号与系统》这门课程或者对“傅里叶变换”这一知识点
的理解和认识。
- 5 -
参考文献
[1] 李敏,陈兴文. 信号分析与处理的软硬件实现[M]. 大连:大连海事大学出版,2009.
[2] 谷源涛等. 信号与系统——MATLAB 综合实验[M]. 北京:高等教育出版社,2008.
[3] 张明照等. 应用 MATLAB 实现信号分析和处理[M]. 北京:科学出版社,2005.
[4] 伯晓晨等. MATLAB 工具箱应用指南——信息工程篇[M]. 北京:电子工业出版社,
2000.
- 6 -