Page 300 - DSP Integrated Circuits
P. 300

7.3 FFT Processor, Cont.                                             285

           procedure Butterfly(variable xtmp : inout complexArr;
                           variable k,kNs : integer; variable Wcos,Wsin : real);
           end FFT_pck;

           —package body for function bodies to FFT-proc.
           package body FFT_pck is
           function Digit_Reverse(digit: integer) return integer is
             variable NewAddr, Rmbit, OldAddr : integer;
             begin
               NewAddr := 0;
               OldAddr := Digit;
             for i in 1 to M loop
               Rmbit := OldAddr mod(2); -requires both operands to be integer
               OldAddr := OldAddr/2; —integer division
               if (Rmbit = 1) then
                  NewAddr := NewAddr + NewAddr + 1;
               else
                  NewAddr := NewAddr + NewAddr;
               end if;
             end loop;
             return NewAddr;
           end Digit_Reverse;


           procedure Butterfly(variable xtmp : inout complexArr;
                           variable k, kNs : integer;
                           variable Wcos, Wsin : real) is
             variable TempRe, Templm : real;
             begin
                  TempRe := xtmp(k).re - xtmp(kNs).re;
                  Templm := xtmp(k).im - xtmp(kNs).im;
                  xtmp(k).re := xtmp(k).re + xtmp(kNs).re;
                  xtmp(k).im := xtmp(k).im + xtmp(kNs).im;
                  xtmp(kNs).re := TempRe * Wcos - Templm * Wsin;
                  xtmp(kNs).im := Templm * Wcos + TempRe * Wsin;
             end Butterfly;

          procedure Unscramble(variable xx : inout complexArr) is
             subtype int_type is integer range 0 to Nminusl;
             variable temp : complex;
             variable it: int_type;
             begin
               for k in 0 to Nminusl loop
                  it := Digit_Reverse(k);
                  if it > k then
                    temp := xx(k);
                    xx(k) := xx(it);
                    xx(it) := temp;
                  end if;
               end loop;
             end Unscramble;

           end FFT_pck;
   295   296   297   298   299   300   301   302   303   304   305