这是numpy.fftn中的高频术语?

时间:2016-02-23 22:42:50

标签: python arrays numpy fft

我在numpy中使用fftn来生成20个单元1D阵列和20x20x20 3D阵列的离散FT,并希望抑制高频项,从最高频率开始并向低频率延伸。我更熟悉连续的FT并努力识别DFT中的高频项。我应该在哪里查看fftn生成的数组? (我计划在反向转换之前将这些值设置为零。)

1 个答案:

答案 0 :(得分:1)

根据numpy.fft.fftn documentation

中的注释
  

输出类似于fft,包含所有轴的低阶角的零频率项,所有轴的前半部分的正频项,以及奈奎斯特频率的项。所有轴的中间和所有轴的后半部分中的负频率项,按负频率递减的顺序排列。

但请注意,对于奇数大小的数组,未表示奈奎斯特频率。此外,假设您正在处理实值信号,离散傅里叶变换将具有厄米特对称性。无论何时在频域处理这些信号,如果希望信号在逆变换后保持实值,则保持该对称非常重要。在将频率分量归零时,这意味着您还应该在相应的负频率处将频率分量归零。

这对于您的20个单元1D阵列(比如阵列x),L最高频率区间(包括L/2个正频率和L/2个负频率)意味着什么?因此

lower = (len(x)-L)/2+1
upper = (len(x)+L)/2+1
x[lower:upper]

同样,对于20x20x20 3D阵列(比如阵列y),沿每个轴的L最高频率分档为:

lower = [(d-L)/2+1 for d in y.shape]
upper = [(d+L)/2+1 for d in y.shape]
y[lower[0]:upper[0],:,:] # middle of axis 0
y[:,lower[1]:upper[1],:] # middle of axis 1
y[:,:,lower[2]:upper[2]] # middle of axis 2

现在假设this post by hotpaw2中描述的响铃效果不是您的应用程序的问题,那么您可以将这些区域归零:

import numpy as np;
L     = 3 # number of bins to zero out along each axis (change this to fit your needs)
          # should be odd for even length array, and even for odd length array

# Following assumes x is the 1D array
lower = (len(x)-L)/2+1
upper = (len(x)+L)/2+1
x[lower:upper] = 0 # zero-out in the middle

# Following assume y is the 3D array
lower = [(d-L)/2+1 for d in y.shape]
upper = [(d+L)/2+1 for d in y.shape]
y[lower[0]:upper[0],:,:] = 0 # zero-out in the middle of axis 0
y[:,lower[1]:upper[1],:] = 0 # zero-out in the middle of axis 1
y[:,:,lower[2]:upper[2]] = 0 # zero-out in the middle of axis 2