python - 从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')
解决方案
如果许多频率不为零,因此您的峰值由许多点形成,则排序将没有用(例如,您只会得到靠近最大值的点)。在信号中寻找峰值可能很复杂。我建议使用peakutils。请参阅那里的教程:如果您的信号是x,y
,它就像
indexes = peakutils.indexes(y, thres=0.5, min_dist=30)
print(indexes)
print(x[indexes], y[indexes])
推荐阅读
- excel - 我想将响应下载为 excel 文件,但我将这些奇怪的字符作为数据
- javascript - 64 位 Excel VBA 调用 JavaScript 函数
- javascript - 所有偶数之和的函数
- c++ - c++ Premier 代码没有给出正确的输出
- python - 如何将 Google Cloud Python 后端输出返回到我的颤振应用程序?
- spring-boot - JHIpster:EmployeeMapperImpl 无法解析为 mapperTest 类中的类型错误
- visual-studio-code - 发布时附加带有 VS 代码扩展的 powershell 文件
- loops - 如何通过按键退出循环
- c - 循环中的 g_signal_connect 是个好主意吗?
- blazor - NavigationManager 无法按预期工作?