python - Python 音频分析,频谱图:我应该使用哪个频谱图,为什么?
问题描述
我正在大学做我的最后一个项目:使用卷积神经网络 (CNN) 从歌曲录制中进行音高估计。我想检索歌曲录音中存在的音高。对于 CNN 输入,我使用的是频谱图。
我正在使用以音高向量作为数据标签的 MIR-QBSH 数据集。在将音频处理到 CNN 之前(每个音频在.wav
8 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 的输入,我为什么要使用该频谱图类型?我目前很难找到它们的差异,以及它们的优缺点。
解决方案
推荐阅读
- r - shinyApp :获取文件夹作为输入,并将文件夹内的文件用作 R 函数的输入
- r - 使用 rowMeans() 进行故障排除 - 'x' 必须是至少包含二维的数组
- apache-kafka - Kafka Stream Reducer 没有减少记录
- android - 在 kotlin 迁移后 Crashitycs 报告错误的行号
- excel - 使用 vba 将文件从不同的文件夹循环复制到另一个文件夹
- java - 河内塔之类的
- android - 如何为所有系统语言启用活动
- android - 是否可以使用 ARCore 在存储的图像上“应用”AR?
- google-sheets - 将单元格公式字符串的一部分格式化为超链接
- sumologic - 如何使用 NQL 在相扑逻辑中设置警报