首页 > 解决方案 > 从python中的图中获取特定数据

问题描述

我想从图中得到第二高峰的频率值。我尝试获取非零频率,然后按降序对它们进行排序并从该列表中获取第二个值。但它不是那样工作的。下面是它的代码。可以在此处找到用于复制的文件。

n = len(time)
fhat_A = np.fft.fft(channelA, n)
PSD_A = fhat_A * np.conj(fhat_A)/n
freq_A = (1/(0.0001*n)) * np.arange(n)
L_A = np.arange(1,np.floor(n/2),dtype='int')

plt.plot(freq_A[L_A], PSD_A[L_A], 'k', label='Noise_A')
plt.xlabel('Frequency [Hz]')
plt.ylabel('PSD [G^2/Hz]')
plt.title('Noise in Channel A Pipe03_2')
plt.legend(bbox_to_anchor=(0.6, -0.2), ncol=4)
plt.rcParams["figure.dpi"] = 300
plt.show()

该图如下所示,我想知道红色标记线的 PSD 值。有更好的方法吗?只有真正的价值就足够了。 结果图

编辑: 以下是使用 find_peaks 的代码和结果。我不明白为什么 x 轴上显示了这么多峰。

from scipy.signal import find_peaks

peaks, _ = find_peaks(PSD_A[L_A], distance=30)
plt.plot(freq_A[L_A], PSD_A[L_A], 'k', label='Noise_A')
plt.plot(peaks, PSD_A[L_A][peaks], 'xr')

峰值图

标签: pythonnumpy

解决方案


如果许多频率不为零,因此您的峰值由许多点形成,则排序将没有用(例如,您只会得到靠近最大值的点)。在信号中寻找峰值可能很复杂。我建议使用peakutils。请参阅那里的教程:如果您的信号是x,y,它就像

indexes = peakutils.indexes(y, thres=0.5, min_dist=30)
print(indexes)
print(x[indexes], y[indexes])

推荐阅读