1

.wav ファイルがあり、それをロードすると、スペクトルを dB で示す次のスペクトログラムが得られます

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

これら4つの値が存在するかどうかを認識するために、他のwavファイルと比較したいので、これらの値を正確に知りたいと思います。

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

その写真を生成するソース (他のスタックオーバーフローの例から取得)

## 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 にあると「思います」が、取得方法がわかりません。

4

1 に答える 1

0

ドキュメントから、Pxx は単純な 2D numpy 配列であることがわかります。

1 秒前後のピリオドグラムに興味があります。Pxx には 512 列が必要で、サンプルの長さが約 5 秒であることを考慮すると、列 100 付近のどこかでスライスを作成します。 periodogram_of_interest = Pxx[:, 100]

次に、4 つの最大値を見つけます。残念ながら、これらの 4 つの周波数のそれぞれには有限の幅があるため、単純に上位 4 つの最大値を探すのは簡単ではありません。ただし、信号が非常にクリーンであると仮定すると、scipy.signalすべての極値をリストする関数がargrelmax にあります。その関数のorder引数をいじって、検索スペースを減らすことができます。

その関数から返された値を使用すると、次のような頻度を取得できますfreqs[those_4_indices]

于 2014-04-02T21:32:18.653 に答える