使用 numpy 在重复信号的一部分内绘制抛物线

2024-01-12

我有一个重复信号,它随着大约每秒重复一次的过程的每个周期而略有变化,尽管每个周期的持续时间和内容在某些参数内略有不同。我的信号数据每秒有一千个 x,y 坐标。每个周期内的一小部分但很重要的数据已损坏,我想用向上的抛物线替换每个损坏的部分。

对于需要用抛物线替换的每个数据段,我有三个点的 x,y 坐标。顶点/最小值是这些点之一。另外两个点是向上的 U 形(即抛物线)的左顶和右顶。换句话说,左上角是该函数域中最低 x 值的 x,y 坐标对,而右上角是该函数域中最高 x 值的 x,y 坐标对。左上和右上的 y 坐标彼此相等,并且是数据段中两个最高的 y 值。

如何编写代码来绘制这个向上抛物线中的剩余数据点?请记住,每分钟的数据需要调用此函数 60 或 70 次,并且每次调用此函数时,抛物线的形状/公式都需要更改,以便考虑这三对之间的不同关系每个所得抛物线中的 x,y 坐标。

def ReplaceCorruptedDataWithParabola(Xarray, Yarray, LeftTopX, LeftTopY
                                     , LeftTopIndex, MinX, MinY, MinIndex
                                     , RightTopX, RightTopY, RightTopIndex):  

    # Step One: Derive the formula for the upward-facing parabola using 
    # the following data from the three points:
        LeftTopX,LeftTopY,LeftTopIndex  
        MinX,MinY,MinIndex  
        RightTopX,RightTopY,RightTopIndex 

    # Step Two: Use the formula derived in step one to plot the parabola in
    # the places where the corrupted data used to reside:
    for n in Xarray[LeftTopX:RightTopX]:
        Yarray[n]=[_**The formula goes here**_]

    return Yarray 

注意:Xarray 和 Yarray 都是单列向量,每个索引处都有数据,将两个数组链接为 x,y 坐标集。它们都是 numpy 数组。 Xarray 包含时间信息并且不会改变,但 Yarray 包含信号数据,包括将被该函数需要计算的抛物线数据替换的损坏的段。


所以,据我了解,你有 3 个点需要拟合抛物线。

通常,最简单的方法是使用numpy.polyfit http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html,但如果您真的担心速度,并且您正好拟合三个点,则使用最小二乘拟合就没有意义。

相反,我们有一个偶数确定的系统(将抛物线拟合到 3 个 x,y 点),并且我们可以通过简单的线性代数得到精确的解。

所以,总而言之,您可能会做这样的事情(大部分是绘制数据):

import numpy as np                                                                              
import matplotlib.pyplot as plt                                                                 

def main():
    # Generate some random data
    x = np.linspace(0, 10, 100)
    y = np.cumsum(np.random.random(100) - 0.5)

    # Just selecting these arbitrarly 
    left_idx, right_idx = 20, 50      
    # Using the mininum y-value within the arbitrary range
    min_idx = np.argmin(y[left_idx:right_idx]) + left_idx 

    # Replace the data within the range with a fitted parabola
    new_y = replace_data(x, y, left_idx, right_idx, min_idx)  

    # Plot the data
    fig = plt.figure()
    indicies = [left_idx, min_idx, right_idx]

    ax1 = fig.add_subplot(2, 1, 1)
    ax1.axvspan(x[left_idx], x[right_idx], facecolor='red', alpha=0.5)
    ax1.plot(x, y)                                                    
    ax1.plot(x[indicies], y[indicies], 'ro')                          

    ax2 = fig.add_subplot(2, 1, 2)
    ax2.axvspan(x[left_idx], x[right_idx], facecolor='red', alpha=0.5)
    ax2.plot(x,new_y)                                                 
    ax2.plot(x[indicies], y[indicies], 'ro')

    plt.show()

def fit_parabola(x, y):
    """Fits the equation "y = ax^2 + bx + c" given exactly 3 points as two
    lists or arrays of x & y coordinates"""
    A = np.zeros((3,3), dtype=np.float)
    A[:,0] = x**2
    A[:,1] = x
    A[:,2] = 1
    a, b, c = np.linalg.solve(A, y)
    return a, b, c

def replace_data(x, y, left_idx, right_idx, min_idx):
    """Replace the section of "y" between the indicies "left_idx" and
    "right_idx" with a parabola fitted to the three x,y points represented
    by "left_idx", "min_idx", and "right_idx"."""
    x_fit = x[[left_idx, min_idx, right_idx]]
    y_fit = y[[left_idx, min_idx, right_idx]]
    a, b, c = fit_parabola(x_fit, y_fit)

    new_x = x[left_idx:right_idx]
    new_y = a * new_x**2 + b * new_x + c

    y = y.copy() # Remove this if you want to modify y in-place
    y[left_idx:right_idx] = new_y
    return y

if __name__ == '__main__':
    main()

希望有点帮助...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 numpy 在重复信号的一部分内绘制抛物线 的相关文章

