【问题标题】:Need help running this old Matlab code需要帮助运行这个旧的 Matlab 代码
【发布时间】:2016-04-07 08:20:08
【问题描述】:

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

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

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

【问题讨论】:

  • 代码看起来兼容,你在哪一行得到错误?
  • u=Y(:,1:N2);给我的索引超过了矩阵维度。我已经用零填充了输入,使其形式为 2^N

标签: arrays matlab fft


【解决方案1】:

代码的问题在第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

【讨论】:

  • 感谢您的启蒙。我使用以下代码行修复了填充问题 - Y(N)=0;但是 u=Y(:,1:N2);给我的索引超出矩阵尺寸。错误
  • 再一次,这个错误的发生正是因为我所说的,将您的输入大小(即y)设置为 2 的任意幂,原始代码将起作用。 (至少我没有遇到错误)。您需要用零填充您的输入,而不是触摸函数部分 - 在函数的第 1 行之前添加一行以用零填充输入,使其达到 2 的幂大小。
  • @pyronic 查看我的编辑,将函数更改为此,它应该适用于任何大小的输入。其中输入向量是列向量(NOT ROW VECTOR)
  • 非常感谢!将输入从行向量更改为列向量就可以了。 :)
猜你喜欢
  • 2016-07-08
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多