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

Need help running this old Matlab code

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

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

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

代码的问题在第 3 行:

 p=ceil(l)

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

有 2 种可能的修复方法:

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