【Day18-音调】我们怎麽听出来不同音高的差别?——python中对於声音频率的处理

昨天我们针对声音讯号的基本处理做了一些简单的介绍,知道了声音是一连串随着时间变化的讯号所组成的,同时可以透过傅立叶分析的方式来得到同一个时刻不同音高成分的分布。今天我们会再针对不同的音高去做进一步的讨论

不同的音高听起来差多少?

我们知道声音比较高的频率对应的就是频率比较高的声音,但对於不同频率的声音听起来差多少呢?这边就要提到了人类对於不同音调之间感受度的假设:

人类对於低频率声音之间的分辨力较好,对高频率之间的分辨力较差。

上面这个看起来似乎有点难理解,我这边举一个例子好了:

假设你今天口袋只有100块钱,掉了10块钱对你来说感觉会很心痛
但如果你今天口袋有10000块钱,那掉了10块前的感觉就会小得多

根据频率保留不同比例的资讯——MFCC转换

根据前面的结论,因此我们会期待有一种方式

  • 可以用占用空间尽量少的方式记录声音的特徵
  • 对於频率低的部分解析度比较高,反之亦然

因此这边我们用了数组随着频率分布越高就越广的滤波器来对原始声音讯号做转换,就可以将本来的讯号用非常少的尺寸储存,并且可以有对於不同时刻频率分布的特徵

mfccs = librosa.feature.mfcc(y=sound, sr=sr, n_mfcc=12)# librosa有有内建转换函数
print("原始讯号尺寸:", sound.shape)
print("转换成mfcc尺寸:", mfccs.shape)

输出:

原始讯号尺寸: (393330,)
转换成mfcc尺寸: (12, 769)

绘制一下mfcc强度图

import seaborn as sns
sns.heatmap(mfccs).invert_yaxis()

输出:

根据音高改变窗口的转换——CQT转换

前面提到了我们可以针对不同的频率去做不同解析度的filter来取得特徵,那这边再提及另一个角度的调整,这边的思考角度来自於我们在做STFT的时候会需要有一个时间窗口来转换一段时间变成一段频率的分布,但其实对於不同频率的声音我们要取得有效的转换所需的长度又不太一样,因此就提出了具有以下特性的常数Q转换(Constant Q Transfrom):

  • 转换讯号的窗口长度会随着不同的频率而变化
  • 转换出来的频率是处於对数尺度上

正是因为这样的特性,对於现代大多数基於十二平均律的音乐来是非常适合的。

import numpy as np
cqts = librosa.cqt(y=sound, sr=sr,pad_mode='wrap') # 常数Q转换
cqts_abs = np.abs(cqts)

# 绘制一下CQT转换强度图
fig, ax = plt.subplots()
img = librosa.display.specshow(librosa.amplitude_to_db(cqts_abs, ref=np.max),
                               sr=sr, x_axis='time', y_axis='cqt_note', ax=ax)
ax.set_title('Constant-Q power spectrum')
fig.colorbar(img, ax=ax, format="%+2.0f dB")

输出:

参考资料


<<:  [Day 18] Migration

>>:  【程序】软件测试 Testing 转生成恶役菜鸟工程师避免 Bad End 的 30 件事 - 20

知识真的有办法管理吗?

开宗明义就以「知识」是什麽?作为开场序幕 你所认定的IT管理层面的知识是 资料库里的知识 学术篇章的...

【JavaScript】用debugger进行除错

【前言】 本系列为个人前端学习之路的学习笔记,在过往的学习过程中累积了很多笔记,如今想藉着IT邦帮忙...

教练,我想创业...

近期接触到了这本书:「麻省理工 MIT 黄金创业课」 透过六大面向以及二十四个步骤来系统性地提升创业...

Day 17 - Linux 上设定 PBR

我们需要使用 FRRouting,若还没安装的话,请先安装一下 这次使用的系统为 Ubuntu 20...

CISSP很难考吗?

不难,考CISSP需要的只是时间。需要多长的时间来准备CISSP考试,取决於您的背景、学习策略、执...