首页 > 解决方案 > Python 音频分析,频谱图:我应该使用哪个频谱图,为什么?

问题描述

我正在大学做我的最后一个项目:使用卷积神经网络 (CNN) 从歌曲录制中进行音高估计。我想检索歌曲录音中存在的音高。对于 CNN 输入,我使用的是频谱图。

我正在使用以音高向量作为数据标签的 MIR-QBSH 数据集。在将音频处理到 CNN 之前(每个音频在.wav8 KHz、8 位、单声道文件中的持续时间为 8 秒),我需要将音频预处理为频谱图表示。

我找到了 3 种生成频谱图的方法,代码如下所示。我在此代码中使用的音频示例可在此处获得。

进口:

import librosa
import numpy as np
import matplotlib.pyplot as plt
import librosa.display
from numpy.fft import *
import math
import wave
import struct
from scipy.io import wavfile

频谱图 A

x, sr = librosa.load('audio/00020_2003_person1.wav', sr=None)

window_size = 1024
hop_length = 512 
n_mels = 128
time_steps = 384 

window = np.hanning(window_size)
stft= librosa.core.spectrum.stft(x, n_fft = window_size, hop_length = hop_length, window=window)
out = 2 * np.abs(stft) / np.sum(window)

plt.figure(figsize=(12, 4))
ax = plt.axes()
plt.set_cmap('hot')
librosa.display.specshow(librosa.amplitude_to_db(out, ref=np.max), y_axis='log', x_axis='time',sr=sr)
plt.savefig('spectrogramA.png', bbox_inches='tight', transparent=True, pad_inches=0.0 )

频谱图 B

x, sr = librosa.load('audio/00020_2003_person1.wav', sr=None)
X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
# plt.figure(figsize=(14, 5))
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')

频谱图 C

# Read the wav file (mono)
samplingFrequency, signalData = wavfile.read('audio/00020_2003_person1.wav')
print(samplingFrequency)
print(signalData)

# Plot the signal read from wav file
plt.subplot(111)
plt.specgram(signalData,Fs=samplingFrequency)
plt.xlabel('Time')
plt.ylabel('Frequency')

频谱图结果显示如下: 频谱图结果

我的问题是,从我上面列出的 3 个频谱图中,哪个频谱图最适合用于 CNN 的输入,我为什么要使用该频谱图类型?我目前很难找到它们的差异,以及它们的优缺点。

标签: pythonaudioconv-neural-networkspectrogram

解决方案


推荐阅读