理解Mel频谱图
“Mel”指的是梅尔频率刻度(Mel Frequency Scale),这是一种基于人类听觉感知方式的频率刻度。梅尔频率刻度旨在更好地模拟人耳对声音的感知,因为人类对频率的感知并不是线性的,而是对低频更敏感,对高频的感知则较为迟钝。在信号处理中,梅尔频谱图(Mel Spectrogram)通过将频谱图转换到梅尔频率刻度上,使得分析更加符合人类的听觉特性。
Signals 信号
信号是某一数量随时间变化的表现。对于音频来说,变化的数量是空气压力。我们如何以数字方式捕捉这些信息呢?我们可以对空气压力随时间的变化进行采样。采样数据的速率可以不同,但最常见的是44.1kHz,即每秒44,100次采样。我们所捕捉到的是信号的波形,这可以通过计算机软件进行解读、修改和分析。
import librosa
import librosa.display
import matplotlib.pyplot as plt
y,sr = librosa.load("01.wav")
plt.figure(figsize=(10,4))
plt.plot(y)
plt.title("Signal")
plt.xlabel("Time (samples)")
plt.ylabel("Amplitude")
plt.grid(True)
plt.tight_layout()
plt.show()
我们已经有了可以处理的音频信号的数字表示。欢迎来到信号处理领域!不过,您可能会想,我们如何从中提取有用的信息呢?看起来这就像一团乱麻。在这里,我们的朋友傅里叶就派上用场了。
The Fourier Transform傅里叶变换
音频信号由几个单一频率的声波组成。当我们随时间对信号进行采样时,只捕捉到其结果的振幅。傅里叶变换是一种数学公式,它可以让我们将信号分解为各个独立的频率及其对应的振幅。换句话说,它将信号从时域转换到频域。转换的结果称为频谱。
这是可能的,因为每个信号都可以分解为一组正弦波和余弦波,这些波相加后形成原始信号。这是一个非凡的定理,称为傅里叶定理。如果您想更直观地理解这个定理为何成立,可以点击这里。此外,3Blue1Brown也有一个关于傅里叶变换的精彩视频,如果您想了解更多,可以观看。
快速傅里叶变换(FFT)是一种能够高效计算傅里叶变换的算法,它在信号处理中被广泛应用。我将使用这个算法对我们示例音频的一个窗口段进行处理。
n_fft =1024
ft = np.abs(librosa.stft(y[:n_fft],hop_length= n_fft+1))
plt.figure(figsize=(10,4))
plt.plot(ft)
plt.title("Spectrum")
plt.xlabel("Frequency Bin")
plt.ylabel("Amplitude")
plt.grid(True)
plt.tight_layout()
plt.show()
The Spectrogram频谱图
快速傅里叶变换(FFT)是一个强大的工具,可以让我们分析信号的频率内容,但如果信号的频率内容随时间变化怎么办呢?大多数音频信号,如音乐和语音,都是这样的情况。这些信号被称为非周期信号。我们需要一种方法来表示这些信号随时间变化的频谱。您可能会想,“嘿,我们能不能通过对信号的多个窗口段执行FFT来计算多个频谱呢?”是的!这正是所做的事情,这个过程称为短时傅里叶变换(STFT)。FFT在信号的重叠窗口段上进行计算,我们得到的结果称为声谱图。哇!这包含了很多内容。有很多事情在这里发生,一个好的视觉展示是很有必要的。
你可以将声谱图想象成一堆叠加在一起的FFT。它是一种视觉化表示信号在不同频率下随时间变化的响度或振幅的方法。在计算声谱图时,还有一些额外的细节处理。y轴被转换为对数刻度,颜色维度则转换为分贝(可以将其视为振幅的对数刻度)。这是因为人类只能感知到非常小且集中的频率和振幅范围。
只需几行代码,我们就创建了一个声谱图。好的,我们快到达终点了!我们已经对“声谱图”部分有了扎实的理解,但“梅尔”是什么呢?
The Mel Scal 梅尔量表
研究表明,人类对频率的感知并不是线性的。我们在检测低频率差异方面比在高频率方面更敏感。例如,我们可以轻松分辨500 Hz和1000 Hz之间的差异,但几乎无法分辨10,000 Hz和10,500 Hz之间的差异,尽管这两对之间的距离是相同的。
1937年,Stevens、Volkmann和Newmann提出了一种音高单位,使得音高上的等距离对听者来说听起来同样遥远。这被称为梅尔刻度。我们对频率进行数学运算以将其转换为梅尔刻度。通过这种转换,音频信号的分析更加符合人类的听觉感知特性。
The Mel Spectrogram梅尔频谱图
梅尔声谱图是将频率转换为梅尔刻度的声谱图。我知道,是不是很有趣?谁能想到呢?令人惊讶的是,在经过所有这些思维体操来试图理解梅尔声谱图之后,它实际上只需要几行代码就可以实现。通过这种转换,我们可以更好地模拟人类的听觉感知,使得音频信号的分析更加直观和有效。
mel_spect = librosa.feature.melspectrogram(y=y,sr=sr,n_fft=2048,hop_length=1024)
mel_spect = librosa.power_to_db(mel_spect,ref=np.max)
plt.figure(figsize=(10,4))
librosa.display.specshow(mel_spect,y_axis="mel",fmax=8000,x_axis="time")
plt.title("Mel Spectrogram")
plt.colorbar(format="%+2.0f dB")
plt.grid(True)
plt.tight_layout()
plt.show()
总结
对于刚接触信号处理的人来说,这确实是大量的信息。不过,如果您继续回顾这篇文章中提出的概念(并花足够的时间思考它们),这些概念就会开始变得清晰!让我们简要回顾一下所做的事情。
a.对空气压力随时间的变化进行了采样,以数字方式表示音频信号。
b.我们使用快速傅里叶变换(FFT)将音频信号从时域映射到频域,并在音频信号的重叠窗口段上执行了这一操作。
c.我们将y轴(频率)转换为对数刻度,将颜色维度(振幅)转换为分贝,以形成声谱图。
d.我们将y轴(频率)映射到梅尔刻度上,以形成梅尔声谱图。
就是这样!听起来很简单,对吧?嗯,其实并不完全是这样,但我希望这篇文章能让梅尔声谱图看起来不那么令人生畏。我花了相当长的时间才理解它。不过,最终我发现梅尔并没有那么难以接近。