【问题标题】:How can I smoothly scale a specific region in a signal with Python / Scipy?如何使用 Python / Scipy 平滑地缩放信号中的特定区域?
【发布时间】:2018-08-21 21:05:17
【问题描述】:

我需要缩放如下图所示的曲线。曲线是由许多 X 和 Y 值组成的二维数组。重要的是曲线保持连续并且在我想要切割的地方没有“跳跃”。你有什么想法? python中是否有一个/多个函数可以做到这一点?

【问题讨论】:

  • 我不清楚您需要哪种类型的缩放。这些变化不是一个简单的线性因素。 似乎,所讨论的范围都在 x 截距处开始和结束;这将为您提供乘法变化的连续性(即乘以一个因子)。可能没有这样的 Python 函数,但 NumPy lambda 函数可能会产生你想要的。请举例说明您迄今为止所做的尝试。
  • 是的,我只是根据与时间轴的交点对函数进行了缩放。但是,如果我想缩放一个不通过 X=0 的峰值(函数的一部分)怎么办(我要上传一张新的、更好的图片)?想象一下曲线移动了,所以它不会通过 X=0。我是否应该将其移回 X=0,缩放我需要的部分(使用 lambda)并将其再次移回原来的位置?我想,可能有一个 NumPy 函数可以为我完成这些步骤。缩放和未缩放部分结合的位置处的“飞跃”又如何呢?我必须以某种方式解决它们。

标签: python numpy matplotlib scipy


【解决方案1】:

创建一个边缘平滑过渡的自定义过滤器,并将其用于缩放。一种方法是将具有高斯正态分布的卷积应用于盒函数并将结果用作窗口。 (scipy.convolve)

(来自 scipy.convolve 的图片)

这里有一些代码可以帮助您入门。 当然你可以通过调整signal.hann(50)的参数来控制过滤器边缘的陡度。

import numpy as np
from scipy import signal
sig = np.repeat([0., 1., 0.], 100)
print(sig)
win = signal.hann(50)
filtered = signal.convolve(sig, win, mode='same') / sum(win)


import matplotlib.pyplot as plt

fig, (ax_orig, ax_win, ax_filt, ax_scal) = plt.subplots(4, 1, sharex=True)
ax_orig.plot(sig)
ax_orig.set_title('Original pulse')
ax_orig.margins(0, 0.1)
ax_win.plot(win)
ax_win.set_title('Filter impulse response')
ax_win.margins(0, 0.1)
ax_filt.plot(filtered)
ax_filt.set_title('Filtered signal')
ax_filt.margins(0, 0.1)


x = np.linspace(0.0, 300, 300)
y = np.sin(x)

ax_scal.plot(x, y)

ax_scal.plot(x, y * (filtered + 1), 'r-')

ax_scal.set_title('Scaled signal')
ax_scal.margins(0, 0.1)


fig.tight_layout()
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-01
    • 2020-10-30
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多