随机推荐

  • “JSON.stringify”中的“符号键控”是什么意思

    有一个Node js生成的Object 当我使用时它看起来像这样console log dataValues a 1 b 2 fn1 function fn2 function 当我使用JSON stringify 它返回这个字符串 a 1
  • 用小数字代替零?

    我一直在制作一个矩阵类 作为学习练习 并且在测试我的反函数时遇到并发出问题 我输入一个任意矩阵 2 1 1 1 2 1 1 1 2 并让它计算逆 我得到了正确的结果 0 75 0 25 0 25 0 25 0 75 0 25 0 25 0
  • 将 HTML 转换为 PDF - 任何 ASP.net 库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • SerialPort.Open() 抛出 IOException - 系统资源不足,无法完成请求的服务

    我编写了一个 NET 4 Windows 服务 该服务定期 通常每天一次 通过串行端口与外部设备进行通信 总而言之 服务效果很好 但对于一位客户来说 时不时地打电话给SerialPort Open 抛出以下异常 System IO IOEx
  • iPhone 分布:当前没有匹配的配置文件

    我即将将应用程序上传到 iTunes Connect 我不是团队代理 团队代理似乎也不能让我成为团队代理 于是他登录会员中心并下载了分发证书 该证书与 WWDR 证书一起位于我的钥匙串中 捆绑包标识符设置为 se companyname a
  • C++ 和 UTF8 - 为什么不直接替换 ASCII?

    在我的应用程序中 我必须不断地在之间转换字符串std string and std wstring由于不同的 API boost win32 ffmpeg 等 特别是对于 ffmpeg 字符串以 utf8 gt utf16 gt utf8
  • 我想使用并行 ssh 在多个服务器上运行 bash 脚本,但它简单地打印 echo 语句

    我有一个名为的 bash 脚本sr run batch sh它可以实现图像的超分辨率 现在我想同时在不同的服务器上并行进行测试 IE 1 个给定时间点的虚拟机 然后在某个时间点有 2 个虚拟机 然后是 3 个 然后是 4 个 我尝试将命令写
  • 如何在Android上更快地将RGB565转换为YUV420SP?

    我需要显示一张jpeg图片 并将其转换为YUV420SP 首先我使用SkBitmap解析jpeg并显示它 然后我使用下面的代码在android上将RGB565转换为YUV420SP 但是转换640 480 RGB565图片花费了75ms 所
  • 如何以Python方式选择随机字符? [复制]

    这个问题在这里已经有答案了 我想在 python 中生成一个 10 个字母数字字符的长字符串 因此 这是从字母数字字符列表中选择随机索引的一部分 My plan set list a b c all the way till I finis
  • 检测 SQL 数据库更改

    考虑这个例子 INSERT INTO Table column1 SELECT value1 如果我要在 SSMS 中执行此命令 对于 C 表单应用程序 我需要做什么才能识别此事件 就像应用程序显示一个简单的东西一样MessageBox当此
  • 为什么此已验证的 JSON Web 令牌 (JWT) 输出为未定义?

    我正在尝试解码 JWTid token using jwks rsa https github com auth0 node jwks rsa and jsonwebtoken https github com auth0 node jso
  • IndexError:列表索引超出 model.fit() 范围

    我是张量流的新手 我正在尝试使用形状 16 16 的图像来训练我的网络 我将3张512 512的灰度图像分成16 16并全部附加 所以我有3072 16 16 训练时我遇到错误 我正在使用 jupyter 笔记本 有人可以帮助我吗 这是代码
  • 使用 Phonegap for android 的应用程序图标[重复]

    这个问题在这里已经有答案了 我正在尝试将图标应用到我在 PhoneGap 本地制作的应用程序中 我已经进行了尽可能多的搜索 并且只找到了在 PhoneGap 构建上应用应用程序图标的方法 但是我正在 Eclipse 中本地构建应用程序 有人
  • 如何使用 Slick 代码生成器来包含数据库视图?

    我正在尝试使用 Slick 3 0 3 为我的架构中的数据库表和视图生成 Scala 代码 服用这个博客 http arnaudt github io 2015 03 31 slick codegen html例如我有以下文件build s
  • 如何在 Yii 中播种?

    我想知道一旦通过迁移创建了表 如何在 Yii 中播种 我有一个使用 up 方法的迁移 public function up this gt createTable users array id gt pk login gt string N
  • 如何减去两个数字字符串[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 查找二叉搜索树中某个节点的父节点

    所以我想找到二叉树中一个Node的父节点 假设我通过文本文件在树中输入30 15 17 45 69 80 7 这棵树应该是 30 15 45 7 17 69 80 这是我的代码 Node BST searchforparentnode No
  • Angularjs:事件发生后服务器端(php)渲染和数据绑定客户端

    后端提供了一个完全渲染的网站 在前端我希望 AngularJS 通过 ajax 调用 数据绑定来处理动态内容 但是如果你提供指令 ng bind 那么 AngularJS 会将它们直接绑定到它们的初始值 该值在任何之前都是 NULL用户操作
  • 如何在IE10 Mobile中制作固定div?

    如何制作适用于 Windows Phone 8 上 IE10 Mobile 的固定 div 我当前使用的代码是 div style width 100 background color blue test div 这仅部分有效 当用户滚动时
  • 使用 numpy 在重复信号的一部分内绘制抛物线

    我有一个重复信号 它随着大约每秒重复一次的过程的每个周期而略有变化 尽管每个周期的持续时间和内容在某些参数内略有不同 我的信号数据每秒有一千个 x y 坐标 每个周期内的一小部分但很重要的数据已损坏 我想用向上的抛物线替换每个损坏的部分 对