【问题标题】:How to take the derivative of a Signal in Python?如何在 Python 中获取信号的导数?
【发布时间】:2017-03-12 08:35:04
【问题描述】:

我是 Python 语言和编码方面的新手。

我正在尝试使用 USB 串行获取和区分来自 Arduino UNO 板的实时信号。到目前为止,我正在毫无问题地获取数据,但我无法获取有关如何区分它的信息。

你们能帮我解决这个问题吗,或者指出我在哪里可以获得有关这些东西的一些信息。

非常感谢您的帮助。

这是我的代码

Obs.: 我是初学者 :D

# -*- coding: utf-8 -*-

from collections import deque
import serial
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
arduinoData = serial.Serial('COM4', 4800)

win = pg.GraphicsWindow()
win.setWindowTitle('pyqtgraph example: Scrolling Plots')

#    In these examples, the array size is fixed.
p1 = win.addPlot()
p2 = win.addPlot()

data1= [0,0]
vector=deque()

for i in range(300):

    string = arduinoData.readline()
    stringx = string.split(',')

    time=float(stringx[0])
    distance=float(stringx[1])
    vector=(time, distance) 
    vectorx = np.array(vector)
    data1=np.vstack((data1,vectorx))   

curve1 = p1.plot(data1)
curve2 = p2.plot(data1)
ptr1 = 0



def update1():
    global data1, curve1, ptr1

    data1[:-1] = data1[1:]  

    string = arduinoData.readline()

    stringx = string.split(',')
    time=float(stringx[0])
    distance=float(stringx[1])
    vector=(time, distance)
    vectorx=np.array(vector)
    data1[-1]=vectorx
    #print(data1)

    curve1.setData(data1)

    ptr1 += 1
    curve2.setData(data1)
    curve2.setPos(ptr1, 0)

# update all plots
def update():
    update1()

timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(50)



## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

【问题讨论】:

  • 这是一个严肃的问题。您没有解释要区分的内容。您从 USB 获得的所有数据都是实时数据,不是吗?
  • 好的,我很抱歉。我想区分“距离”信号和“时间”信号。你能指出一个我可以学习它的地方或给我任何线索吗?谢谢。
  • 假设您控制发送和接收的内容,我建议标记数据。它可以是简单的 time: somethingdistance: something,或者更优化的东西,例如标签的单个字节(T17D97)。

标签: python pyqtgraph differentiation


【解决方案1】:

我发现了一个不错的节目,并通过搜索“如何在 python 中区分波形”来讲述

https://plot.ly/python/numerical-differentiation/

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
img = fig.add_subplot(1, 1, 1)

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

dy = np.zeros(y.shape,np.float)
dy[0:-1] = np.diff(y)/np.diff(x)
dy[-1] = (y[-1] - y[-2])/(x[-1] - x[-2])

img.plot(x,y, label='$f(x) = sin(x)$')
img.plot(x,dy, label='$f\'(x) = cos(x)$')

img.legend()
plt.show()

【讨论】:

    【解决方案2】:

    “区分信号”是英语中很少使用的表达方式(尽管根据 Google 似乎是正确的)。这就是你和@zvone 产生误解的原因。最好说你想对信号“取导数”。

    无论如何,numpy.gradient 函数可以做到这一点。

    【讨论】:

    • 非常感谢titusjan 和@zvone。对于造成的误解,我深表歉意。
    • 我不同意。微分是从微积分开始的常用术语。微分方程类是磨坊工程学位的一个非常常见的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多