1

我有一个 .wav 文件,我加载它并得到下一个频谱图,以 dB 为单位显示频谱

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

我“认为”信息在 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 回答