为什么峰值指数()似乎忽略了提供的阈值?

2024-09-29 01:18:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在检索分别保存着信号的功率级和频率的阵列屏蔽门()方法:

Pxx, freqs = plt.psd(signals[0], NFFT=2048, Fs=sdr.sample_rate/1e6, Fc=sdr.center_freq/1e6, scale_by_freq=True, color="green")

enter image description here 请忽略绿色和红色信号。只有蓝色的和这个问题有关。在

我可以拥有峰值指数()方法返回(蓝色信号的)多个最显著峰值的X和Y坐标:

^{pr2}$

enter image description here 如图所示,这些坐标与蓝峰非常吻合。在

我不满意的是从峰值指数()方法。我希望只返回高于某个功率电平的所有峰值的坐标,例如-25(对于蓝色信号,这将正好是5个峰值)。根据峰值指数()方法这是通过提供所需的值作为thres参数来完成的。在

但是不管我用thres来尝试什么,这个方法似乎完全忽略了我的值,而是仅仅依赖min_dist参数来确定返回峰值的数量。在

  • 我的阈值有什么问题(我相信在我的代码中它意味着“峰值高于60%的曲线图”),以及如何正确地指定某个功率电平(而不是百分比值)?在

[编辑]

我发现显然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]

以下是我得到的六个“最高”峰值: enter image description here

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]

enter image description here 幸运的是,峰的顺序对于我计划用坐标来做的事情并不重要。但是,我必须找出如何将我现在的Y值与它们对应的X值相匹配。。。在

另外,虽然我现在确实有一个解决方案,但出于学习目的,了解我的argsort尝试有什么问题仍然很有趣。在


Tags: 方法编辑参数信号dist指数min功率
2条回答

我想出了如何找到相应的X值,并得到六个最高峰值的完整坐标:

power_lvls = 10*log10(Pxx/(sdr.sample_rate/1e6))+10*log10(8/3)
indexes = peakutils.indexes(power_lvls, thres=0.35, min_dist=1)
print("Peaks in Signal 1\nX: {}\n\nY: {}\n".format(freqs[indexes], power_lvls[indexes]))
power_lvls_max = -bn.partition(-power_lvls[indexes], 6)[:6]
check = np.isin(power_lvls, power_lvls_max)
indexes_max = np.where(check)
print("Highest Peaks in Signal 1:\nX: {}\n\nY: {}\n".format(freqs[indexes_max], power_lvls[indexes_max]))

现在我有了我的“峰值过滤”(有点像),我最初试图通过搞乱thres值来实现峰值指数(). 上面的代码给出了我想要的结果: enter image description here

解决这个问题的一个简单方法是在处理之前向Pxx向量添加一个常量(例如+50db)。这样你就可以避开负值峰值。处理完成后,可以再次减去该常数,以获得正确的峰值。在

相关问题 更多 >