EE103(1):librosa实现音频基本处理+乐音三要素原理解析

声音的向量表示

原理

  1. 向量x\in R^N表示时间区间上的音频信号x_i表示t=h_i时的声压x_i=\alpha p(h_i),i=1,...,N
  2. 每个x_i称为样本
  3. h(>0)为采样时间
  4. 1/h为采样率,典型的采样率为1/h=44100/sec48000/sec
  5. \alpha被称为比率因子

使用python的librosa库可以读取音频信号,并用matplotlib显示波形

y,sr = librosa.load("MUSIC STEM.wav",sr=None)   #y为长度等于采样率sr*时间的音频向量
plt.figure()
librosa.display.waveplot(y, sr) #创建波形图
plt.show()  #显示波形图

结果

在这里插入图片描述

分析

音频信号每一位分别对应一个采样点,其位数等于“采样率*音频时长(以秒为单位)”,记录了每个样本上音频的振幅信息

缩放音频信号

原理

音频的响度由音频信号每个样本的数值绝对值大小决定,因此对音频信号作代数乘法运算,可以增减音频的响度

numpy数组提供的代数乘法功能可以用于增减音频响度,并利用librosa库将音频向量写回文件

y=2*y   #增加一倍振幅
y=0.5*y #减小振幅为原来一半
y=-y    #翻转振幅
y=10*y  #大幅增加振幅
librosa.output.write_wav(dir,y,sr)  #将音频向量写回文件

结果

四种操作结果的波形分别如图所示

在这里插入图片描述
  1. y=2*y时,得到的音频响度略大于原音频
  2. y=0.5*y时,得到的音频响度略小于原音频
  3. y=-y时,得到的音频响度与原音频一致
  4. y=10*y时,得到的音频响度远大于原来音频

分析

  1. 音频信号每个样本的数值反应了振动离开平衡点的距离,即振幅,振幅越大,声音具有的能量越大,声音听起来响度就越大
  2. 对样本数值进行倍增,若倍增系数绝对值大于1则声音响度增加,若倍增系数绝对值小于1则声音响度下降
  3. 由于振动离开平衡点的距离是一个绝对值,因此倍增系数为负数时效果与倍增系数是其相反数时一致

线性组合和混音

原理

  1. 对多个音频信号进行线性运算y=a_1x_1+a_2x_2+...+a_kx_k可以实现混音

  2. 此时每个音频信号x_k称为音轨

  3. 混合后的结果y称为混合

  4. 每个系数a_k是音轨在混合中的权重

numpy数组提供的线性运算功能可以用于实现混音

再尝试人声与伴奏的混合,取一段人声轨和一段伴奏轨,分别赋予权重(0.25,0.75)、(0.5,0.5)、(0.4,0.6)进行线性混合

y=0.25*x1+0.75*x2
y=0.5*x1+0.5*x2
y=0.6*x1+0.4*x2

结果

波形图如下所示:


在这里插入图片描述

得到的音频为在伴奏上加上人声的效果

分析

  1. 音频是线性相加,得到的波形图中无法直观分出人声和伴奏,但由于人声和伴奏中各频率谐波分量与伴奏中不同,线性相加在频域被分配到了各频率谐波上,所以可以在频谱图上清晰区分出来

  2. 为了得到足够清晰的混音音频,需要不断更改每个混音音轨的权重以得到最适合的混合模式

拓展

虽然人声和伴奏中谐波分量基本不同,但相同频率上的相加也容易导致撞频的发生,使得混合的人声和伴奏难以区分,因此对于双声道音频,我们常常采用偏置的方法,为两个声道中人声和伴奏设不同的权重(通常一个声道人声大,一个声道伴奏声大)

形状为(2,n)的numpy数组可以用于容纳双声道音频信号。两个声道分别取权重(0.4,0.6)、(0.6,0.4)进行混合,波形如下:


在这里插入图片描述

乐音

  1. 对于声音信号p(t),若满足p(t+T)\approx p(t),其中周期T取值在0.0005秒到0.01秒之间,则p被视为乐音
  2. 周期长短(决定频率并)决定音高
  3. 每个周期内波形的特点决定了音色
  4. 乐音的能量决定了响度,即声压

音高

