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

chu*_*tsu 8 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()
Run Code Online (Sandbox Code Playgroud)

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

unu*_*tbu 14

np.fft.fft以所谓的"标准顺序"返回结果:( 来自文档)

如果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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述