我想使用Matlab数组实现FFT(1d)。 Upon googling I came across this code。但是,这似乎是一个旧代码,它是在2007年编写的,我使用的是Matlab 2012.
我遇到了“索引超出矩阵维度”这样的错误。那么有人可以对代码进行更改,以便我可以在我的计算机上运行它吗?
PS:我知道Matlab有一个内置的fft例程。但是我想使用Matlab数组实现它,因为我将来会将此代码用于其他目的。此外,我需要fft适用于44k大小的数组,因此基本的DFT实现将不起作用。答案 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