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

Posted

技术标签:

【中文标题】Python - 删除范围之间的特定频率【英文标题】:Python - Removing specific frequencies between a range 【发布时间】:2014-02-03 01:29:29 【问题描述】:

我有一张频谱图:

我想清理频谱图,所以我只捕获特定范围内的频率(即在此示例中,在 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)但是,我会遍历整个二维数组并总结所有块,或者,对于频谱图中的每个块,计算频率,如果它高于阈值,保持它,否则值变为 0.0?

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

我需要保留这些块,但是,除了这些之外,我想删除所有其他块。

希望有人能帮帮我!

【问题讨论】:

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

也许你想要类似的东西:

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

或者,我可能会切换你的轴,所以也试试:

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

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

【讨论】:

以上是关于Python - 删除范围之间的特定频率的主要内容,如果未能解决你的问题,请参考以下文章

如果创建特定文本删除python中特定文本之间的文本

从 mp3 文件中删除特定频率

python怎样删除某一列特定范围的数据呢

是否可以根据频率以编程方式编辑声音文件?

从字符串中删除Python中两个特定字符之间包含的所有字符

如何产生特定的声音频率?