大家好,欢迎来到IT知识分享网。
【实例简介】
适用于北京大学、清华大学的matlab大作业(已知的),主要是对乐音做分析,入门的matlab写法
t=| linspace(0,14-1/819214*8192);%14秒,采样率为8192,保证一秒换一次
y(t<1)=sin(174.61*2*p*t1<1);%F其实就是其频率的正弦波,时长一秒,8192个点
y(1<=t&t<2)=sn(196*2*pi*(1
%G
y(2<=t&t<3)=sn(220*2*pi*t(2<=t&t<3)
A
y(3=t&t4)=sin(24694*2*pi*t(3<=t&t4)
%oB
y(4<=t&t<5)=sn(261.63*2*pi*t(4<=t&t<5)
%C
y(5<=&t<6)=sn(29366*2*pi↑t(5
y6二&t7)=sin(32963*2*pi*t(6
y(7<=t&t<8)=sn(34923*2*p*t(7
y(8=t&t9)=sn(392*2*pi*t(8<=t&t9);
YoG
y(9
y(10
y(11
y(12
y(13<=t&t<14)=sin(659.25*2*pi*t(13<=&t<14);%E
soundly
通过如上代码的编写,弄清楚了音调和节奏的原理。即采样率不同频率也会不同,譬如
如果要以&KHz的频率演奏音乐,那么采样率设为8K,此时得到的音调才会是对应的
但由于以是基波,甚为难听,高频异常刺耳,难以受,音节转换之间听到‘嗒’的声
音,分析认为是频率转换过程中造成的高频成分
用这种基波编写段《天空之城》:
使用简谱为C调,4/4拍,即4分音符为一拍,每小节有4拍,T=90,每分钟90拍,
一拍为075秒
音符长短如下图表示
首符名称
法
全音符
四拍
二分音符
二拍
四分音符
八分音符
甲拍
十六分音符
四分之一推
三十二分音符
八分之一抱
X·=X+X
.=X+
将简谱化为看得懂的,每个字母代表半拍(0.375秒),加A表示高音,加表示低音
7Fx137
3
化为:AB|^C~ CACBAC^ C AEAE| BBBBBBEE
6
56
5
434
化为: AAAGAAACAC| GGGGGGFE| FFFEFFACAC
共1575秒,将其实现,频率与音调的对应关系如下
E
13081
14683
164.81
174.61
196
220
246.94
C
E
4
5
6
261.63
293.66
329.63
349.23
392
440
493.88
C
F
523.25
587.33
659.25
69846
78399
880
987.77
t= clinspace(O,15.751/81921575*8192);
y(t<0.375=sn(440*2*pt(t0375);
%A13
y(0.375<=&t<0.75)=sin(49388*2*p*t(0.375<=t&t<0.75);
B14
y(0.75
%3*AC15
y(1875
%B14
y(2.25
%2*^C15
y(3<=t&t<3.75)=in(659.25*2*p*t(3
%2*AE17
y(3.75<=t&t<6)=sin(49388*2*pi*t(3.75<=t&t<6)
%6*B14
y(6
%2*E10
y675
%3*A13
y(7875
%G12
y(825
%2*A13
y(9<=t&t<975)=sin(523.,25*2*p*t(9<=t&t<975)
%2*AC15
y(9.75
%6*G12
y(12<=t&t<12.375)=sin(34923*2*pi*t(12<=t&t<12375);
%F11
y(12.375-&t1275-in(392.63*2*pit(12.375-t&t1275);%E10
y(1275
%6*F11
y(15
%2*AC15
soundly
的过渡声。
前面编写程序过于复杂繁琐,现在将其优化,由于以半拍为单位基本够用,所以考虑以
半拍为基本单位,时间构成一个向量。对于各个音调,应该将其单元化,这样用起来就方便
随意组合,初步设想将频率单元化,用大数组的方式使得不同时期得到不同的频率,具体实
现方式如下
D(2)
E(3)
F(4)
G(5)
A(6)
B(7)
13081
14683
164.81
174.61
196
220
246.94
C(8)
D(9)
E(10)
F(1)G(12)A(13)B(14)
3
5
6
261.63
293.66
329.63
34923
392
440
493.88
C(15)
D(16)
E(17)^F(18)~G(19)^A(20)
B(21)
523.25
587.33
659.25
69846
78399
880
987,77
t= linspace(021-1/8192,21*8192);
for n=1: 21
u{n}=(t>(n-1)&t
end
a=[130.81*2pi,146.83*2*pi,164.81*2“pi,174.61*2*pi196*2*pi,220*2*pi,246942*pi,
26163*2*pi,293.66*2*pi,329.63*2*pi,349.23*2“pi,392*2*pi,440*2*pi,49388*2*pi,
523.25*2*pi587.33*2*pi,65925*2*pi,69846*2*pi,783.99*2*pi,880*2*pi,987.77*2*pi]
a(22)=0;%构造一个22音调的数组,当需要不同的音调时,选不同的指针便可以
song-[123456789101112131415161718192021%使用不同的指针得到不同音调
y=0*t;
for n=1: 21
y=y+(sin(a(song (n)).t)).u(nb:
plot(y);
sound( y, 8192)
如上,便实现22个音符封装,只需改变song的序列就可以得到不同的音调排序,但发
现不好调节速度,需要更好的方式,现在将 sound的频率改为8000,通过该采样率可
以改变速度,例如1到2的中间有400点,则1到2为05秒
time_1=42;%半节拍数,以半节拍作为基本的单位
t= clinspace( O time_1-1/3000time_1*3000)%采样频率8000,半拍3000,为0.375秒,适
节拍90的曲子,天空之城钢棽曲单手版就是这个节奏
for n=1: time 1
u{n}=(t>(n-1)&t
end
a=[13081*2*pi,146.83*2*pi,164.81*2*pi,174.61*2*pi,196*2*pi,220*2*pi,246.94*2*pi,
26163*2*pi,293.66*2*pi,329.63*2*pi,349.23*2*pi,392*2*pi,440*2*pi,493.88*2*pi,
523.25*2*pi,587.33*2*p,65925*2*pi,698.46*2*pi,783.99*2*pi,880*2*pi,98777*2*pi]
a(22)=0
sang=[1314…
1515151415151717
1414141414141010
1313131213131515
1212121212121110
1111111111111515];
for n=1: time 1
y=y+(sin(0.375+a(song(n)+t)*un];%乘以半节拍的时间, point
end
sound(y, 8000)
如上所示,实现了各个音调的合成与播放,对频率有了初步的了解,其中的关键点则是
播放采样率与所设置的音调数组的采样率的关系,最后认为使用8KHz的釆样率是比较好的
方案。卜面的工作也是基于8KHz的采样率来做的
2、增加谐波分量提升音乐的厚度
即在里面加入高次谐波,例如次谐波、三次谐波、四次谐波等等,首先做一次尝试,
在上面的代码基础上稍微做一些修改既可
time1=42;%半节拍数
t=linspace(o, time_ 1-1/3000, time_1*3000)
for n=1: time 1
u{n}={t>(n-1)&t
end
a=[13081*2*pi,146.83*2*pi,16481*2*pi,174.61*2*pi,196*2*pi,220*2*pi,246.94*2*pji
26163*2*pi,293.66*2*pi,329.63*2*pi,349.23*2*pi,392*2*pi,440*2*pi,493.88*2*pi,
52325*2*pi,587.33*2*pi,659.,25*2*p69846*2*pi783.992*pi,880*2“pi,987.77*2*pi,]
a(22)=0
song=[1314
1515151415151717
1414141414141010
1313131213131515
1212121212121110
1111111111111515
y=0*t;
for n=1: time 1
y=y+(sin(0.375*a(song(n)*t)+0.4*sin(0.75*a(song(n)*t)…%一次、二次谐波
+03sin(1.125*a(song(n).*t)…
%三次谐波
+02*sin(15*a(Song(n).*t)…
%四次谐波
+0.1*sin(1875*a(song(n).*t)…
%五次谐波
+0.05*sin(225*a(ong(n).*t)
%六次谐波
+0.02*sin(2.625*a(song(n).*t).*u{n};%乘以半节拍的时间七次谐波
end
sound(y, 8000)
加上了谐波之后的声音的确厚度增加了,比前面的声首要好听不少,但是离钢琴的声首
差距还是比较人的,虽然尝试了很多种不同的谐波比例,但是始终得不到合适的比例,哲时
不追求得到钢琴声,留在后面得到钢琴的频谱再做处理
3、修正包络控制音量的变化和停顿及叠接部分的时间
经过不断调试,声音比较好听了,不过离钢琴声还有好远
先做简易的包络,每个音符没有交叠,将两边做平缓,前500个由0至1,即斜率为1/500,
后500个由1至0,斜率为-1/500
time_1=42;%半节拍数
t=linspace( 0, time_1-1/ 3000, time_1*3000)
for n=1: time 1
u{n}=(t>(n-1)&t
end
baoluo=ones(30001);%做包络之用
temp_1=[0:0.0021]
forn=1:500
baoluo(n=temp 1(n);
baoluo(3001-n =temp 1(n);
en
fun_1=eros(126000,1);
for n 0=1: time 1
forn1=1:3000
fun_1(n_0-1)*3000+n_1)= baoluo(n_1);
end
a=[13081*2*pi,14683*2*pi16481*2*pi,174.61*2*pi,196*2*pi,220*2*pi,24694*42*pi,
26163*2*p,293.66*2*pi,329.63*2*pi349.23*2*pi392*2*pi,440*2*pi,49388*2*pi,
523.25*2*p,587.33*2*pi,659.25*2*pi,69846*2*pi,783.99*2*pi,880*2*pi,
98777*2*pi]
a(22)=0;
song-[1314…
1515151415151717
1414141414141010
1313131213131515
1212121212121110.
1111111111111515};
0*t
y_1=0*t;
for n=1: time 1
y=y+(sin(0.375*a(song(n).*t)+0.4*sn(0.75*a(song(n).*t)….%一次、二次谐波
+0.3*sin(1.125*a(song(n)*t)…
%三次谐波
+0.2*sin(15*a(song(n).*t)
%四次谐波
+0.1*sin(1875*a(song(n)*t)
%五次谐波
+0.05*sin(225*a(song(n).*t)…
%六次谐波
+002*sin(2625+a(song(n)*t)*Un;%乘以半节拍的时间七次谐波
%(接下面
for n=l:time 1*3000
%(接上面)
y 1(n=yn*fun 1(n);
end
plots_ 1)
sound(y_1,8000)
整个时间序列的包络
加上包络时候的音频信号
虽然做了包络,每个音都清楚了,而且消除了“嗒”声,但是尼玛节奏感都化为一波一波的
听全拍或者两拍音时效果很差,这样完全没有了那种演奏的感觉。
认为需要将每一个音调单元化,这样调用起来就比较好办,最好是每一个音调就是完全
的,直接可以演奏的。直接写成函数
function diao = diao( x
diao summary of this function goes here
号得到不同频率的序列
t=1 Inspace(0,1-1/3C00,3000)
diaO=Sin(x×2*p立t);
⊙n
d
而对于包络,需要更好的包络,使用老师pt里演示的包络
音量
冲激菜减线消失产我减持续消失
时间
第n个乐音
逖接
第n+1个乐音
部分
自定义一下,首先每个半拍仍然保持3000点,迭接部分设为500点,一共是3500点
个音,冲击500点,袞减500点,持续1500点,消失1000点,最高为1.6,如此构造
个包络,得到如下图形
函数如下所示,实现了每个带包络的音调的单元化
【实例截图】
【核心代码】
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14427.html