Форма сигнала вниз (время, амплитуда) - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь уменьшить выборку миллионов сигналов, описываемых как время, амплитуда в файлах .csv:

.csv file example

0.000e+00 0.000e+00
1.000e-12 7.052e-09
2.000e-12 2.253e-05
3.000e-12 5.915e-04
4.000e-12 2.229e-03
5.000e-12 3.059e-03
6.000e-12 3.467e-03
8.000e-12 4.035e-03
1.100e-11 4.172e-03
1.500e-11 5.274e-03
1.700e-11 9.348e-03
1.800e-11 1.464e-02
1.900e-11 2.236e-02
2.200e-11 4.992e-02
3.100e-11 1.337e-01
4.000e-11 1.997e-01
4.400e-11 2.133e-01
4.700e-11 2.163e-01
5.100e-11 2.190e-01
5.400e-11 2.202e-01
6.000e-11 2.288e-01
6.700e-11 2.703e-01
7.100e-11 3.152e-01
7.400e-11 3.514e-01
8.200e-11 4.578e-01
8.900e-11 5.702e-01
9.500e-11 6.724e-01
1.000e-10 7.499e-01
1.060e-10 8.225e-01
1.140e-10 8.912e-01
1.250e-10 9.414e-01
1.460e-10 9.801e-01
2.000e-10 9.972e-01
4.710e-10 9.997e-01
1.401e-09 1.000e+00
2.175e-09 1.000e+00
2.180e-09 9.999e-01
2.189e-09 9.999e-01
2.199e-09 9.999e-01
2.208e-09 9.999e-01
2.214e-09 9.999e-01
2.228e-09 9.999e-01
2.247e-09 9.999e-01
4.169e-09 1.000e+00
8.058e-09 1.000e+00
8.062e-09 1.000e+00
8.063e-09 9.923e-01
8.064e-09 9.573e-01
8.066e-09 8.743e-01
8.068e-09 7.772e-01
8.070e-09 6.769e-01
8.071e-09 6.253e-01
8.072e-09 5.734e-01
8.073e-09 5.210e-01
8.074e-09 4.695e-01
8.075e-09 4.198e-01
8.077e-09 3.328e-01
8.079e-09 2.571e-01
8.081e-09 1.982e-01
8.084e-09 1.341e-01
8.088e-09 8.178e-02
8.095e-09 3.922e-02
8.111e-09 1.167e-02
8.165e-09 1.574e-03
8.375e-09 2.750e-04
8.792e-09 4.565e-05
1.115e-08 1.574e-05
2.753e-08 1.574e-05
3.000e-08 1.123e-05

Python code

Если я строю файл .csv, он дает:

import csv
import matplotlib.pyplot as plt
from scipy import signal

with open(csv_file, 'r') as f_read:
    csv_reader = csv.reader(f_read, delimiter = _delimiter)
    time_ori, amplitude_ori = [[float(i) for i in x] for x in zip(*csv_reader)]

plt.plot(time_ori, amplitude_ori, '-o')
plt.show()

enter image description here

Вопрос

Моя цель - уменьшить число точек в форме волны. К сожалению, шаг по времени не является постоянным, поэтому я попытался использовать reduced = signal.decimate(amplitude_ori, 2), который действительно уменьшает количество очков. Однако я не знаю, как удалить связанные значения time относительно значений амплитуды, которые были удалены. Может ли decimate() вернуть индекс удаленных элементов? Я не могу сравнить, потому что иногда амплитуда может быть одинаковой.

Я открыт для других предложений. Я использовал decimate(), так как это казалось уместным в моем случае.

РЕДАКТИРОВАТЬ:

Точность времени может варьироваться от формы волны к форме волны, поэтому я не могу определить порог для минимального шага времени.

1 Ответ

1 голос
/ 24 февраля 2020
import numpy as np

x = np.loadtxt('read.csv')
x = np.sort(x)
threshold = 1e-5
keep = abs(np.diff(x[:,1])) > threshold
keep = np.hstack(([True],keep))
out = [x[i] for i in range(len(x)) if keep[i]]
out = np.array(out)

установите «порог» как минимальную разницу во времени между двумя точками

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