簡體   English   中英

如何使用python繪制頻譜或頻率與整個音頻文件的幅度的關系?

[英]How to plot spectrum or frequency vs amplitude of entire audio file using python?

我有一些音頻文件,我想使用PYTHON(librosa庫)繪制音頻文件的平均頻譜,例如“音頻”軟件。 我可以看到它們正在繪制整個音頻的平均頻率與幅度圖。

在此處輸入圖片說明

之后,我想應用CNN對兩類樣本進行分類。 尋找建議。

謝謝。

通常,您使用librosa.display.specshow繪制一段時間內的頻譜圖,而不是整個文件。 實際上,根據您的分類目標,您可能寧願使用由librosa.stft生成的頻譜圖或某些Mel頻譜圖作為CNN的輸入。

例如,如果您要對類型進行分類,則梅爾譜圖可能是最合適的。 如果您想找出琴鍵或和弦,則需要一個恆定Q譜圖(CQT)等。

也就是說,這是一些可以回答您問題的代碼:

import librosa
import numpy as np
import matplotlib.pyplot as plt


file = YOUR_FILE
# load the file
y, sr = librosa.load(file, sr=44100)
# short time fourier transform
# (n_fft and hop length determine frequency/time resolution)
n_fft = 2048
S = librosa.stft(y, n_fft=n_fft, hop_length=n_fft//2)
# convert to db
# (for your CNN you might want to skip this and rather ensure zero mean and unit variance)
D = librosa.amplitude_to_db(np.abs(S), ref=np.max)
# average over file
D_AVG = np.mean(D, axis=1)

plt.bar(np.arange(D_AVG.shape[0]), D_AVG)
x_ticks_positions = [n for n in range(0, n_fft // 2, n_fft // 16)]
x_ticks_labels = [str(sr / 2048 * n) + 'Hz' for n in x_ticks_positions]
plt.xticks(x_ticks_positions, x_ticks_labels)
plt.xlabel('Frequency')
plt.ylabel('dB')
plt.show()

這將導致以下輸出:

dB的頻率

import matplotlib.pyplot as plt
from scipy import signal
from scipy.io import wavfile

sample_rate, samples = wavfile.read('h1.wav')
samples=samples[:,0]
frequencies, times, spectrogram = signal.spectrogram(samples, sample_rate)

plt.imshow(spectrogram)
plt.pcolormesh(times, frequencies, spectrogram)

plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM