了解 convolving/deconvolving 具有不同宽度的高斯时的行为
Understanding behavior when convolving/deconvolving with a Gaussian of different width
我是 StackExchange 的新手,所以我希望我的格式是正确的!
我一直在尝试通过 FFT 更好地理解 convolution/deconvolution 对 Python 的影响。
目前,我有一个波形和一个 σ=14 的高斯 PDF。通过 FFT 对它们进行反卷积得到 this underlying signal。
如果我采用该基础信号并将其与具有相同参数的高斯函数进行卷积,我将按预期返回原始波形。
但是,我正在尝试解决的当前问题是为什么当我将基础信号与具有不同 σ 的高斯函数进行卷积时,我的新波形的形状会发生如此剧烈的变化:https://imgur.com/a/U7lvn7q
如果我将 σ 从 14(用于与原始波形反卷积的高斯的原始参数)更改为 12,我会看到新波形尾部的波动更大,行为更不稳定,但整体形状保持不变类似于原始波形的形状。
但是,当我将 σ 从 14 更改为 20 或从 14 更改为 10 并将该高斯与基础信号进行卷积时,生成的波形看起来 与原始波形完全不同。
是什么导致了这些剧烈的变化?它是高斯 PDF 的一些底层 属性 吗?我对 convolution/deconvolution 和 FFT/iFFT 的数学掌握得相当好,但我希望有人能帮助我理解是什么导致了波形形状的这些变化!非常感谢。
#reading in the arrays from the txt file for the waveform
mu = 9,990
sig = 14
totArea = 0
time_array = []
charge_array = []
for i in range(len(file)):
t = f[i][0]
a = f[i][1]
totArea += a
tot = totArea * 3.3
#defining a Gaussian function with given mu and sigma
def gaussfn(t,sig,mu):
return np.exp((-(t-mu)**2)/(2*sig**2))
result_orig = integrate.quad(lambda t:gaussfn(t,sig,mu),
(mu-3*sig),(mu+3*sig))
amp_orig = tot/result_orig[0]
array_orig = amp_orig * gaussfn(time_array,sig,mu)
#deconvolving waveform and Gaussian via FFT to get the underlying signal
gauss_orig_fft = np.fft.fft(array_orig)
waveform_fft = np.fft.fft(charge_array)
decon_orig = waveform_fft/gauss_orig_fft
signal = np.fft.ifft(decon_orig)
#defining a new Gaussian function of a different width
new_sig = 10
def gaussfn(t,new_sig,mu):
return np.exp((-(t-mu)**2)/(2*new_sig**2))
result_new = integrate.quad(lambda t:gaussfn(t,new_sig,mu),
(mu-3*new_sig),(mu+3*new_sig))
amp_new = tot/result_new[0]
array_new = amp_new * gaussfn(time_array,new_sig,mu)
#using FFT to convolve the underlying signal (above) with a
Gaussian of a different sigma to get a new waveform
gauss_new_fft = np.fft.fft(array_new)
signal_fft = np.fft.fft(signal)
convolution_new = signal_fft * gauss_new_fft
new_waveform = np.fft.ifft(convolution_new)
你的反卷积实现:
decon_orig = waveform_fft/gauss_orig_fft
对噪音非常敏感。情节 gauss_orig_fft
。您会看到它在很大的频率区域(这些是高频)几乎为零。尤其是在高频下,信号内容通常很少,这意味着噪声在这里占主导地位。通过将这些频率除以如此小的值,您可以非常强烈地增强这种噪声。因此,您的反卷积信号以噪声为主。注意你的反卷积信号的大小,它比输入大一个数量级!
要避免这种情况,请查看 the Wiener filter。它做的事情与您所做的基本相同,但对结果进行正则化以避免增强噪声。
关于高斯滤波的输出,您会注意到对于接近 14 的西格玛,您再次近似于原始信号。对于较小的 sigma,平滑度较低,噪声占主导地位。对于较大的西格玛,一切都被抑制得更多,但仍然有一点噪音。不幸的是,我们看不到信号幅度的降低,因为您的卷积核未归一化。您应该将 array_new
除以它的总和,使其总和为 1。这使得平均信号值在滤波前后保持相同,并允许您比较信号前后的幅度过滤后
第二个问题是你的内核没有以原点为中心。这会导致信号在滤波后发生偏移。由于 DFT 的周期性,信号基本上环绕。在 DFT 中,原点是信号的第一个样本。信号是周期性的,高斯分布会部分出现在左端,部分出现在右端,这样如果您重复该信号,您就可以看到完整的高斯分布。使用以这种方式定义的内核,应用过滤器后不应出现移位。
我是 StackExchange 的新手,所以我希望我的格式是正确的!
我一直在尝试通过 FFT 更好地理解 convolution/deconvolution 对 Python 的影响。
目前,我有一个波形和一个 σ=14 的高斯 PDF。通过 FFT 对它们进行反卷积得到 this underlying signal。 如果我采用该基础信号并将其与具有相同参数的高斯函数进行卷积,我将按预期返回原始波形。
但是,我正在尝试解决的当前问题是为什么当我将基础信号与具有不同 σ 的高斯函数进行卷积时,我的新波形的形状会发生如此剧烈的变化:https://imgur.com/a/U7lvn7q
如果我将 σ 从 14(用于与原始波形反卷积的高斯的原始参数)更改为 12,我会看到新波形尾部的波动更大,行为更不稳定,但整体形状保持不变类似于原始波形的形状。 但是,当我将 σ 从 14 更改为 20 或从 14 更改为 10 并将该高斯与基础信号进行卷积时,生成的波形看起来 与原始波形完全不同。
是什么导致了这些剧烈的变化?它是高斯 PDF 的一些底层 属性 吗?我对 convolution/deconvolution 和 FFT/iFFT 的数学掌握得相当好,但我希望有人能帮助我理解是什么导致了波形形状的这些变化!非常感谢。
#reading in the arrays from the txt file for the waveform
mu = 9,990
sig = 14
totArea = 0
time_array = []
charge_array = []
for i in range(len(file)):
t = f[i][0]
a = f[i][1]
totArea += a
tot = totArea * 3.3
#defining a Gaussian function with given mu and sigma
def gaussfn(t,sig,mu):
return np.exp((-(t-mu)**2)/(2*sig**2))
result_orig = integrate.quad(lambda t:gaussfn(t,sig,mu),
(mu-3*sig),(mu+3*sig))
amp_orig = tot/result_orig[0]
array_orig = amp_orig * gaussfn(time_array,sig,mu)
#deconvolving waveform and Gaussian via FFT to get the underlying signal
gauss_orig_fft = np.fft.fft(array_orig)
waveform_fft = np.fft.fft(charge_array)
decon_orig = waveform_fft/gauss_orig_fft
signal = np.fft.ifft(decon_orig)
#defining a new Gaussian function of a different width
new_sig = 10
def gaussfn(t,new_sig,mu):
return np.exp((-(t-mu)**2)/(2*new_sig**2))
result_new = integrate.quad(lambda t:gaussfn(t,new_sig,mu),
(mu-3*new_sig),(mu+3*new_sig))
amp_new = tot/result_new[0]
array_new = amp_new * gaussfn(time_array,new_sig,mu)
#using FFT to convolve the underlying signal (above) with a
Gaussian of a different sigma to get a new waveform
gauss_new_fft = np.fft.fft(array_new)
signal_fft = np.fft.fft(signal)
convolution_new = signal_fft * gauss_new_fft
new_waveform = np.fft.ifft(convolution_new)
你的反卷积实现:
decon_orig = waveform_fft/gauss_orig_fft
对噪音非常敏感。情节 gauss_orig_fft
。您会看到它在很大的频率区域(这些是高频)几乎为零。尤其是在高频下,信号内容通常很少,这意味着噪声在这里占主导地位。通过将这些频率除以如此小的值,您可以非常强烈地增强这种噪声。因此,您的反卷积信号以噪声为主。注意你的反卷积信号的大小,它比输入大一个数量级!
要避免这种情况,请查看 the Wiener filter。它做的事情与您所做的基本相同,但对结果进行正则化以避免增强噪声。
关于高斯滤波的输出,您会注意到对于接近 14 的西格玛,您再次近似于原始信号。对于较小的 sigma,平滑度较低,噪声占主导地位。对于较大的西格玛,一切都被抑制得更多,但仍然有一点噪音。不幸的是,我们看不到信号幅度的降低,因为您的卷积核未归一化。您应该将 array_new
除以它的总和,使其总和为 1。这使得平均信号值在滤波前后保持相同,并允许您比较信号前后的幅度过滤后
第二个问题是你的内核没有以原点为中心。这会导致信号在滤波后发生偏移。由于 DFT 的周期性,信号基本上环绕。在 DFT 中,原点是信号的第一个样本。信号是周期性的,高斯分布会部分出现在左端,部分出现在右端,这样如果您重复该信号,您就可以看到完整的高斯分布。使用以这种方式定义的内核,应用过滤器后不应出现移位。