原理

  1. f=440Hz是中央A
  2. 一个八度在频率上翻了一倍
  3. 十二平均律中,每个半音在频率上翻了2^{1/12}
  4. 每个半音的距离就是黑白键上两个键之间的距离,从do到升do,各白键之间的差音为全全半全全全半,而每个全音中的半音被分到了黑键上
  5. 任意两个音之间的距离称为音程,音程的单位是,相同单音之间音程为1度,之后每差一个音级增加1度

实验步骤:

  1. 设置基频f为440Hz,用numpy以440Hz生成正弦函数
  2. 每隔1/44100s设置一个采样点,每间隔1s生成1s的440Hz正弦波
  3. 在这基础上,第n次生成时再生成1s频率为440·2^{(n-1)/12}Hz的正弦波,与原正弦波线性相加进行和弦,从而模拟小二度到纯八度的所有音程
x=np.empty((0,))    #生成空数组
for i in range(0,13):
    x1=np.linspace(0,1, num=44100, endpoint=True, dtype=float)  #生成采样点
    x1=5*np.sin(2*np.pi*440*np.power(2,i/12)*x1)+5*np.sin(2*np.pi*440*x1)   #生成波形与和弦
    x2=np.zeros((44100,))   #留空部分
    x=np.concatenate((x,x1,x2),axis=0)  #连接数组

结果

生成的26s音频中有13段不同音程的和弦,有的和弦听起来和谐,有的和弦听起来不和谐

分析

  1. 小二度音程(相差一个半音)、大七度音程(相差五个全音一个半音)是极不协和音程
  2. 大二度音程(相差一个全音)、小七度音程(相差五个全音)、三全音(三个全音)是不协和音程
  3. 小三度音程(相差一个全音一个半音)、大三度音程(相差两个全音)、小六度音程(相差四个全音)、大六度音程(相差四个全音一个半音)是不完全协和音程
  4. 纯四度音程(相差两个全音一个半音)、纯五度音程(相差三个全音一个半音)是完全协和音程
  5. 纯八度音程(相差六个全音)是极完全协和音程

音色

  1. 对于周期性信号p(t)=\displaystyle \sum_{k=1}^K (a_kcos(2\pi fkt)+b_ksin(2\pi fkt)),每个分解信号为谐波泛音

  2. f为频率

  3. a与b为谐波系数

  4. 在K足够大时,任意周期性信号都可以通过积分变换为这种形式

  5. 谐波振幅的配比决定了音色,对于每个频率由k决定的谐波,其谐波振幅为c_k=\sqrt{a_k^2+b_k^2},因此谐波振幅可以组成一个长度为k的向量c=(0.3,0.4,...),足够多的谐波以不同振幅数值混合可以组成不同音色

在220-11000Hz之间分别生成1、5、10、20、50个频段的正弦、余弦信号,随机生成谐波系数

结果

五种情况下混合波形图如下所示:

在这里插入图片描述

得到一段每隔1s播放1s不同音色音频的音频文件

分析

  1. 使用不同足够多的谐波以不同谐波系数混合可以组成不同音色音频
  2. 现实中已知乐器也可以利用频谱分析提取音色特征,供计算机再现
  3. 利用谐波原理可以制作各种各样的电子合成器,供作曲家使用
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 声音是因物体的振动而产生的一种物理现象。振动使物体周围的空气绕动而形成声波,声波以空气为媒介传入人的耳朵,于是人们...
    liwuwuzhi阅读 2,984评论 0 1
  • SoX(即 Sound eXchange)是一个跨平台(Windows,Linux,MacOS 等)的命令行实用程...
    rollingstarky阅读 38,049评论 0 22
  • 音频技术开发,我们得对声音有所了解,掌握音频的基础知识,这才能更好地去做技术开发。首先介绍音频基础知识,然后介绍音...
    安仔夏天勤奋阅读 7,753评论 3 18
  • 今天,是一个令我激动的日子! 昨天,更是个令我激动的日子!! 真心的,超级开心^0^~ 我从来没想过自己会收...
    奈何薇薇阅读 401评论 2 1
  • 今天 起床:4:00 就寝:10:30 天气:晴 心情:涩涩的眼睛,睁开刺眼~ 任务清单 昨日完成的任务,最重要的...
    早起布谷鸟阅读 86评论 0 1

友情链接更多精彩内容