我正在检索分别保存着信号的功率级和频率的阵列屏蔽门()方法:
Pxx, freqs = plt.psd(signals[0], NFFT=2048, Fs=sdr.sample_rate/1e6, Fc=sdr.center_freq/1e6, scale_by_freq=True, color="green")
我可以拥有峰值指数()方法返回(蓝色信号的)多个最显著峰值的X和Y坐标:
^{pr2}$我不满意的是从峰值指数()方法。我希望只返回高于某个功率电平的所有峰值的坐标,例如-25(对于蓝色信号,这将正好是5个峰值)。根据峰值指数()方法这是通过提供所需的值作为thres
参数来完成的。在
但是不管我用thres
来尝试什么,这个方法似乎完全忽略了我的值,而是仅仅依赖min_dist
参数来确定返回峰值的数量。在
[编辑]
我发现显然thres
参数只能取浮点0之间的正值。和1。
因此,通过如下所示稍微改变我的行,我现在可以根据需要影响返回峰值的数量:
indexes = peakutils.peak.indexes(np.array(power_lvls), thres=0.4, min_dist=1)
但这仍然给我留下了一个问题:是否有可能将结果限制在五个最高的峰值(前提是高于thres>;=5的峰数)。在
我相信下面这样的东西会返回五个最高值:
print(power_lvls[np.argsort(power_lvls[indexes])[-5:]])
但是不幸的是,负值似乎被解释为power\lvls数组中的最高值。是否可以更改该行,使(+)10被视为高于,例如-40?或者还有其他更好的吗解决方案?在
[编辑2]
power_lvls = 10*log10(Pxx/(sdr.sample_rate/1e6))+10*log10(8/3)
indexes = peakutils.indexes(power_lvls, thres=0.35, min_dist=1)
power_lvls_max = power_lvls[np.argsort(power_lvls[indexes])[-6:]]
print("Highest Peaks in Signal:\nX: \n\nY: {}\n".format(power_lvls_max))
在尝试了几个小时没有任何改进之后,我开始认为这些既不是低谷也不是高峰,只是一些“随机”值?!这让我相信,我的阿格索特线有问题,我必须先弄清楚?!在
[编辑3]
在瓶颈.分区()方法似乎返回了正确的值(即使它显然是以随机顺序返回的,而不是从最左边的峰值返回到最右边的峰值):
import bottleneck as bn
power_lvls_max = -bn.partition(-power_lvls[indexes], 6)[:6]
幸运的是,峰的顺序对于我计划用坐标来做的事情并不重要。但是,我必须找出如何将我现在的Y值与它们对应的X值相匹配。。。在
另外,虽然我现在确实有一个解决方案,但出于学习目的,了解我的argsort尝试有什么问题仍然很有趣。在
我想出了如何找到相应的X值,并得到六个最高峰值的完整坐标:
现在我有了我的“峰值过滤”(有点像),我最初试图通过搞乱
thres
值来实现峰值指数(). 上面的代码给出了我想要的结果:解决这个问题的一个简单方法是在处理之前向Pxx向量添加一个常量(例如+50db)。这样你就可以避开负值峰值。处理完成后,可以再次减去该常数,以获得正确的峰值。在
相关问题 更多 >
编程相关推荐