适用于巨大“ N”的MATLAB Dftmtx

时间:2018-09-14 10:07:52

标签: fft large-data dft

我有一个大小为M(例如500)的向量,我将其向上采样MM = 500,因此我的新向量现在的大小为N = 500 x 500 = 250000。我正在使用优化算法,并且需要使用DFT矩阵而不是内置函数来执行大小为N的上采样矢量的fft / dft。

但是,由于内存限制,这变得令人望而却步。有什么办法吗?我在Huge Fourier matrix - MATLAB处看到了类似的问题,但这是关于一个巨大的矩阵,解决方案是将矩阵分解为多个列,然后逐列进行操作。就我而言,向量有250000行。

明智的做法是将行分成几段,每行500条,然后将同一事物迭代500次,然后将结果串联起来吗?

1 个答案:

答案 0 :(得分:0)

如果使用FFT是一种选择,则旋转因子矩阵不会显式显示,因此实际的存储需求约为O(N)

如果必须使用显式DFT矩阵,则可以使用较大DFT矩阵的子矩阵分解计算。给定长度为x的输入N,并假设我们希望将大型DFT矩阵划分为BlockSize x BlockSize个子矩阵,可以使用以下matlab代码完成此操作:

y = zeros(size(x));
Imax = ceil(N / BlockSize); % divide the rows into Imax chunks
Jmax = ceil(N / BlockSize); % divide the columns into Jmax chunks

% iterate over the blocks
for i=0:Imax-1
  imin = i*BlockSize;
  imax = min(i*BlockSize+BlockSize-1,N-1);
  for j=0:Jmax-1
    jmin = j*BlockSize;
    jmax = min(j*BlockSize+BlockSize-1,N-1);
    [XX,YY] = meshgrid(jmin:jmax, imin:imax);

    % compute the DFT submatrix
    W = exp(-2* pi * 1i * XX .* YY / N);

    % apply the DFT submatrix on a chunk of the input and add to the output
    y([imin:imax] + 1) = y([imin:imax] + 1) + W * x([jmin:jmax] + 1);
  end
end

如果需要,可以很容易地修改上面的代码,以使行上和列上使用不同的块大小。