首页 > 解决方案 > 如何使用 Python / Scipy 平滑地缩放信号中的特定区域?

问题描述

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

需要蓝色曲线,红色是初始曲线

标签: pythonnumpymatplotlibscipy

解决方案


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

来自 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()

在此处输入图像描述


推荐阅读