需要帮助运行这个旧的Matlab代码

时间:2016-04-07 08:20:09

标签: arrays matlab fft

我想使用Matlab数组实现FFT(1d)。 Upon googling I came across this code。但是,这似乎是一个旧代码,它是在2007年编写的,我使用的是Matlab 2012.

我遇到了“索引超出矩阵维度”这样的错误。那么有人可以对代码进行更改,以便我可以在我的计算机上运行它吗?

PS:我知道Matlab有一个内置的fft例程。但是我想使用Matlab数组实现它,因为我将来会将此代码用于其他目的。此外,我需要fft适用于44k大小的数组,因此基本的DFT实现将不起作用。

1 个答案:

答案 0 :(得分:2)

代码的问题在第3行:

 p=ceil(l)

该代码假定您的输入信号的长度为2的幂(例如4096个样本或9192个)。 如果您使用的数字小于2的幂,则此处的p将创建一个大于输入的矩阵。

有两种可能的解决方法:

1,使用padarray用额外的零填充输入,直到达到下一个2的幂。

2,将ceil更改为floor以减少评估的数据。但是,这意味着只评估部分输入。

如果您想使用方法1,您需要执行以下操作:

将功能更改为:

size=length(input);
l=log2(size);
p=ceil(l); 
input(2^p) = 0;
Y=input'; %//NOTE HERE!!!!! the `'` is used if your data is a COLUMN vector, if it is a ROW VECTOR remove this `'`
N = 2^p;
N2=N/2; 
YY = -pi*sqrt(-1)/N2; 
WW = exp(YY);  
JJ = 0 : N2-1;  
 W=WW.^JJ;
for L = 1 : p-1
   u=Y(:,1:N2);
   v=Y(:,N2+1:N);
   t=u+v;
   S=W.*(u-v);
   Y=[t ; S];
   U=W(:,1:2:N2);
   W=[U ;U];
   N=N2;
   N2=N2/2;
end;
u=Y(:,1);
v=Y(:,2);
Y=[u+v;u-v];
Y