河北经贸大学毕业论文
5 MATLAB音乐合成系统的设计与实现
5.1 简单合成及处理音乐模块的设计与实现
通过给定的音乐简谱和掌握的乐理知识与频谱分析来进行简单音乐的合成。并且在此基础上对音乐进行相应的处理,来比较经不同处理后的音乐播放效果。 5.1.1 合成《社会主义好》
依据音乐《社会主义好》一小段的音乐简谱和国际规定的十二平均律的计算方法对应地得到此小段音乐中各个唱名的频率,利用MATLAB软件来编程仿真实现音乐的简单合成。音乐简谱如图5-1所示。
图5-1 音乐简谱
由图5-1可知《社会主义好》的曲调定为G,也就是说1=G,那么可以知道其对应的频率为329.1Hz,其中 6是低音的意思,即对应G调“6”的频率659.26Hz, 取其频率的一半,即659.26/2=329.63Hz。
根据“十二平均律”计算得到各个唱名对应的频率如下表5-1。
表5-1 唱名对应的频率表
唱名 频率 3 493.88 3 493.88 3 493.88 5 587.33 3 493.88 2 440 1 392 6 ??1 392 2 440 3 493.88 329.63 得到该小段音乐各个唱名对应的频率之后,还有很重要的一个数据需要得到,那就是根据乐理知识推算出各个唱名对应的持续时间。由图5-1中1=G2/4可以知道各唱名的持续时间如下表5-2所示。
11
河北经贸大学毕业论文 表5-2 唱名持续时间表
唱名 时间 3 0.25 3 0.25 3 0.25 5 0.25 3 0.75 2 0.25 1 0.25 6 0.25 1 0.25 2 0.25 3 1 依据上述得到的数据可以编写如下程序。
function button1_Callback(hObject, eventdata, handles)%简单音乐的合成 global flag global west fs f time f_flag; f lag = 1; f_flag=0;
fs=8000; %该段音乐抽样的频率
f=[493.88 493.88 493.88 587.33 493.88 440 392 329.63 392 440 493.88]; %各个唱名所对应的频率值
time=fs*[1/4,1/4,1/4,1/4,3/4,1/4,1/4,1/4,1/4,1/4,1]; %各个唱名的持续时间 N=length(time); %这段音乐的总抽样点数 west=zeros(1,N); %用west向量来储存抽样点 n=1;
for a=1:N %利用循环产生抽样数据,a表示乐音编号 t=1/fs:1/fs:time(a)/fs; %产生第a个乐音的抽样点 west(n:n+time(a)-1)=sin(2*pi*f(a)*t); %抽样点对应的幅值 n=n+time(a); end
5.1.2 加包络,除噪音
在MATLAB中,播放出了《社会主义好》的第一小节,但可听出声音不是很好,只能听出具有《社会主义好》的调子而已。会听到有“啪”的杂声,声音比较刺耳,下面通过加上外形相似的包络来消噪音,使不同音的连接处的响度为零即可。编写如下程序。
function button4_Callback(hObject, eventdata, handles)%音乐的降噪
global flag
global west fs f time f_flag; if flag ==1 f_flag=0;
N=length(time); %这段音乐的总抽样点数
12
河北经贸大学毕业论文
west=zeros(1,N); %用west向量来储存抽样点 n=1;
for a=1:N %利用循环产生抽样数据,a表示乐音编号 t=1/fs:1/fs:time(a)/fs; %产生第a个乐音的抽样点 G=zeros(1,time(a)); %G为存储包络数据的向量 G(1:time(a))=exp(1:(-1/time(a)):1/8000);%产生包络点 west(n:n+time(a)-1)=sin(2*pi*f(a)*t).*G(1:time(a));
n=n+time(a); end
加包络后的仿真时域波形如图5-2所示。
图5-2 音乐降噪时域图形
由图可见,通过加包络,使每个音的连接处的幅度有所减小,使音乐听起来更加连续,悦耳。 5.1.3 音乐升降度处理
升高一个八度即每个唱名的频率都提高一倍,变为原来的2倍;降低一个八度即每个唱名的频率都减小一倍,变为原来的1/2。因此最简单的办法是将存储该段音乐的各个乐音频率的向量中每个元素改变为原来的2或1/2倍即可。编写程序如下。
function button6_Callback(hObject, eventdata, handles)%音乐升八度
13
河北经贸大学毕业论文
global flag %定义全局变量 global west fs time f_flag; if flag ==1 f_flag=1;
f=[493.88 493.88 493.88 587.33 493.88 440 392 329.63 392 440 493.88]*2; %频率 升高
N=length(time); %这段音乐的总抽样点数 west=zeros(1,N); %用west向量来储存抽样点 n=1;
for a=1:N %利用循环产生抽样数据,a表示乐音编号 t=1/fs:1/fs:(time(a))/fs; %产生第a个乐音的抽样点 P=zeros(1,time(a)); %P为存储包络数据的向量
L=(time(a))*[0 1/5 333/1000 333/500 1];%包络线端点对应的横坐标 T=[0.2 1.5 1 1 0.2]; %包络线端点对应的纵坐标 s=1;
b=1:1:time(a); %产生包络线抽样点 for 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
west(n:n+time(a)-1)=sin(2*pi*f(a)*t).*P(1:time(a)); n=n+time(a); end
将音乐升八度之后的仿真时域波形如下图5-3所示。
14
河北经贸大学毕业论文
图5-3 音乐升八度时域图
同样地,将音乐进行降八度处理只需改变上述程序中的一条语句即可。即将f=[493.88 493.88 493.88 587.33 493.88 440 392 329.63 392 440 493.88]*2改为: f=[493.88 493.88 493.88 587.33 493.88 440 392 329.63 392 440 493.88]/2。 5.1.4 音乐加谐波处理
在5.1.1的音乐中加上二、三、四次谐波,基波幅度为1,高次谐波幅度分别
为0.2、0.3、0.1。主要的功能程序如下。
function button5_Callback(hObject, eventdata, handles)%音乐加谐波 m=[1 0.3 0.2]; %波形幅值矩阵 ss=zeros(1,length(t)); for i=1:length(m)
ss=ss+m(i)*sin(2*i*pi*f(a)*t); %加谐波 end
west(n:n+time(a)-1)=ss.*P(1:time(a)); n=n+time(a); end
加入谐波之后的仿真时域波形如图5-5。
15