高斯的傅立叶变换不是高斯变换,但这是错误的! - Python

时间:2011-03-22 21:52:13

标签: python numpy fft

我正在尝试利用Numpy的fft函数,但是当我给函数一个简单的gausian函数时,该gausian函数的fft不是gausian,它的接近但它的一半使得每一半都在x轴的任一端

我正在计算的高斯函数是 y = exp(-x ^ 2)

这是我的代码:

from cmath import *
from numpy import multiply
from numpy.fft import fft
from pylab import plot, show

""" Basically the standard range() function but with float support """
def frange (min_value, max_value, step):
    value = float(min_value)
    array = []
    while value < float(max_value):
        array.append(value)
        value += float(step)
    return array


N = 256.0 # number of steps
y = []
x = frange(-5, 5, 10/N)

# fill array y with values of the Gaussian function   
cache = -multiply(x, x)
for i in cache: y.append(exp(i))

Y = fft(y)

# plot the fft of the gausian function
plot(x, abs(Y))
show()

结果不太正确,导致高斯函数的FFT本身应该是高斯函数...

5 个答案:

答案 0 :(得分:13)

np.fft.fft以所谓的“标准顺序”返回结果:(from the docs

  

如果A = fft(a, n),则A[0]   包含零频率项(   信号的平均值,这是永远的   纯粹真实的输入。然后   A[1:n/2]包含   正频项,和   A[n/2+1:]包含   负频率项,按顺序排列   负频率递减。

函数np.fft.fftshift将结果重新排列为大多数人期望的顺序(哪些对绘图有用):

  

例程np.fft.fftshift(A)   转变和他们的   将频率置于零频率   中间的组件...

所以使用np.fft.fftshift

import matplotlib.pyplot as plt
import numpy as np

N = 128
x = np.arange(-5, 5, 10./(2 * N))
y = np.exp(-x * x)
y_fft = np.fft.fftshift(np.abs(np.fft.fft(y))) / np.sqrt(len(y))
plt.plot(x,y)
plt.plot(x,y_fft)
plt.show()

enter image description here

答案 1 :(得分:4)

你的结果甚至不接近高斯,甚至没有分成两半。

要获得您期望的结果,您必须将自己的高斯定位在索引为0的中心,结果也将以此方式定位。请尝试以下代码:

from pylab import *
N = 128
x = r_[arange(0, 5, 5./N), arange(-5, 0, 5./N)]
y = exp(-x*x)
y_fft = fft(y) / sqrt(2 * N)
plot(r_[y[N:], y[:N]])
plot(r_[y_fft[N:], y_fft[:N]])
show()

绘图命令将数组分成两半并交换它们以获得更好的图像。

Plot

答案 2 :(得分:3)

以系数索引为零显示中心(即平均值)。这就是为什么看起来右半部分在左边,反之亦然。

编辑:浏览以下代码:

import scipy
import scipy.signal as sig
import pylab
x = sig.gaussian(2048, 10)
X = scipy.absolute(scipy.fft(x))
pylab.plot(x)
pylab.plot(X)
pylab.plot(X[range(1024, 2048)+range(0, 1024)])

最后一行将从向量的中心开始绘制X,然后环绕到开头。

答案 3 :(得分:2)

傅立叶变换无限地隐式重复,因为它是无限地隐式重复的信号的变换。请注意,当您传递y进行转换时,不提供x值,因此实际上转换的高斯是以0到256之间的中值为中心的高斯,因此128。

还要记住,f(x)的平移是F(x)的相位变化。

答案 4 :(得分:2)

根据Sven Marnach的回答,一个更简单的版本是:

from pylab import *
N = 128

x = ifftshift(arange(-5,5,5./N))

y = exp(-x*x)
y_fft = fft(y) / sqrt(2 * N)

plot(fftshift(y))
plot(fftshift(y_fft))

show()

这产生了与上面相同的图。

密钥(这对我来说似乎很奇怪)是NumPy假定的数据排序---在 频率时域中 - 就是拥有“零“价值第一。这不是我对其他FFT实现的期望,例如C中的FFTW3库。

这在上面的unutbu和Steve Tjoa的答案中略微捏造,因为他们在绘制之前采用了FFT的绝对值,从而消除了由于未及时使用“标准顺序”而导致的阶段问题。