python - 如何使用 Python / Scipy 平滑地缩放信号中的特定区域?
问题描述
我需要缩放一条曲线,如下图所示。曲线是由许多 X 和 Y 值组成的二维数组。重要的是曲线保持连续并且在我想要切割的地方没有“跳跃”。你有什么想法?python中是否有一个函数/函数可以做到这一点?
解决方案
创建一个在边缘具有平滑过渡的自定义过滤器,并将其用于缩放。一种方法是将具有高斯正态分布的卷积应用于盒函数并将结果用作窗口。( 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()
推荐阅读
- python - PyQt5 scrollArea with GridLayout of Image buttons blur/resize when scrolling
- c# - 如何使用 Active Directory 和数据库进行 ASP.Net Core 身份验证
- python - 如何使用内部函数返回的结果作为外部函数的参数?
- javascript - 从 JS 中的多维数组中突围——特定的 2 个问题
- c# - ASP.NET Core 项目中的 MySql 连接字符串错误
- mongodb - 当完整文档中的字段具有特定值时,MongoDB 领域触发
- c# - 移动滑块时如何播放音频剪辑?
- tensorflow - 为什么使用 CNN 进行时间序列预测时 x 大小和 y 大小必须相同?
- angular - 在角度编译器之前编辑打字稿
- mysql - 使用正则表达式从 MySQL 中的 URL 中提取主机名