在4D矩阵中查找FFT和求和

时间:2016-07-18 00:10:55

标签: matlab matrix fft

拜托,我有F(8*409600*3)矩阵。我想将其重新整形为B(8*512*3*800)矩阵(每行应划分为800部分)然后我必须为每个(FFT)行找到快速傅里叶变换(8*512)并将其乘以在我必须找到第四维中每行元素的总和并将它们平均为第四维(800)内的切片数之后,它的共轭并除以常数。我的意思是

(B(1,1,1,1) +B(1,1,1,2)+B(1,1,1,3)……+B(1,1,1,800))/800
(B(1,2,1,1) +B(1,2,1,2)+B(1,2,1,3)……+B(1,2,1,800))/800

每一行等等。

我使用下面的代码似乎有效,但没有给出正确的结果。

 F=rand(8,409600,3);
 B=reshape(F,8,512,3,[]);
 C1=fft(B, [],2);
 C2=C1.*conj(C1);
 C3=C2/(3000);
 C4=sum(C3,4)/800;

由于

1 个答案:

答案 0 :(得分:1)

我想你想尝试B = reshape(F, 8, 512, [], 3);得到8乘512乘800乘3阵列。

然后执行C1 = abs(fft(B, [], 2)).^2;以获取512点FFT并将频谱转换为功率谱。 (请注意,对于复杂的cconj(c) * c == abs(c)^2来加工精度。)

然后你想平均那800个512点PSD:C2 = squeeze(mean(C1, 3));。如果你不在这里使用squeeze,那么你将拥有8乘512乘1乘3的数组,squeeze只消除1长度维度,C2为8由512乘3阵列。我更喜欢在这里使用mean而不是求和,因为你想要达到的目标更明显。

最后,您似乎有3000因素,因此:C3 = C2 / 3000;

以下是我如何思考你的问题。你有八个传感器(麦克风,光电二极管,等等)。每个传感器收集409600个样本。你这样做了三天。所以你的原始F矩阵是8乘409600乘3。

现在,您想了解三天内每个传感器的功率谱密度如何变化。因此,您将每个传感器/天的409600个样本分成800个块,每个块获得512个样本 - 块之间没有重叠。在上面的代码中,您将获取每个512长的块的FFT并对其中的所有800个进行平均。这将为您提供一个8乘512乘3的数组,现在您可以拥有所需的数据:每天估算每个传感器的PSD。