Как построить спектр или частоту против амплитуды всего аудиофайла, используя python? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть несколько аудиофайлов, я хочу построить средний спектр аудиофайлов, например, программу «Audacity», используя PYTHON (библиотека librosa). Я вижу, что они строят график зависимости средней частоты от амплитуды всего звука.

enter image description here

После этого я хочу применить CNN для классификации двух классов образцов. Ищу предложения.

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Обычно вы используете librosa.display.specshow для построения спектрограмм во времени, а не по всему файлу. Фактически, в качестве входных данных для вашей CNN вы можете использовать спектрограмму с течением времени, созданную librosa.stft или некоторой спектрограммой Mel, в зависимости от того, какова ваша цель классификации.

Например, если вы хотите классифицировать по жанру, Mel-спектрограмма может быть наиболее подходящей. Если вы хотите узнать тональность или аккорды, вам понадобится спектрограмма Constant-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 for Frequencies

0 голосов
/ 25 апреля 2019
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()
...