【发布时间】:2020-09-29 04:44:39
【问题描述】:
我对 StackExchange 还很陌生,所以希望我的格式正确!
我一直试图通过 FFT 在 Python 上更好地理解卷积/反卷积的效果。
目前,我有一个波形和一个 σ=14 的高斯 PDF。通过 FFT 对它们进行反卷积得到this underlying signal。 如果我采用该基础信号并将其与具有相同参数的高斯进行卷积,我将得到原始波形,正如预期的那样。
但是,我正在尝试解决的当前问题是,为什么当我将基础信号与具有不同 σ 的高斯进行卷积时,我的新波形的形状会发生如此剧烈的变化:https://imgur.com/a/U7lvn7q
如果我将 σ 从 14(用于与原始波形反卷积的高斯的原始参数)更改为 12,我会看到新波形尾部的波动更大,行为更不稳定,但整体形状仍然类似于原始波形的形状。 但是,当我将 σ 从 14 更改为 20 或从 14 更改为 10 并将该高斯与基础信号进行卷积时,生成的波形看起来 与原始波形完全不同。
是什么导致了这些剧烈的变化?它是高斯 PDF 的一些基本属性吗?我对卷积/反卷积和 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)
【问题讨论】:
-
请出示您的代码。从与高斯的卷积中得到这样一个波形信号是没有意义的。你说的是卷积,不是反卷积?这些是非常不同的东西!
-
@CrisLuengo 我正在用 sigma = 14 的高斯对波形进行反卷积以获得基础信号。然后,我将该信号与不同 sigma 的高斯进行卷积以获得新波形。
-
@CrisLuengo 我在上面添加了我的代码。
-
time_array有什么价值?(mu-3*sig),(mu+3*sig)是否适合您尝试的所有 sigma? -
@CrisLuengo 我的时间数组是 128 个元素。它从 9923.82423983 ns 开始,到 10342.9242398 ns 结束,步长为 3.3 ns。我的 mu 是 9,990 ns,并且 (mu-3*sig), (mu+3*sig) 确实适合我尝试的值的时间数组!
标签: python signal-processing fft convolution gaussian