gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:15:06 25 4
gpt4 key购买 nike

我有一个频谱图:

我想清理频谱图,所以我只捕获特定范围内的频率(例如,在本示例中为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.

或者,也许您还想要其他东西...我觉得这个问题不清楚。

关于python - Python-删除范围之间的特定频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21518512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com