Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python exp(-mod(x))的解析傅里叶变换与数值傅里叶变换的比较`_Python_Numpy_Fft_Continuous Fourier - Fatal编程技术网

Python exp(-mod(x))的解析傅里叶变换与数值傅里叶变换的比较`

Python exp(-mod(x))的解析傅里叶变换与数值傅里叶变换的比较`,python,numpy,fft,continuous-fourier,Python,Numpy,Fft,Continuous Fourier,我想使用numpy.fft模块来理解函数的解析FT和数值FT之间的区别(即为什么它们不一样)。从方程开始 , 此项的傅里叶变换可显示为分析FT(例如,参见Arfken、Weber和Harris p966,或sympy:Fourier_变换(exp(-abs(x)),x,k),这是2*pi不同的一个系数): 使用python/numpy计算sig=np.exp(-np.abs(x))的FFT给出了一个数值FT,可以根据解析解绘制(FT_numeric~=FT_解析x波在绘图中) 可将分析FT

我想使用
numpy.fft
模块来理解函数的解析FT和数值FT之间的区别(即为什么它们不一样)。从方程开始

,

此项的傅里叶变换可显示为分析FT(例如,参见Arfken、Weber和Harris p966,或
sympy
Fourier_变换(exp(-abs(x)),x,k)
,这是
2*pi
不同的一个系数):

使用python/numpy计算
sig=np.exp(-np.abs(x))
的FFT给出了一个数值FT,可以根据解析解绘制(FT_numeric~=FT_解析x波在绘图中)

可将分析FT视为数值FT的边界窗口函数,并可通过乘以适当的
cos
函数将其转换为数值FT(FT_解析x波与FT_数值重叠,函数形式见示例代码)

我的问题是,在这种情况下,为什么这个
numpy
FFT会产生一个修改的(由cos波调制的)数值FT?这与FFT的定义有关吗?我如何从它的描述中分辨出来:


似乎有一个根本性的误解。没有cos调制。您只是在绘制数值FFT信号的实部和分析结果的幅值。

在处理真实信号时,真实部分显然在0附近镜像。因此余弦。

似乎存在一个根本性的误解。没有cos调制。您只是在绘制数值FFT信号的实部和分析结果的幅值。链接的问题回答了您的问题。你所看到的是因为你的输入信号移动了半个周期。这将产生
i*pi*k
的相移。在应用
fft
@CrisLuengo之前,您需要对输入信号使用
ifftshift
,您是对的-如果我先使用
ifftshift
,则FT会正常工作。我想如果输入信号的域是关于零对称的,我应该使用这个方法?然而,在
numpy.fft
模块文档中,我看不到有这样的说明。也许你应该知道这一点?我不确定这个问题是重复的,因为它使用不同的库,不同的语言,关于不同的函数,尽管基本的修复是相同的。我认为这个概念已经在那里解释过了:原点必须是FFT输入向量的第一个样本。你在中间有原点,所以FFT认为它移动了半个周期。假设信号是周期性的,它与对称性无关,这对任何信号都适用。但是FFT(实际上是DFT)总是处理周期信号,输入向量是一个周期。这与英国《金融时报》完全不同。你是对的!我很笨。非常感谢。将
ft\u analysis.real
更改为
np.abs(ft\u analysis)
,看起来不错。这是错误的。解析解是纯实的,OP不是“只画实部”,没有虚部。数值结果确实有一个虚部,它是由输入信号的偏移引起的。仅仅放弃这个阶段是不正确的,即使它似乎给出了正确的结果。如果解析解在任何地方都有非零相位,则该解将失败。正确的解决方案是在
fft
之前对输入信号使用
ifftshift
。正如克里斯所说,我没有理由使用
np.abs
值(这一直困扰着我-偶数函数的FT应该是纯实数)。如Cris所示,如果我使用
ifftshift
对信号进行预移位,它将按预期工作(即绘制FT的真实部分与分析解相同)。谢谢你,克里斯。
import numpy as np
import numpy.fft as fft
import pylab as plt

x = np.linspace(-10, 10, 2001)
dx = x[1] - x[0]
normalization = 1 / dx

k = 2 * np.pi * fft.fftshift(fft.fftfreq(x.shape[0], d=dx))

# Signal.
sig = np.exp(-np.abs(x))

# Both shifted.
ft_numeric = fft.fftshift(fft.fft(sig))
ft_analytic = 2 / (1 + k**2)

wave = np.cos(2 * np.pi * k / (k[2] - k[0]))

plt.figure(1)
plt.clf()
plt.title('signal')
plt.plot(x, sig)
plt.xlabel('x')

plt.figure(2)
plt.clf()
plt.title('FT')
plt.plot(k, ft_analytic.real, label='ft_analytic')
plt.plot(k, normalization * ft_numeric, label='ft_numeric')
plt.plot(k, normalization * ft_numeric * wave, label='ft_analytic x wave')
plt.xlim((-15, 15))
plt.xlabel('k')
plt.legend()

plt.show()