Как получить (х, у) координаты сигнала при 10% его максимальной амплитуды? - PullRequest
4 голосов
/ 25 мая 2019

Как извлечь координаты (x, y) синусоиды, когда синусоида составляет 10% от ее максимальной амплитуды, как показано на рисунке (красные точки)? Мои 'x-values' - это время и порядковый номер массива.

Sinewave

Я пробовал что-то подобное, оно не работает должным образом:

sinewave_max = sinewave[0:argmax(sinewave)]
for i,val in enumerate(sinewave_max):
                if i == int(0.1*(len(sinewave_max))):
                    y = sinewave_max[i]
                    x = index(y)  (#Pseudo-Code line)             

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Вот один из способов сделать это.Идея состоит в том, чтобы иметь плотную сетку из x-точек, а затем определить небольшое значение допуска.Затем найдите значения в массиве y, которые примерно в 0,1 раза превышают максимальную высоту (= 1) в пределах этого допуска

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 1000)
y = np.sin(x)

plt.plot(x, y)
plt.axhline(0, color='k')
tol = 1e-2
ind = np.argwhere(abs(y-0.1*max(y))<=tol)

plt.scatter(x[ind], y[ind], c='r', s=100, zorder=3)
plt.xlabel('Time')
plt.ylabel('Amplitude = sin(time)')
plt.title('Sine wave')
plt.grid()
plt.show()

enter image description here

0 голосов
/ 25 мая 2019

Поскольку вы пометили панд, вы можете сделать это с пандами 'cumsum:

x = np.linspace(0, 10, 1000)
y = np.sin(x)
thresh = max(y) * 0.10

s = pd.Series(y>thresh)

# idx contains the jump from y<=thresh to y>thresh
# except possibly the first position
idx = s.index[s.ne(s.shift())]

# check the first position
if y[0] < thresh: idx = idx[1:]

# plot:
plt.figure(figsize=(10,6))
plt.plot(x,y)
plt.scatter(x[idx],y[idx], c='r', s=100)
plt.grid(True)

Сюжет:

enter image description here

Примечание : если, как вы сказали, серия x является индексом времени y, то приведенный выше код необходимо изменить на:

s = pd.Series(y>thresh)

# idx contains the jump from y<=thresh to y>thresh
# except possibly the first position
idx = s.index[s.ne(s.shift())]

# check the first position
if y.iloc < thresh: idx = idx[1:]

plt.figure(figsize=(10,6))
plt.plot(x,y)

# we only need to plot y[idx] against idx now
plt.scatter(idx,y[idx], c='r', s=100)
plt.grid(True)

, что дает: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...