Python中的FFT:格式化一维衍射傅立叶变换

时间:2015-08-03 16:44:55

标签: python numpy fft

我对Python和FFT功能比较陌生。我正在尝试使用numpy.fft.fft()函数将方波脉冲(1-D衍射狭缝函数)转换为sinc函数(1-D衍射图案),并使输出图与分析变换相同方波脉冲,由下式给出:

  

F(u)= sin(πau)/(πu)

但是,我无法格式化FFT,使其看起来与分析功能相同。这是我最小的工作代码:

a = 40.0  # slit width
N = 5000  # sample points
T = 100.0  # sample spacing
x = np.linspace(-T/2.0,T/2.0,N)

y = np.piecewise(x,[abs(x)>a/2,abs(x)<=a/2],[0,1])  # make 1-D square pulse array

dx = x[1] - x[0]
yf = np.fft.fft(y) * dx  # Fourier transform
xf = np.fft.fftfreq(N,d=dx)
xf = np.fft.fftshift(xf)
yf = np.fft.fftshift(yf)
plt.figure(1)
plt.plot(xf,yf)

f = np.sin(np.pi*a*x)/(np.pi*x)  # analytical transform function
plt.figure(2)
plt.plot(x,f)
plt.show()

我想我需要调整FFT的频率,但我不确定。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

你有一个有限长度的离散信号。使用FFT时 计算那个信号的傅立叶变换,你假设是 信号周期性。也就是说,您的信号不是单个矩形脉冲;它是重复脉冲。适用的分析结果 这种情况是周期性sinc函数(也称为别名sinc函数 或者 Dirichlet函数),其中一种形式是

f(x) = sin(n*x/2) / (n*sin(x/2))

此功能以scipy.special.diric的形式提供。就在最近我 在diric的docstring中添加了一个示例,以准确显示您的内容 在问。这是一个例子。 (它不会出现在已发布的版本中 scipy直到版本0.17。)

标准进口:

>>> import numpy as np
>>> from scipy import special

为演示创建一个小的矩形脉冲:

>>> m = 8
>>> k = 3
>>> x = np.zeros(m)
>>> x[:k] = 1

使用FFT计算x的傅里叶变换,和 检查系数的大小:

>>> np.abs(np.fft.fft(x))
array([ 3.        ,  2.41421356,  1.        ,  0.41421356,  1.        ,
        0.41421356,  1.        ,  2.41421356])

现在使用diric找到相同的值(最多签名)。我们成倍增加 由k来计算。的不同缩放约定 numpy.fft.fftdiric

>>> theta = np.linspace(0, 2*np.pi, m, endpoint=False)
>>> k * special.diric(theta, k)
array([ 3.        ,  2.41421356,  1.        , -0.41421356, -1.        ,
       -0.41421356,  1.        ,  2.41421356])