【问题标题】:Downsample (time, amplitude) waveform下采样(时间、幅度)波形
【发布时间】:2020-02-24 13:40:38
【问题描述】:

我正在尝试对 .csv 文件中描述为时间、幅度的数百万个波形进行下采样:

.csv 文件示例

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 代码

如果我绘制它给出的 .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()

问题

我的目标是减少波形中的点数。不幸的是,时间步长不是恒定的,所以我尝试使用reduced = signal.decimate(amplitude_ori, 2),它确实减少了点数。但是,我不知道如何删除与已删除的幅度值相关的 time 值。 decimate() 可以返回被移除元素的索引吗?我无法比较,因为有时幅度可能相同。

我愿意接受其他建议。我使用了decimate(),因为它似乎适合我的情况。

编辑:

时间精度可能因波形而异,因此我无法定义最小时间步长的阈值。

【问题讨论】:

  • 您只是想对日期“从每 n 个样本中抽取一个”进行下采样,还是想在考虑时间戳的情况下进行下采样
  • 在这种情况下,我想删除具有几乎相同time(x 轴)的点。对于amplitudes(y 轴),数据已经相当粗糙,正如您在amplitude=0.0 时看到的点一样。示例:在我的情况下,没有必要让t=0.0 附近的所有点来描述曲线的上升沿,也不需要在0.81e-08 附近描述下降沿的点。当然,如果我可以减少 y 轴,那将是最好的。理想情况下,这条曲线应该有 5 对点。

标签: python python-3.x numpy scipy


【解决方案1】:
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)

将“阈值”设置为两点之间所需的最小时间差

【讨论】:

  • 谢谢。问题是时间精度可能因 ps 到我们而异,所以在这种情况下我无法定义阈值。
  • 那么您淘汰样品的标准是什么?你想保留原始样本还是可以在同一条曲线上取值?
  • 在这种情况下,我想删除几乎相同时间(x 轴)的点。对于幅度(y 轴),数据已经相当粗糙,正如您可以看到幅度 = 0.0 时的点。示例:在我的情况下,没有必要让 t=0.0 附近的所有这些点来描述曲线的上升沿,也不需要在 0.81e-08 附近描述下降沿的点。当然,如果我可以减少 y 轴,那将是最好的。理想情况下,这条曲线将有 5 对点。我不在乎原始值。我将重写 .csv 文件以节省磁盘空间。
  • 关于原始值。我理解错误你的问题。是的,即使波形减少到5对点,我也需要保持原始值,这5对就是5个原始值。
  • 我编辑了代码,因此阈值现在沿着 y 值。这意味着如果两个 concative y 值是两个接近的值“就像接近零的值”,它将被删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多