如何获得特定频率范围的值(How do I get the values of a specific

2019-10-19 17:58发布

我有一个.wav文件,我加载它,我得到显示分贝频谱的下一个频谱

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

现在我想确切地知道这些值,因为我想与其他wav文件进行比较,因为如果这4个值是有认识。

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,但我不知道如何得到它。

Answer 1:

从文档 ,我推测,地址Pxx是一个简单的2D numpy的阵列。

你感兴趣的1秒左右的周期图。 考虑到地址Pxx应该有512列和你的样本是大约5秒长,我想分得一杯羹围绕柱100的地方:periodogram_of_interest =地址Pxx [:, 100]

然后找到4最大值。 不幸的是,每一个那些4个频率的具有有限的宽度,所以仅仅为顶端4的最大值将NOG那样容易。 但是,假设你的信号是很干净的,有一个在功能scipy.signal ,将列出所有局部极值: argrelmax 。 你可以用打order该函数的参数,以减少你的搜索空间。

随着值从函数返回的,你可以得到的频率是这样的: freqs[those_4_indices]



文章来源: How do I get the values of a specific frequency range