Python-删除范围之间的特定频率

Python-删除范围之间的特定频率,python,audio,spectrogram,Python,Audio,Spectrogram,我有一张光谱图: 我想清理频谱图,因此我只捕获特定范围内的频率(即,在本例中,介于2627-3939之间),并移除低于该频率的所有块。我的总体目标是只剩下4段在这个频率范围内,并且可以识别 以下是我目前的代码: import wave, struct, numpy as np, matplotlib.mlab as mlab, pylab as pl def wavToArr(wavefile): w = wave.open(wavefile,"rb") p = w.getpa

我有一张光谱图:

我想清理频谱图,因此我只捕获特定范围内的频率(即,在本例中,介于2627-3939之间),并移除低于该频率的所有块。我的总体目标是只剩下4段在这个频率范围内,并且可以识别

以下是我目前的代码:

import wave, struct, numpy as np, matplotlib.mlab as mlab, pylab as pl
def wavToArr(wavefile):
    w = wave.open(wavefile,"rb")
    p = w.getparams()
    s = w.readframes(p[3])
    w.close()
    sd = np.fromstring(s, np.int16)
    return sd,p

def wavToSpec(wavefile,log=False,norm=False):
    wavArr,wavParams = wavToArr(wavefile)
    print wavParams
    return  mlab.specgram(wavArr, NFFT=256,Fs=wavParams[2],window=mlab.window_hanning,noverlap=128,sides='onesided',scale_by_freq=True)

wavArr,wavParams = wavToArr("4bats.wav")
Pxx, freqs, bins = wavToSpec("4bats.wav")
Pxx += 0.0001

freqs += (len(wavArr) / wavParams[2]) / 2.
hf=pl.figure(figsize=(12,12));
ax = hf.add_subplot(2,1,1);
#plot spectrogram as decibals
hm = ax.imshow(10*np.log10(Pxx),interpolation='nearest',origin='lower',aspect='auto')
hf.colorbar(hm)
ylcnt = len(ax.get_yticklabels())
ycnt = len(freqs)
ylstep = int(ycnt / ylcnt)
ax.set_yticklabels([ int(freqs[f]) for f in xrange(0,ycnt,ylstep) ])
pl.show()
问题是,我不知道如何使用Python实现这一点。我知道范围(2627-3939),但是,我会迭代整个2D数组并将所有块相加,或者,对于谱图中的每个块,计算频率,如果频率高于阈值,则保留它,否则值变为0.0

如果我对每个垃圾箱进行汇总,我会得到以下结果:

我需要保留这些块,但是,我想除去这些块之外的其他块


我希望有人能帮助我

也许你想要这样的东西:

Pxx[np.greater(np.sum(Pxx, axis=1), 2955), :] = 0.
或者,我可能会切换您的轴,因此也可以尝试:

Pxx[:, np.greater(np.sum(Pxx, axis=0), 2955)] = 0.

或者你想要别的东西。。。我觉得这个问题有点不清楚。

你说的“删除”是什么意思。例如,您希望数据消失,还是只是设置为零?你想把哪个轴去掉?@tom10-我只想把它设为0.0,并且只有x轴和y轴与频率相关,所以这对于计算下一阶段很重要。。其基本思想是分段;我只剩下4个“向量”来存储调用,而其他向量只包含0.0-有什么建议吗?:)