Python 在波形中寻找离散逻辑电平

Python 在波形中寻找离散逻辑电平,python,numpy,scipy,signal-processing,Python,Numpy,Scipy,Signal Processing,我有一些我正试图用Python处理的波形。我想找到这些信号显示的离散逻辑电平。我有一个每个波形的x和y值的1D数组 数据类似于以下示例: 如何找到不同的级别?在这里,它们可能在(1.8,3.3)、(2.1,3.0)、(2.7,2.6)左右,依此类推 我尝试了遵循与R相关的讨论方法。我实现了一个Lowss平滑器(这是您看到的曲线),通过紧密拟合消除噪声,因为真实波形有一个非平凡的噪声分量,然后尝试在数据上使用一个窗口进行滚动最大值,但我无法得到任何实体 对于您的简单示例,您可以定义跳过大小并绘制

我有一些我正试图用Python处理的波形。我想找到这些信号显示的离散逻辑电平。我有一个每个波形的x和y值的1D数组

数据类似于以下示例:

如何找到不同的级别?在这里,它们可能在(1.8,3.3)、(2.1,3.0)、(2.7,2.6)左右,依此类推


我尝试了遵循与R相关的讨论方法。我实现了一个Lowss平滑器(这是您看到的曲线),通过紧密拟合消除噪声,因为真实波形有一个非平凡的噪声分量,然后尝试在数据上使用一个窗口进行滚动最大值,但我无法得到任何实体

对于您的简单示例,您可以定义跳过大小并绘制步长函数

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import argrelmin, argrelmax

#Generate some example signal
res = 1000
x = np.linspace(0,2*np.pi,res)
y = np.sin(x)
plt.plot(x,y)

#Take a number of discrete steps
Nsteps = 10
skip = x.shape[0]/Nsteps
xstep = x[::skip]; ystep = y[::skip]
plt.plot(xstep,ystep,'o')

#Plot the step graph
plt.step(xstep, ystep)

#Get max and min (only 2 in this simple case)
plt.plot(x[argrelmax(y)[0]],y[argrelmax(y)[0]],'ro')
plt.plot(x[argrelmin(y)[0]],y[argrelmin(y)[0]],'ro')
plt.show()

对于链接中更复杂的解决方案,我认为这将涉及通过在给定范围内查找局部最小值/最大值来构建ystep,例如:

ystep =[]
for rec in range(0,x.shape[0],skip):
    ystep.append(y[argrelmax(y[rec:rec+skip])[0]])
编辑:给出某个范围的局部最小值/最大值的完整示例

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import argrelmin, argrelmax

#Generate some example signal
res = 1000
x = np.linspace(0,2*np.pi,res)
y = np.sin(x)
plt.plot(x,y)

#Take a number of discrete steps
Nsteps = 10
skip = x.shape[0]/Nsteps

#Get local minimum and maximum in blocks for whole set of data
xstep = []; ystep =[]
for rec in range(0,x.shape[0],skip):
    srt = rec
    end = rec+skip-1
    if (y[srt] > y[end]):
        indx = argrelmax(y[srt:end],mode='wrap')[0]
    elif (y[srt] < y[end]):
        indx = argrelmin(y[srt:end],mode='wrap')[0]

    xstep.append(x[srt+indx])
    ystep.append(y[srt+indx])

#Plot location of min/max
plt.plot(xstep,ystep,'o')

#Plot the step graph
plt.step(xstep, ystep)

plt.show()
将numpy导入为np
将matplotlib.pyplot作为plt导入
从scipy.signal导入argrelmin,argrelmax
#生成一些示例信号
res=1000
x=np.linspace(0,2*np.pi,res)
y=np.sin(x)
平面图(x,y)
#采取一些不连续的步骤
Nsteps=10
跳过=x.shape[0]/n步骤
#获取整个数据集的局部最小值和最大值(以块为单位)
xstep=[];ystep=[]
对于范围内的rec(0,x.shape[0],跳过):
srt=rec
结束=记录+跳过-1
如果(y[srt]>y[end]):
indx=argrelmax(y[srt:end],mode='wrap')[0]
elif(y[srt]
我将继续删除R标记,因为它与您的编程问题无关。我喜欢完整的编辑实现。我看到在函数中使用一个滚动窗口,Nsteps=1,以不断调整单个最大值,并返回每个值,使其显著跳跃,因此,通过这种方式,如果存在多级信号,您可以找到所表示的多个最大值/级别。是的,很抱歉,我匆忙给出了原始答案,我认为这对于
R
链接中更复杂的情况来说是不够的。您需要
mode=“wrap”
,这样它会假设一个周期信号,并在两端找到范围的外部。如果存在多个最小值/最大值,您可能还需要稍微更改此值,因为
indx
将是一个数组。您也可以使用
argrelextrema
来避免
if
语句。基本上,我希望找到多电平信号的离散电平,而不必硬编码要查找的电平量。我想如果我在一个窗口中找到一个最大值,然后以最小重叠增加该窗口,并寻找另一个最大值,我可以在这里这样做。