需要帮助 运行 这个旧的 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
我想使用 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