如何使用python从离散采样数据点获得最高的两个峰值?
How to get the highest Two peak values from a discrete sampled data point using python?
我有一辆距离它更远的车辆的雷达数据,雷达输出一个 .csv 文件。一旦雷达检测到某些东西,幅度列就会从 0 切换到 1 并开始输出值,并将其绘制出来。例如,这里:
当Distance/Amplitude的列从0变为数字时,可以推断目标已经被雷达发现。所以绘制第一个实例的行给出了这个蓝色波浪
如果我们绘制它下面的行,我们得到这个,
雷达放在后面,所以目标正在远离它。 x-axis 表示距离乘以 0.077 米。因此,对于第一个蓝色波浪,雷达记录的距离为 37*.077 米。我想知道是否有一种方法可以从 .csv 文件中获取一系列值以考虑两个峰值,例如:我想知道如何从蓝波中获取前两个峰值,得到x-axis 它们的坐标,然后得到它们的中点并追踪橙色,即第一行下方的第二行。
我已将 .csv 文件附在下方。
https://drive.google.com/file/d/1IJOebiXuScjLPytemulcXph7ZB1X65wU/view?usp=sharing
我有一个算法可以获取第一次命中和最后一次命中的索引,例如,当从 0 切换到一个值以及从一个值切换到零时,这些让我能够捕捉到雷达检测到目标。这在我使用雷达直接给出的值(例如距离和振幅值)时很有帮助,但现在我需要一整行,我不知道如何进行。我不知道 Pandas 或 Numpy 是否有方法可以用来处理这个问题
有几种获取峰的方法,从而得到两个峰的位置。获取数据集的导数。导数数据与 x-axis 相交的点将是原始数据的波峰和波谷。在这样做的同时,您还可以获取那些峰谷的指数。从那里,您可以遍历原始数据中的这些点以获得两个最大值及其索引。
看起来像这样:
import matplotlib.pyplot as plt
import numpy as np
# My data set (example is a crazy cosine wave)
x = np.linspace(1, 100, 1000)
y = np.cos(x*0.5)*((x - 50)**3)
# Find first derivative:
m = np.diff(y)/np.diff(x)
# Get indicies of peaks and valleys
c = len(m)
indices = []
for i in range(1, c):
prev_val = m[i-1]
val = m[i]
if prev_val < 0 and val >= 0:
indices.append(i)
elif prev_val > 0 and val <= 0:
indices.append(i)
# Get the values, positions, and indicies of the two peaks
max_list = [0, 0]
index_list = [0, 0]
pos_list = [0, 0]
for index in indices:
val = y[index]
if val > max_list[0]:
max_list[0] = val
index_list[0] = index
pos_list[0] = x[index]
elif val > max_list[1]:
max_list[1] = val
index_list[1] = index
pos_list[1] = x[index]
print('Two peak indices:', index_list)
print('Two peak values:', max_list)
print('Two peak x-positions:', pos_list)
average_pos = (pos_list[0] + pos_list[1])/2
print('Average x-position:', average_pos)
plt.plot(x, y)
plt.show()
我有一辆距离它更远的车辆的雷达数据,雷达输出一个 .csv 文件。一旦雷达检测到某些东西,幅度列就会从 0 切换到 1 并开始输出值,并将其绘制出来。例如,这里:
当Distance/Amplitude的列从0变为数字时,可以推断目标已经被雷达发现。所以绘制第一个实例的行给出了这个蓝色波浪
如果我们绘制它下面的行,我们得到这个,
雷达放在后面,所以目标正在远离它。 x-axis 表示距离乘以 0.077 米。因此,对于第一个蓝色波浪,雷达记录的距离为 37*.077 米。我想知道是否有一种方法可以从 .csv 文件中获取一系列值以考虑两个峰值,例如:我想知道如何从蓝波中获取前两个峰值,得到x-axis 它们的坐标,然后得到它们的中点并追踪橙色,即第一行下方的第二行。
我已将 .csv 文件附在下方。 https://drive.google.com/file/d/1IJOebiXuScjLPytemulcXph7ZB1X65wU/view?usp=sharing
我有一个算法可以获取第一次命中和最后一次命中的索引,例如,当从 0 切换到一个值以及从一个值切换到零时,这些让我能够捕捉到雷达检测到目标。这在我使用雷达直接给出的值(例如距离和振幅值)时很有帮助,但现在我需要一整行,我不知道如何进行。我不知道 Pandas 或 Numpy 是否有方法可以用来处理这个问题
有几种获取峰的方法,从而得到两个峰的位置。获取数据集的导数。导数数据与 x-axis 相交的点将是原始数据的波峰和波谷。在这样做的同时,您还可以获取那些峰谷的指数。从那里,您可以遍历原始数据中的这些点以获得两个最大值及其索引。
看起来像这样:
import matplotlib.pyplot as plt
import numpy as np
# My data set (example is a crazy cosine wave)
x = np.linspace(1, 100, 1000)
y = np.cos(x*0.5)*((x - 50)**3)
# Find first derivative:
m = np.diff(y)/np.diff(x)
# Get indicies of peaks and valleys
c = len(m)
indices = []
for i in range(1, c):
prev_val = m[i-1]
val = m[i]
if prev_val < 0 and val >= 0:
indices.append(i)
elif prev_val > 0 and val <= 0:
indices.append(i)
# Get the values, positions, and indicies of the two peaks
max_list = [0, 0]
index_list = [0, 0]
pos_list = [0, 0]
for index in indices:
val = y[index]
if val > max_list[0]:
max_list[0] = val
index_list[0] = index
pos_list[0] = x[index]
elif val > max_list[1]:
max_list[1] = val
index_list[1] = index
pos_list[1] = x[index]
print('Two peak indices:', index_list)
print('Two peak values:', max_list)
print('Two peak x-positions:', pos_list)
average_pos = (pos_list[0] + pos_list[1])/2
print('Average x-position:', average_pos)
plt.plot(x, y)
plt.show()