0

У меня есть файл .wav, я загрузить его, и я получаю следующие спектрограммы, показывающие спектр в децибелахКак получить значения определенного частотного диапазон

http://i.stack.imgur.com/22TjY.png

Теперь я хотел бы знать, эти значения точно, потому что я хочу сравнить с другим wav-файлом, чтобы узнать, есть ли эти 4 значения.

http://i.stack.imgur.com/Jun25.png

источника для генерации, что фотографии (взятые из других StackOverflow например)

## 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)') 

я «думает», что информация находится в ром, но я не знаю, как получить его.

ответ

0

Из documentation, я понимаю, что Pxx - это простой 2D-массив numpy.

Вас интересуют периодограммы около 1 с. Учитывая, что Pxx должен иметь 512 столбцов, а ваш образец составляет около 5 с, я бы взял фрагмент где-то около столбца 100: periodogram_of_interest = Pxx [:, 100]

Затем найдите 4 максимума. К сожалению, каждая из этих четырех частот имеет конечную ширину, поэтому просто искать максимальные 4 максимума будет непросто. Однако, если ваш сигнал довольно чистый, есть функция в scipy.signal, в которой будут перечислены все локальные экстремумы: argrelmax. Вы можете сыграть с аргументом order этой функции, чтобы уменьшить пространство поиска.

Со значениями, возвращаемыми этой функцией, вы можете получить такие частоты: freqs[those_4_indices].

+0

Почему мы рассматриваем Pxx должно иметь 512 столбцов? У меня есть фиксированный образец в 5 секунд. Также мой сигнал действительно грязный, у меня шум от окружающей среды – fler

+0

Извините, это было плохое предположение с моей стороны. Поскольку я понятия не имею, как долго 'data_all', я создал (случайный) массив, который в моем случае оказался двумерным массивом с 512 столбцами (удачный снимок). Лучше всего, чтобы вы получили форму «Pxx» с «Pxx.shape», конечно. Затем возьмите кусочек примерно на 20%, потому что это где (на вашем изображении) сигналы начали. Кроме того, даже если ваш сигнал шумный, использование 'argrelmax' будет работать, хотя вам, возможно, придется помочь ему, отрезав ваш specgram в срезах (подобно вашему 2-му изображению). –

+0

Спасибо, да, это работает с вашим ответом !!! – fler