首页 > 编程知识 正文

matlab讲解,matlab演奏音乐原理

时间:2023-05-04 00:38:27 阅读:210299 作者:1955

/*仅当作学习笔记,若有纰漏欢迎友好交流指正,此外若能够提供一点帮助将会十分荣幸*/

 

摘要:本文首先对钢琴结构以及matlab发声原理进行简单介绍。然后利用matlab拟合钢琴的发声,基于十二平均律利用sound函数编曲,并利用包络函数对钢琴声音进行优化。

图1 Matlab发声基本流程图 

关于钢琴的基础知识 1钢琴的基本结构

1、拥有88个琴键,其中52个白色琴键,36个黑色琴键。第1号琴键为A2,第88号琴键为c5

图2 钢琴琴键与大谱对照表

2、第1号琴键A2为最低音,发出乐音的基频为27.5Hz,第88号琴键c5为最高音,发出乐音的基频为4186.01Hz。

3、钢琴上存在着一个国际基准音,为第49号琴键a1,也就是小字一组的第6个白键,其发出乐音的基频为440Hz(也称作标准音)

4、钢琴是遵循十二平均律制制作的乐器,钢琴上每相邻的两个琴键(包括黑、白琴键)的频率差异称为半音。半音是十二平均律体系中最小的频率差异距离,即最小的音高距离。将一个八度音程十二等分为十二个半音,其数学意义为:

八度音程指的是从基频至两倍频率的范围。因此在八度音程中分为十二等分乃是把这个频率范围分为十二个等比级数,其结果就是每个后续音的基频为前一个音的1.059463 倍。

、分别为前后两个音

表1 十二平均律对照表

2利用matlab模拟钢琴发声的原理

声音是一种常见的物理现象。物体机械振动形成声波,借助空气媒介,传至人类的耳膜,引起神经反射,被人类感知为声音,人脑又对声音信号快速翻译成人类可以理解的语言、音乐和各种已知的声音。人类能感知的声音在每秒振动数为20-20000次左右,即20 Hz-20000 Hz的频率范围。

音乐中使用的乐音通过长期改良、调整,已形成了固定组合,能够表达作曲者的感情,传递作曲者的思想,形成音乐文化。考虑到人耳对声波频率的感知能力,音乐乐音被限定在27-4100 Hz的频率范围内,超过这个频率范围,人类不能清晰地感知,对表现塑造音乐形象的意义不大。

乐器的乐音音高特征对应振动频率

乐音音长特征对应振动的持续时间长短

乐音的音强特征对应振动的振幅

乐音的音色特征对应着振动的频谱分布

因此乐音特征由振动波的频率、时长、振幅、频谱四种物理量所决定。乐音四种物理量是乐器具有完美表现与感染效果不可缺失的四大元素,所以对乐音的研究,应首先从物理学入手。物理学研究发现,声音的音高和声波的振动频率关系密切,琴弦振动时,观察振动的波形图,两个相邻同方向峰值之间的间隔时间称为振荡周期,琴弦振动周期越短,则振动频率越高,表现为产生的声音音高越高。

简而言之,要想利用matlab简单的发出一段声音,只要找到该声音对应的频率、音长,并且最好利用包络函数稍加润色,然后利用程序进行相应发声即可。

正文 1乐曲识谱

这里以孙燕姿《遇见》的第一句歌词为例,其对应简谱见下图3。

图3 《遇见》第一句歌词简谱

《遇见》为一首四四拍(四分音符为一拍,每小节四拍)的乐曲。在第一节中前3个“0”表示休止符,“5 3”表示两个八分音符。(由于这里是音乐简谱相关知识,就不班门弄斧了,故不作过多介绍)

2根据十二平均律表找到每个音对应频率

为了便于计算,这里我们取《遇见》的曲调为1=C(与实际乐谱中的曲调不相同),即简谱音符”1”对应“do”。我们取中音区的小字一组,查看表1,即音符”1”对应的频率为523Hz。以此类推计算出第一句歌词中各乐音对应的频率如表2所示。

5

3

3

5

2

2

3

2

2

1

1

784

659

659

784

587

587

659

587

587

523

523

表2 《遇见》第一句歌词对应音符频率

3将频率以及音长(节奏)信息输入到一个函数中存储

为了能够利用sound函数播放声音,需满足sound(y,Fs)的结构,其中 Fs代表采样率,取为Fs=8192(matlab的默认采样率区间为1000-38400,超出这个区间就不能播出声音了)。而y代表音频信号矩阵,我们将前面得到的音符频率代入到正弦函数中得到一个信号值:

并且,为了使音乐具备基础的节奏(即使得每一个音符有长有短),我们引入另外一个量rhythm,它用于控制每个音符的长度。例如二分音符对应的rhythm值就大于四分音符对应的rhythm值。则音频信号矩阵y就可以表示为:

4利用包络函数润色声音

利用plot函数,可得信号矩阵y对应的声音波形为:

图4 未进行包络处理的声音波形

从上图中的波形可以看出,声音几乎没有起伏,声音播放出来人耳也只会听到一段长长的“哔”,这显然是8行的,于时在此基础上我们利用包络函数对其进行润色。最常见的包络函数为指数衰减,最简单衰减方式是对每个音乘以因子。当我们对原始信号使用函数进行包络,得到的波形为

图5 包络函数处理后的声音波形

5利用sound函数进行发声

接下来的工作就很机械了,我们只需要将上面根据谱子得到的音符频率、音长等信息导入正弦函数,然后利用包络函数润色,并最终利用sound(y,Fs)函数发声即可。

展示部分程序:《遇见》主程序:Fs=8192;%听见 冬天 的离开y1=gen_wave_C5(8,0.5);y2=gen_wave_C5(5,0.7);y3=gen_wave_C5(8,0.5);y4=gen_wave_C5(3,0.7);y5=gen_wave_C5(5,0.5);y6=gen_wave_C5(3,0.55);y7=gen_wave_C5(1,0.7);y=[y1,y2,y3,y4,y5,y6,y7];%我在某年某月 醒过来y1=gen_wave_C5(1,0.4);y2=gen_wave_C4(12,0.5);y3=gen_wave_C4(10,0.4);y4=gen_wave_C4(12,0.5);y5=gen_wave_C5(1,0.4);y6=gen_wave_C4(12,0.5);y7=gen_wave_C5(1,0.5);y8=gen_wave_C5(3,0.5);y9=gen_wave_C5(5,0.65);y=[y,y1,y2,y3,y4,y5,y6,y7,y8,y9];%播放声音sound(y,Fs);《遇见》gen_wave函数程序(包括指数衰减包络处理)%音调函数C5(音高,节奏)function y= gen_wave_C5( tone,rhythm )%定义采样频率Fs=8192;x=linspace(0,2*rhythm*pi,floor(rhythm*Fs));%floor朝负无穷方向取整,保证采样频率为整%定义基础音阶对应的频率(C,C#,D,D#,E,F,F#,G,G#,A,A#,B)freqs=[521,556,586,618,660,695,742,782,835,880,927,990];%声音y=sin(freqs(tone)*x).*exp(-1*x);end

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。