gpt4 book ai didi

python - 数字化模拟信号

转载 作者:太空狗 更新时间:2023-10-29 20:52:16 25 4
gpt4 key购买 nike

我有一组表示数字输出的 CSV 值。它是使用模拟示波器收集的,因此它不是完美的数字信号。我正在尝试过滤掉数据以获得完美的数字信号来计算周期(可能会有所不同)。我还想定义从该过滤中得到的最大误差。

像这样:

enter image description here

想法

对数据应用阈值。这是一个伪代码:

for data_point_raw in data_array:
if data_point_raw < 0.8: data_point_perfect = LOW
if data_point_raw > 2 : data_point_perfect = HIGH

else:
#area between thresholds
if previous_data_point_perfect == Low : data_point_perfect = LOW
if previous_data_point_perfect == HIGH: data_point_perfect = HIGH

有两个问题困扰着我。

  1. 这似乎是数字信号处理中的一个常见问题,但我还没有为它找到一个预定义的标准函数。这是执行过滤的好方法吗?
  2. 如何获得最大误差?

最佳答案

这里有一些代码可能会有所帮助。

from __future__ import division

import numpy as np


def find_transition_times(t, y, threshold):
"""
Given the input signal `y` with samples at times `t`,
find the times where `y` increases through the value `threshold`.

`t` and `y` must be 1-D numpy arrays.

Linear interpolation is used to estimate the time `t` between
samples at which the transitions occur.
"""
# Find where y crosses the threshold (increasing).
lower = y < threshold
higher = y >= threshold
transition_indices = np.where(lower[:-1] & higher[1:])[0]

# Linearly interpolate the time values where the transition occurs.
t0 = t[transition_indices]
t1 = t[transition_indices + 1]
y0 = y[transition_indices]
y1 = y[transition_indices + 1]
slope = (y1 - y0) / (t1 - t0)
transition_times = t0 + (threshold - y0) / slope

return transition_times


def periods(t, y, threshold):
"""
Given the input signal `y` with samples at times `t`,
find the time periods between the times at which the
signal `y` increases through the value `threshold`.

`t` and `y` must be 1-D numpy arrays.
"""
transition_times = find_transition_times(t, y, threshold)
deltas = np.diff(transition_times)
return deltas


if __name__ == "__main__":
import matplotlib.pyplot as plt

# Time samples
t = np.linspace(0, 50, 501)
# Use a noisy time to generate a noisy y.
tn = t + 0.05 * np.random.rand(t.size)
y = 0.6 * ( 1 + np.sin(tn) + (1./3) * np.sin(3*tn) + (1./5) * np.sin(5*tn) +
(1./7) * np.sin(7*tn) + (1./9) * np.sin(9*tn))

threshold = 0.5
deltas = periods(t, y, threshold)
print("Measured periods at threshold %g:" % threshold)
print(deltas)
print("Min: %.5g" % deltas.min())
print("Max: %.5g" % deltas.max())
print("Mean: %.5g" % deltas.mean())
print("Std dev: %.5g" % deltas.std())

trans_times = find_transition_times(t, y, threshold)

plt.plot(t, y)
plt.plot(trans_times, threshold * np.ones_like(trans_times), 'ro-')
plt.show()

输出:

Measured periods at threshold 0.5:
[ 6.29283207 6.29118893 6.27425846 6.29580066 6.28310224 6.30335003]
Min: 6.2743
Max: 6.3034
Mean: 6.2901
Std dev: 0.0092793

Plot

您可以使用 numpy.histogram 和/或 matplotlib.pyplot.hist 进一步分析 periods(t, y, threshold)< 返回的数组.

关于python - 数字化模拟信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15112964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com