Radix 2 DIT Twiddle для расчета коэффициента VHDL - PullRequest
0 голосов
/ 14 июня 2019

Итак, я пытался реализовать БПФ N-длины в VHDL, но я не могу получить правильные результаты.Я полагаю, что это из-за фактора Twiddle, но я не уверен, я некоторое время устранял это, но не могу найти решение

Я пытался изменить коэффициент Twiddle на другую формулу, описанную напара веб-сайтов ((k/2**Stage)/N), например, с одного веб-сайта для расчета коэффициента твида, но он не работает.

constant M : integer := 3;

constant N : integer := 8;

constant Nminus1 : integer := 7;

constant TwoPiN : real := 2.0*MATH_PI/real(N);

Butterfly code : 

 TempRe := xtmp(kNs).re *WCos - xtmp(kNs).re * WSin;

 TempIm := xtmp(kNs).im*WCos + xtmp(kNs).im*Wsin;

 xtmp(kNs).re := xtmp(k).re - TempRe;

 xtmp(kNs).im := xtmp(k).im - TempIm;

 xtmp(k).re := xtmp(k).re + TempRe;

 xtmp(k).im := xtmp(k).im + TempIm;


 Main:process(x_in)

 variable Ns, count ,Stage, k, kNs, p ,p_int, M1: integer;

 variable Wcos, Wsin : real;

 variable x : complexArr;


 begin

 x := x_in; --copy insignal

 Ns := N; 

 M1 := M;

 count := 0;


 for Stage in 1 to M loop

 k := 0;

 Ns := Ns/2; --index distance between a dual node pair

 M1 := M1 - 1;


  while(k< N) loop


 for n in 1 to Ns loop

 p := Digit_Reverse(k/2**(M-1));


 Wcos := cos(TwoPiN*real(p));--W to the power of p


 Wsin := - sin(TwoPiN*real(p)); --W = exp(\u2212 j2\u03c0/N)


 kNs := k + Ns;

 Butterfly(x,k,kNs,Wcos,Wsin);

 k := k + 1;

 count := count +1;

 end loop;

 k := k + Ns;

 end loop;

 end loop;

 Unscramble(x); --output

 x_ut <= x;

Нет ошибок, но я ожидаю правильных значений для БПФ длиной 2048, но в настоящий момент яустраняю неполадки 16-точечного БПФ и 8-точечного БПФ с [-1; i] - [1; i] и т. д.

...