我通过matplotlib在x轴上绘制频率,在y轴上绘制强度。
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import argrelmax, argrelmin
data = np.loadtxt('pr736024.dat')
z=np.array(data[:,1])
y = (z-z.min())/(z.max()-z.min()) #for normalization
x = np.loadtxt('frq.txt')
plt.plot(x,y, linewidth = 0.2, color='black')
plt.plot(x,indexes, "o")
plt.show()
我想获得峰的强度值(在图中可以看到6个峰)。我该如何实现?
答案 0 :(得分:1)
此答案是我在here中回答的改编。
这里有一个numpythonic解决方案(比显式执行循环要好得多)。
您必须定义一个阈值,在该阈值处检测到最大值,在这种情况下,最大值可以为0.2。
我使用滚动功能将数字+1或-1移位到该位置。另外,“峰值”被定义为局部最大值,其中前一个和后一个数字小于中心值。
完整代码如下:
import numpy as np
import matplotlib.pyplot as plt
# input signal
x = np.arange(1,100,1)
y = 0.3 * np.sin(t) + 0.7 * np.cos(2 * t) - 0.5 * np.sin(1.2 * t)
threshold = 0.2
# max
maxi = np.where(np.where([(y - np.roll(y,1) > 0) & (y - np.roll(y,-1) > 0)],y, 0)> threshold, y,np.nan)