Как мне получить значения определенного частотного диапазона
У меня есть файл.wav, я загружаю его и получаю следующую спектрограмму, показывающую спектр в дБ
Теперь я хотел бы знать эти значения именно потому, что хочу сравнить с другим файлом WAV, чтобы узнать, есть ли эти 4 значения.
Источник для создания этих изображений (взят из другого примера stackru)
## some stuff here
for i in range(0, int(RATE / CHUNK_SIZE * RECORD_SECONDS)):
# little endian, signed shortdata_chunk
data_chunk = array('h', stream.read(CHUNK_SIZE))
if byteorder == 'big':
data_chunk.byteswap()
data_all.extend(data_chunk)
## some stuff here
Fs = 16000
f = np.arange(1, 9) * 2000
t = np.arange(RECORD_SECONDS * Fs) / Fs
x = np.empty(t.shape)
for i in range(8):
x[i*Fs:(i+1)*Fs] = np.cos(2*np.pi * f[i] * t[i*Fs:(i+1)*Fs])
w = np.hamming(512)
Pxx, freqs, bins = mlab.specgram(data_all, NFFT=512, Fs=Fs, window=w,
noverlap=464)
#plot the spectrogram in dB
Pxx_dB = np.log10(Pxx)
pyplot.subplots_adjust(hspace=0.4)
pyplot.subplot(211)
ex1 = bins[0], bins[-1], freqs[0], freqs[-1]
pyplot.imshow(np.flipud(Pxx_dB), extent=ex1)
pyplot.axis('auto')
pyplot.axis(ex1)
pyplot.xlabel('time (s)')
pyplot.ylabel('freq (Hz)')
Я "думаю", что информация в Pxx, но я не знаю, как ее получить.
1 ответ
Из документации я понял, что Pxx - это простой двумерный массив.
Вы заинтересованы в периодограммах около 1 с. Учитывая, что у Pxx должно быть 512 столбцов, а ваша выборка имеет длину около 5 с, я бы взял срез где-то около столбца 100: periodogram_of_interest = Pxx[:, 100]
Затем найдите 4 максимума. К сожалению, каждая из этих четырех частот имеет конечную ширину, поэтому поиск 4 верхних максимумов будет проще простого. Однако, если ваш сигнал достаточно чистый, есть функция в scipy.signal
это перечислит все локальные экстремумы: argrelmax. Вы могли бы поиграть с order
аргумент этой функции, чтобы уменьшить ваше пространство поиска.
С помощью значений, возвращаемых из этой функции, вы можете получить такие частоты: freqs[those_4_indices]
,