Итак, я пытался реализовать БПФ 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] и т. д.