基于傅里叶变换的儿歌音乐合成研究
2017-02-26湖南省长沙师范学院初等教育系罗湘娟
湖南省长沙师范学院初等教育系 陈 丽 罗湘娟 刘 苏
基于傅里叶变换的儿歌音乐合成研究
湖南省长沙师范学院初等教育系 陈 丽 罗湘娟 刘 苏
本文探讨了傅里叶变换在音乐合成中的应用,揭示了音乐信号是由一系列振幅和频率不一的正弦波叠加且带有不同包络修饰形成的,进而采用曲线拟合来定音乐的包络。以傅里叶变换来研究儿歌的音乐合成,从数学的角度生动直观地展示了数学与儿童音乐结合的无穷魅力。
傅里叶变换;音乐合成;包络
一、问题的提出
通过广泛地研究近年来说话人识别中常用的特征参数和建模方法,在处理语音数据时,主要提取基于 Mel 频率的倒谱系数(MFCC)作为语音的特征参数,高斯混合模型(GMM)作为语音描述的模型。在研究说话人识别和高斯混合模型(GMM)在流行音乐中运用的基础上,提出用曲线拟合的方法获得儿童音乐的包络,然后将得到的音乐信号进行快速傅里叶变换(FFT)计算其频谱,从而获得音乐发音的谐波,在MATLAB软件中用wavplay语句实现傅里叶级数合成音乐的数字信号。
二、问题的分析
通过观察发现音乐中伴奏部分和歌唱部分数据的谱分布明显不同,由于人声带的快速振动,歌唱声音的谱几乎总是谐波,并且在频谱的低频和中频部分,基频的整数倍频率处能量通常较大.与歌唱声音相比较,伴奏声音突出的谐波较少,其能量分布范围也更广。声音是气压随着时间t的波动行为,是一种随着时间t变化的连续信号,音乐是靠声音发出的,是一系列振幅和频率不一的正弦波叠加形成的。为了得到波形音频文件,可以使用音频转化软件将其他格式的音频转化成波形音频,在数学建模领域中,用MATLAB语言wavread读出音乐,用曲线拟合的方法获得音乐的包络,通过傅里叶变换获得音乐的频谱图,分析频谱图获得音乐的谐波,最后实现音乐的合成。
三、简单的音乐合成
根据《两只老虎》第一小节的简谱和十二平均律计算出该小节每个乐音的频率,在MATLAB中生成幅度为1,抽样频率为8kHz的正弦信号表示这些乐音,用sound播放合成的音乐。曲调为C的两只老虎的简谱为 |1231|1231|345-|345-|,因此可以得到每个乐音对应的频率分别1=262.63Hz,2=263.66Hz,3=329.63Hz,4=349.23hZ,5=292Hz。每小节有四拍,一拍的时间是0.5s,因此各乐音的持续时间为1→0.5,2→0.5,3→0.5,1→0.5,1→0.5,2→0.5,3→0.5,1→0.5,3→0.5,4→0.5,5→1,3→0.5,4→0.5,5→1。在MATLAB中编写以下程序,就可以完成两只老虎的音乐合成:
clear;clc; fs=8000; f=[262.63 293.66 329.63 262.63 262.63 293.66 329.63 262.63 329.63 349.23 392];time=fs*[1/2,1/2,1/2,1/2,1/2,1/2,1/2,1/2,1/2,1/2,1,1/2,1/2,1]; N=length(time);east=zeros(1,N);n=1;for num=1∶N t=1/fs∶1/fs∶time(num)/fs;
G=zeros(1,time(num));G(1∶time(num))=exp(1∶(-1/time(num))∶1/8000);east(n∶n+time(num)-1)=sin(2*pi*f(num)*t).*G(1∶time(num)); n=n+time(num);end sound(east,8000);plot(east);
四、利用傅里叶变换合成音乐
为了分析wave2proc的基波和谐波,可以对wave2proc进行傅里叶变换,利用MATLAB中快速傅里叶变换函数fft可以看出包络,但是非常不明显,因此将抽样频率由NFFT=2^nextpow2(length(wave2proc))改为NFFT=8^nextpow2(length(wave2proc)),虽然频域的抽样频率提高了很多,但是得到的包络依然不精确,这是因为wave2proc是周期函数,要想显示出离散化程度高的幅值谱,就要增加wave2proc的周期性,即让wave2proc在时域重复多次后再进行傅里叶变换。利用repmat函数可以将wave2proc在时域重复,再经过傅里叶变换可以看出幅值谱的离散化程度已经非常高了。wave2proc的基频为329.1Hz,幅值为0.05401,高次谐波幅值分别为:谐波2是0.07676,谐波3是0.04841,谐波4是0.0519,谐波5是0,谐波6是0.005709,谐波7是0.01923,谐波8是0.006741,谐波9是0.007326。 将音频信号导入后得到的是一个向量,它包含了这段音乐的所有信息,要自动分析这段音乐的音调,就需要将每个音调对应的点进行傅里叶变换得到其幅值谱,在幅值谱上找到第一个幅值较大的极大值点,该点对应的就是该音调的基频,得到基频后就可以得到高次谐波的幅值。为了使对每个音调进行傅里叶变换后得到的幅值谱离散程度高,应该将每个音调的数据在时域上重复多次,由于这些点都是直接采集的,没做处理,因此其重复次数应该足够大才能体现出较强周期性,本实验采用重复1000次,若所有点的幅值都小于0.02,那么用0.015作为幅值的限定条件,这样就将音调基频确定出来了。为了去顶节拍,可以将确定出的基频的误差设为 1Hz,程序确定的基频为200Hz,那么k次谐波对应的频率范围是k*(200-1)到k*(200+1),在这个区间中继续找幅值的极大值点就是k次谐波对应点。
利用傅里叶变换分析提取了这些音频信号对应的基频和各次谐波相对应的幅值,再用wavplay语句对合成音乐进行了播放,合成了完整的一首儿歌。
[1]基于数学建模的数学实验[M].北京: 中国铁道出版社,2014.
[2]李丽娟.基于高斯混合模型流行音乐中歌唱部分的智能检测.小型微型计算机系统,2009.
陈丽(1984-1),女,汉族,湖南长沙人,硕士,助教,主要研究方向:概率论与数理统计】