运算后傅里叶逆变换域

domain of inverse fourier transform after operation

背景:我观察了一个变量z的样本,它是两个独立且同分布的变量x和y的总和。在假设 f 关于零对称的情况下,我试图从 z(称为 g)的分布中恢复 x、y(称为 f)的分布。根据Horowitz and Markatou (1996)我们有f的傅里叶变换等于sqrt(|G|),其中G是g的傅里叶变换。

示例

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde, laplace


# sample size
size = 10000
# Number of points to preform FFT on
N = 501
# Scale of the laplace rvs
scale = 3.0

# Test deconvolution
laplace_f = laplace(scale=scale)
x = laplace_f.rvs(size=size)
y = laplace_f.rvs(size=size)
z = x + y
t = np.linspace(-4 * scale, 4 * scale, size)
laplace_pdf = laplace_f.pdf(t)
t2 = np.linspace(-4 * scale, 4 * scale, N)

# Get density from z. Kind of cheating using gaussian
z_density = gaussian_kde(z)(t2)
z_density = (z_density + z_density[::-1]) / 2
z_density_half = z_density[:((N - 1) // 2) + 1]
ft_z_density = np.fft.hfft(z_density_half)
inv_fz_density = np.fft.ihfft(np.sqrt(np.abs(ft_z_density)))
inv_fz_density = np.r_[inv_fz_density, inv_fz_density[::-1][:-1]]
f_deconv_shifted = np.real(np.fft.fftshift(inv_fz_density))
f_deconv = np.real(inv_fz_density)

# Normalize to be a pdf
f_deconv_shifted /= f_deconv_shifted.mean()
f_deconv /= f_deconv.mean()

# Plot
plt.subplot(221)
plt.plot(t, laplace_pdf)
plt.title('laplace pdf')

plt.subplot(222)
plt.plot(t2, z_density)
plt.title("z density")

plt.subplot(223)
plt.plot(t2, f_deconv_shifted)
plt.title('Deconvolved with shift')

plt.subplot(224)
plt.plot(t2, f_deconv)
plt.title('Deconvolved without shift')

plt.tight_layout()
plt.show()

这导致

问题:这里显然有问题。我认为我不需要转变,但转变后的 pdf 似乎更接近事实。我怀疑它与 IFFT 域随 sqrt(abs()) 操作变化有关,但我真的不确定。

FFT 的定义使得与输入样本相关的时间为 t=0..N-1。也就是说,原点在第一个样本中。输出也是如此,关联的频率为k=0..N-1.

您的分布关于零对称,但忽略您的 t(您不能将其传递给 FFT 函数),并且知道 t 值是什么根据 FFT 定义,您可以看到您的分布实际上发生了偏移,这在频域中添加了一个相位分量。您忽略那里的相位(通过使用 hfft 而不是 fft,这意味着您移动输入信号,使其关于 FFT 定义的原点(不是您的原点)对称。

fftshift 移动 IFFT 产生的信号,使原点回到您想要的位置。我建议您在调用 hfft 之前使用 ifftshift,只是为了确保您的信号实际上是该函数预期的对称信号。不知道会不会有影响,要看这个功能是怎么实现的。