多维数组FFT原理技术问询:fft(X)函数执行逻辑疑问
嘿,我来把多维数组下FFT的逻辑给你掰碎了讲,结合你给出的2×2×2数组示例,保证你能彻底搞懂!
先明确MATLAB中fft(X)的核心规则
首先得记住:当X是多维数组时,fft(X)会自动找到第一个长度不为1的维度(也就是维度序号最小、且size(X, dim) > 1的那个维度),然后把这个维度上的每个元素序列当成独立的一维向量,分别计算它们的傅里叶变换,最终结果保持原数组的维度结构不变。
为什么是“第一个非单一维度”?这和MATLAB的列优先存储逻辑一致,一维数组本质上就是只有第一个维度长度大于1的数组,所以多维FFT的规则是一维FFT的自然延伸。
用你的示例一步步拆解
先看你定义的数组:
X = [1 2; 3 4]; X(:,:,2) = [5 6; 7 8];
这个X是一个2×2×2的三维数组,用自然语言描述它的结构:
- 第1页(
X(:,:,1)):[[1,2],[3,4]] - 第2页(
X(:,:,2)):[[5,6],[7,8]]
步骤1:确定要处理的维度
size(X)返回[2,2,2],三个维度的长度都大于1,所以第一个非单一维度是维度1(行维度)。
步骤2:提取每个待变换的一维向量
所谓“把维度1上的值视为向量”,就是固定其他维度(维度2和维度3)的索引,取出维度1上的所有元素组成向量。咱们一个个列出来:
- 当维度2=1、维度3=1时,向量是
[1; 3](第1页第1列的两行元素) - 当维度2=2、维度3=1时,向量是
[2; 4](第1页第2列的两行元素) - 当维度2=1、维度3=2时,向量是
[5; 7](第2页第1列的两行元素) - 当维度2=2、维度3=2时,向量是
[6; 8](第2页第2列的两行元素)
步骤3:对每个向量做FFT
咱们手动计算每个向量的FFT(和MATLAB的fft结果一致):
fft([1;3]) = [1+3, 1-3] = [4, -2](因为2点FFT的公式是[x1+x2, x1-x2])fft([2;4]) = [2+4, 2-4] = [6, -2]fft([5;7]) = [5+7,5-7] = [12, -2]fft([6;8]) = [6+8,6-8] = [14, -2]
步骤4:重组结果为原维度结构
把上面的FFT结果按原数组的维度位置填回去,就得到了Y = fft(X):
- 第1页(
Y(:,:,1)):[[4,6], [-2,-2]] - 第2页(
Y(:,:,2)):[[12,14], [-2,-2]]
你可以在MATLAB里运行fft(X)验证,结果完全对应!
拓展:指定维度做FFT
如果不想用默认的第一个非单一维度,你可以手动指定维度,比如:
fft(X, [], 2):按**维度2(列维度)**做变换,也就是固定维度1和3,对每一行的元素做FFTfft(X, [], 3):按**维度3(页维度)**做变换,也就是固定维度1和2,对每个位置的跨页元素做FFT
举个fft(X, [], 3)的小例子:固定维度1=1、维度2=1时,向量是[1;5],FFT结果是[6,-4],这个值会放在Y(1,1,:)的位置。
一句话总结
多维FFT的核心就是:锁定目标维度,把其他维度的所有组合当成独立的“分组”,对每个分组内的目标维度元素做一维FFT,结果维度不变。
内容的提问来源于stack exchange,提问作者kais

