gpt4 book ai didi

python - 如何消除由于 scipy/numpy fft 中的零填充而产生的边界效应?

转载 作者:太空狗 更新时间:2023-10-29 22:23:27 25 4
gpt4 key购买 nike

我编写了一个 python 代码,使用 Weierstrass 变换平滑给定信号,这基本上是归一化高斯与信号的卷积。

代码如下:


#Importing relevant libraries  
from __future__ import division
from scipy.signal import fftconvolve
import numpy as np

def smooth_func(sig, x, t= 0.002):
N = len(x)
x1 = x[-1]
x0 = x[0]


# defining a new array y which is symmetric around zero, to make the gaussian symmetric.
y = np.linspace(-(x1-x0)/2, (x1-x0)/2, N)
#gaussian centered around zero.
gaus = np.exp(-y**(2)/t)

#using fftconvolve to speed up the convolution; gaus.sum() is the normalization constant.
return fftconvolve(sig, gaus/gaus.sum(), mode='same')

如果我为一个阶梯函数运行这段代码,它会平滑角,但在边界处它会解释另一个角并平滑它,结果在边界处产生不必要的行为。我用下面链接中显示的图来解释这一点。
Boundary effects

如果我们直接积分求卷积就不会出现这个问题。因此问题不在 Weierstrass 变换中,因此问题在 scipy 的 fftconvolve 函数中。

要理解为什么会出现这个问题,我们首先需要了解 fftconvolve 在 scipy 中的工作方式。
fftconvolve 函数基本上使用卷积定理来加速计算。
简而言之,它说:
卷积(int1,int2)=ifft(fft(int1)*fft(int2))
如果我们直接应用这个定理,我们不会得到想要的结果。为了获得所需的结果,我们需要对一个大小为 max(int1,int2) 两倍的数组进行 fft。但这会导致不希望的边界效应。这是因为在 fft 代码中,如果 size(int) 大于 size(在其上采用 fft),它会用零填充输入,然后采用 fft。这种零填充正是造成不良边界效应的原因。

您能建议一种消除这种边界效应的方法吗?

我试图通过一个简单的技巧将其删除。平滑函数后,我将平滑信号的值与边界附近的原始信号进行比较,如果它们不匹配,我将在该点用输入信号替换平滑函数的值。
如下:


i = 0 
eps=1e-3
while abs(smooth[i]-sig[i])> eps: #compairing the signals on the left boundary
smooth[i] = sig[i]
i = i + 1
j = -1

while abs(smooth[j]-sig[j])> eps: # compairing on the right boundary.
smooth[j] = sig[j]
j = j - 1

这个方法有一个问题,因为使用了epsilon,平滑函数中有小的跳跃,如下所示:
jumps in the smooth func

上面的方法是否可以做一些修改来解决这个边界问题?

最佳答案

最好的方法可能是使用 mode = 'valid':

输出只包含那些不包含的元素
依靠零填充。

除非您可以包装信号,或者正在处理的信号是从更大信号中摘录的(在这种情况下:处理完整信号,然后裁剪感兴趣的区域),否则在进行卷积时您总是会产生边缘效应。你必须选择你想如何处理它们。使用 mode = valid 只是裁剪掉它们,这是一个很好的解决方案。如果您知道信号始终是“阶跃式”的,那么您可以适本地扩展已处理信号的前端和末尾。

关于python - 如何消除由于 scipy/numpy fft 中的零填充而产生的边界效应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10006084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com