📜  放大 librosa.display.specshow() - Python (1)

📅  最后修改于: 2023-12-03 14:54:47.537000             🧑  作者: Mango

在Python中使用librosa.display.specshow()放大频谱图

在音频处理中,librosa是一个非常强大的Python库。librosa中的display模块提供了一个用于绘制音频谱图的函数specshow(),可以可视化音频信号的特征,如时域、频域、Mel频率倒谱系数、色度频率倒谱系数等。specshow()函数还提供了一些参数,可以方便地调整绘制出的谱图的显示范围。本篇文章将介绍如何使用librosa.display.specshow()来放大频谱图。

安装librosa库

使用specshow()函数需要安装librosa库。可以使用以下命令在终端中安装:

pip install librosa
准备一个音频文件

在本例中,我们将使用名为sample.wav的音频文件。请确保该文件存在于您的工作目录中。可以使用以下命令从文件中读取数据:

import librosa

# 从文件中读取音频数据
y, sr = librosa.load('sample.wav')

其中,y是音频数据的一维数组,sr是采样率。

绘制默认的频谱图

要绘制默认的频谱图,请调用specshow()函数并传递y和sr参数。默认情况下,specshow()将使用STFT分析并绘制线性频谱图。

import matplotlib.pyplot as plt
import librosa.display

# 绘制默认的频谱图
plt.figure(figsize=(10, 4))
librosa.display.specshow(librosa.amplitude_to_db(librosa.stft(y), ref=np.max), y_axis='linear', x_axis='time', sr=sr)
plt.colorbar(format='%+2.0f dB')
plt.title('Linear-frequency power spectrogram')
plt.show()

其中,使用amplitude_to_db()函数将线性谱转换为对数谱。

放大特定的频率范围

要放大特定的频率范围,可以使用specshow()函数的freq_limits参数。freq_limits参数接受一个元组,指定要绘制的频率范围。以下代码显示如何将特定频率范围内的音频绘制为谱图。

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(15, 5))

# 绘制原始谱图
librosa.display.specshow(librosa.amplitude_to_db(librosa.stft(y), ref=np.max), y_axis='linear', x_axis='time', sr=sr, ax=ax[0])
ax[0].set(title="Original spectrogram")

# 绘制放大后的谱图
librosa.display.specshow(librosa.amplitude_to_db(librosa.stft(y), ref=np.max), y_axis='linear', x_axis='time', sr=sr, freq_limits=(3000, 4000), ax=ax[1])
ax[1].set(title="Magnified spectrogram")

plt.show()

在此示例中,放大了特定的频率范围(3000-4000Hz)。可以看到,放大后的谱图更清晰,可以方便地查看特定频率范围的细节信息。

改变时间分辨率

要改变时间分辨率,可以使用specshow()函数的hop_length和win_length参数。跳跃长度(hop_length)指定STFT窗口之间的帧偏移量;窗口长度(win_length)指定STFT窗口的尺寸。以下代码将窗口长度设为1024,跳跃长度设为512。

plt.figure(figsize=(10, 4))
librosa.display.specshow(librosa.amplitude_to_db(librosa.stft(y, hop_length=512, win_length=1024), ref=np.max), y_axis='linear', x_axis='time', sr=sr)
plt.colorbar(format='%+2.0f dB')
plt.title('Linear-frequency power spectrogram')

通过这种方式改变时间分辨率,可以获得更好的时域细节,并获得更高的频谱分辨率。

通过librosa.display.specshow()使用Python在音频处理中放大频谱图的方法已经介绍完毕。specshow()函数提供了一些非常有用的参数,可以方便地调整绘制出的谱图的显示范围。可以使用这些参数来查看和理解音频数据的特征。