【问题标题】:Understanding behavior when convolving/deconvolving with a Gaussian of different width了解使用不同宽度的高斯进行卷积/反卷积时的行为
【发布时间】: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


【解决方案1】:

你的反卷积实现:

decon_orig = waveform_fft/gauss_orig_fft

对噪音非常敏感。绘制gauss_orig_fft。您会看到它在很大的频率区域内几乎为零(这些是高频)。尤其是在高频下,信号内容通常很少,这意味着噪声在这里占主导地位。通过将这些频率除以如此小的值,您可以非常强烈地增强这种噪声。因此,您的去卷积信号主要是噪声。注意你的反卷积信号的幅度,它比输入大一个数量级!

为避免这种情况,请查看the Wiener filter。它与您所做的基本相同,但会调整结果以避免增强噪音。


关于高斯滤波的输出,您会注意到,对于接近 14 的 sigma,您再次逼近原始信号。对于较小的 sigma,平滑度较低,噪声继续占主导地位。对于更大的 sigma,一切都被抑制得更多,但仍然有一点噪音。不幸的是,由于您的卷积核未归一化,我们无法看到信号幅度被减小。您应该将array_new 除以其总和,使其总和为 1。这使得平均信号值在滤波前后保持不变,并允许您比较滤波前后信号的幅度.

第二个问题是您的内核没有以原点为中心。这会导致滤波后的信号偏移。由于 DFT 的周期性,信号基本上是回绕的。在 DFT 中,原点是信号的第一个样本。信号是周期性的,高斯将部分出现在左端,部分出现在右端,这样如果您重复信号,您可以看到完整的高斯。以这种方式定义内核,应用过滤器后不会出现偏移。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 2013-06-08
    • 2017-07-03
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多