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