【问题标题】:Partial fft of multidimensional array多维数组的部分fft
【发布时间】:2018-11-30 17:08:01
【问题描述】:

我有一个维度为 (NX,NY,NZ) 的 3D 数组,它表示物理空间中的一个变量,比如说 velocities,取自 3D 域中的模拟。

1) 我只想对维度 X 和 Z 进行傅里叶变换,在这种情况下我应该如何使用内置函数 fft?在某些时候,我也想回到物理空间,但仅限于 X,所以同样的问题也适用。

2) 我读到 FFTW 只使用 2*N/3 个点,我应该将 NX 和 NZ 指定为保留模式的数量还是更少?

3) 使用 FFTW 包时,定义傅里叶变换的积分前面的系数是否有问题?这个包是否假设我的域是 2pix2pix2pi?

【问题讨论】:

  • 为什么你不能 (1) 只对所有数据进行 FFT 并在不需要的数据时删除,或者 (2) 制作一个子阵列 (NX,NZ) 并对其进行 FFT?问题是 FFT 函数还是数组操作?
  • 我需要物理空间中 Y 中的数据,所以我想我的第一个问题是关于 fft 例程的操作/使用

标签: matlab fftw


【解决方案1】:

1°) 2D FFT 的函数是fft2,默认情况下它将应用于数组的两个第一维。也就是说,fft2(velocities) 将为您提供一个 3D 数组,其中 NZ 沿维度 XY

进行傅里叶变换

为了沿其他维度进行 FFT,您必须手动将 2D FFT 分解为两个 1D FFT。 fft 默认情况下沿维度 1 工作,并产生与输入中的样本一样多的样本。 fft(X[],n) 做同样的事情,但沿着维度 n

因此,您可以使用以下命令沿维度 X 和 Z 计算 3D 数组的 2D FFT:

my_FFT = fft(fft(velocities),[],3);

2°) 输出的样本数与输入的样本数一样多。

3°) 我相信数组大小的归一化完全应用于反向变换,而不是直接变换。

fft([1 0 0 0 0 0])
ans =
     1     1     1     1     1     1

为保持标准化,应应用系数sqrt(NX*NZ)(进行 FFT 时相乘,进行 IFFT 时相除)。

【讨论】:

  • 谢谢!关于(3),除了乘/除以 sqrt(NX*NZ) 之外,我不应该对 sqrt(2pi*2pi) (除/乘) 做相反的事情吗?这不是 fft 使用的默认系数吗?在这一点上我有点迷失了。
  • 对不起,我最后的评论是错误的。然而,在读了一点之后,我认为这与你所说的@Brice相反。你能证实这一点吗?谢谢。
猜你喜欢
  • 2016-06-11
  • 2011-09-05
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多