我对StackExchange相当陌生,所以我希望我的格式是正确的!
我一直试图通过FFT更好地理解卷积/反褶积对Python的影响。
目前,我有一个波形和一个σ=14的高斯PDF。通过快速傅立叶变换分解它们给出这个潜在的信号。如果我把这个信号转换成高斯信号,参数相同,我就会得到原来的波形,就像预期的那样。
然而,我正在努力解决的当前问题是,为什么当我将底层信号与一个不同的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)发布于 2020-06-10 03:49:09
你们对反褶积的实施:
decon_orig = waveform_fft/gauss_orig_fft对噪音非常敏感。图gauss_orig_fft。你会看到,在一个大的频率区域(这些是高频),它几乎为零。特别是在高频时,信号含量通常很少,这意味着这里的噪声占主导地位。通过将这些频率除以如此小的值,你会非常强烈地增强这种噪音。因此,你的去旋信号是由噪声控制的。请注意您的反卷积信号的大小,它比输入大一个数量级!
为了避免这种情况,请查看维纳滤波器。它做的基本上是你正在做的事情,但规范化的结果,以避免提高噪音。
关于高斯滤波的输出,您会注意到,对于接近14的σ,您再次近似于原始信号。对于较小的西格玛,平滑度较低,噪声仍然占主导地位。对于更大的西格玛,一切都被压制得更多,但仍然有一点噪音。不幸的是,我们无法看到信号的幅度降低,因为你的卷积核没有标准化。你应该把array_new除以它的和,使它的总和达到1。这使得它使平均信号值在滤波前后保持不变,并允许您比较滤波前后信号的大小。
第二个问题是您的内核不是围绕原点的。这会导致滤波后信号的偏移。由于DFT的周期性,信号基本上环绕在周围。在DFT中,原点是信号的第一个样本。信号是周期性的,高斯部分出现在左端,部分出现在右端,这样,如果你重复信号,你就能看到整个高斯。通过这种方式定义内核,应用过滤器后不应该出现移位。
https://stackoverflow.com/questions/62292210
复制相似问题