1

以下の Octave radix-4FFT コードは、(xp) 値の累乗を4ケースバイケースで設定すると正常に動作します。

$ octave fft4.m

ans = 1.4198e-015

ただし、ループコードのコメントを外すと、次のエラーが発生します

$ octave fft4.m

error: `stage' undefined near line 48 column 68
error: evaluating argument list element number 1
error: evaluating argument list element number 2
error: called from:
error:   r4fftN at line 48, column 22
error:   c:\Users\david\Documents\Visual Studio 2010\Projects\mv_fft\fft4.m at line 80, column 7

the "error" refers to a line the in fft function code which otherwise works correctly when xp is not set by a loop ... very strange.


    function Z = radix4bfly(x,segment,stageFlag,W)
      % For the last stage of a radix-4 FFT all the ABCD multiplers are 1.
      % Use the stageFlag variable to indicate the last stage
      % stageFlag = 0 indicates last FFT stage, set to 1 otherwise

      % Initialize variables and scale to 1/4
      a=x(1)*.25;
      b=x(2)*.25;
      c=x(3)*.25;
      d=x(4)*.25;

      % Radix-4 Algorithm
      A=a+b+c+d;
      B=(a-b+c-d)*W(2*segment*stageFlag + 1);
      C=(a-b*j-c+d*j)*W(segment*stageFlag + 1);
      D=(a+b*j-c-d*j)*W(3*segment*stageFlag + 1);

      % assemble output
      Z = [A B C D];
    end % radix4bfly()


    % radix-4 DIF FFT, input signal must be floating point, real or complex
    %
    function S = r4fftN(s)

      % Initialize variables and signals: length of input signal is a power of 4
      N = length(s);
      M = log2(N)/2;

      % Initialize variables for floating point sim
      W=exp(-j*2*pi*(0:N-1)/N);
      S = complex(zeros(1,N));
      sTemp = complex(zeros(1,N));

      % FFT algorithm
      % Calculate butterflies for first M-1 stages
      sTemp = s;
      for stage = 0:M-2
        for n=1:N/4
          S((1:4)+(n-1)*4) = radix4bfly(sTemp(n:N/4:end), floor((n-1)/(4^stage)) *(4^stage), 1, W);
        end
        sTemp = S;
      end

      % Calculate butterflies for last stage
      for n=1:N/4
        S((1:4)+(n-1)*4) = radix4bfly(sTemp(n:N/4:end), floor((n-1)/(4^stage)) * (4^
    stage), 0, W);
      end
      sTemp = S;

      % Rescale the final output
      S = S*N;
    end % r4fftN(s)


    % test FFT code
    %
    xp = 2;

    % ERROR if I uncomment loop!

    %for xp=1:8
      N = 4^xp; % must be power of: 4 16 64 256 1024 4086 ....
      x = 2*pi/N * (0:N-1);
      x = cos(x);
      Y_ref = fft(x);
      Y = r4fftN(x);
      Y = digitrevorder(Y,4);
      %Y = bitrevorder(Y,4);
      abs(sum(Y_ref-Y)) % compare fft4 to built-in fft
    %end
4

2 に答える 2

0

問題は、fft4 コードが基数 4 のバタフライの少なくとも 2 段階を想定しているため、指数 xp のループ境界が 2 から開始する必要があることでした。

ごめんなさい:(

-デビッド

于 2012-08-15T12:03:01.073 に答える