Fixed point to float point conversion of 16 point ifft
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
A 16 point ifft Embedded matlab code is to be converted from floating point to fix point for cosimualtion of on FPGA. as is given below in snapshot. Input from Qam16 is -3,-1,0,1,3, real and imaginary.Which i have converted to int16 .Now in Embedded matlab all variables are specified for fixed-point operation using "mathfi" as given in code.But the resultant appearing after is unexpected as highlighted in snapshot.Resultant is only fractional part and very minimum.
Kindly help me solve this issue.
Embedded matlab code is also given below.
function [W,T] = iffxxtt(x,y)
%#eml
X = getfi(.0625,1, 16, 16);
C = getfi(.7071,1, 16, 16);
D = getfi(.9239,1, 16, 16);
E = getfi(.3827,1, 16, 16);
first=getfi([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],1, 16,16);
ifirst=getfi([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],1, 16, 16);
first1=getfi([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],1,16, 16);
ifirst1=getfi([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],1, 16, 16);
first2=getfi([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],1, 16, 16);
ifirst2=getfi([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],1, 16, 16);
first3=getfi([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],1, 16, 16);
ifirst3=getfi([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],1, 16, 16);
Ar=getfi([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],1, 16, 16);
Ai=getfi([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],1, 16,16);
Ar=x;
Ai=y;
for i=1:8
first(i)=Ar(i)+Ar(i+8);
ifirst(i)=Ai(i)+Ai(i+8);
first(i+8)=Ar(i) - Ar(i+8);
ifirst(i+8)=Ai(i) - Ai(i+8);
end
Ar1=first;
Ai1=ifirst;
for i=1:4
first1(i)=Ar1(i)+Ar1(i+4);
ifirst1(i)=Ai1(i)+Ai1(i+4);
first1(i+4)= Ar1(i)-Ar1(4+i);
ifirst1(i+4)=Ai1(i)-Ai1(4+i);
end
for i=9:12
first1(i)=(Ar1(i)-Ai1(i+4));
ifirst1(i)=(Ai1(i)+Ar1(i+4));
first1(i+4)=(Ai1(4+i) + Ar1(i));
ifirst1(i+4)=(-Ar1(4+i) + Ai1(i));
end
Ar2=first1;
Ai2=ifirst1;
for i=1:2
first2(i)=Ar2(i)+Ar2(i+2);
ifirst2(i)=Ai2(i)+Ai2(i+2);
first2(i+2)= Ar2(i)-Ar2(2+i);
ifirst2(i+2)=Ai2(i)-Ai2(2+i);
first2(i+4)=-(-Ar2(i+4)+Ai2(i+6));
ifirst2(i+4)=Ai2(i+4)+Ar2(i+6);
first2(i+6)=(Ai2(6+i) + Ar2(i+4));
ifirst2(i+6)=-Ar2(6+i) + Ai2(i+4);
end
for i=9:10
first2(i)=Ar2(i)+C*Ar2(i+2)-C*Ai2(i+2);
ifirst2(i)=(Ai2(i)+C*Ar2(i+2)+C*Ai2(i+2));
first2(i+2)=Ar2(i)-C*Ar2(i+2)+C*Ai2(i+2);
ifirst2(i+2)=(Ai2(i)-C*Ar2(i+2)-C*Ai2(i+2));
end
for i=13:14
first2(i)=Ar2(i)-C*Ar2(i+2)-C*Ai2(i+2);
ifirst2(i)=Ai2(i)+C*Ar2(i+2)-C*Ai2(i+2);
first2(i+2)=Ar2(i)+C*Ar2(i+2)+C*Ai2(i+2);
ifirst2(i+2)=Ai2(i)-C*Ar2(i+2)+C*Ai2(i+2);
end
Ar3=first2;
Ai3=ifirst2;
i=1;
first3(i)=Ar3(i)+Ar3(i+1);
ifirst3(i)=Ai3(i)+Ai3(i+1);
first3(i+1)= Ar3(i)-Ar3(1+i);
ifirst3(i+1)=Ai3(i)-Ai3(1+i);
first3(i+2)=-(-Ar3(i+2)+Ai3(i+3));
ifirst3(i+2)=Ai3(i+2)+Ar3(i+3);
first3(i+3)=(Ai3(3+i) + Ar3(i+2));
ifirst3(i+3)=-Ar3(3+i) + Ai3(i+2);
first3(i+4)=Ar3(i+4)+C*Ar3(i+5)-C*Ai3(i+5);
ifirst3(i+4)=(Ai3(i+4)+C*Ar3(i+5)+C*Ai3(i+5));
first3(i+5)=Ar3(i+4)-C*Ar3(i+5)+C*Ai3(i+5);
ifirst3(i+5)=(Ai3(i+4)-C*Ar3(i+5)-C*Ai3(i+5));
first3(i+6)=Ar3(i+6)-C*Ar3(i+7)-C*Ai3(i+7);
ifirst3(i+6)=Ai3(i+6)+C*Ar3(i+7)-C*Ai3(i+7);
first3(i+7)=(Ar3(i+6)+C*Ar3(i+7)+C*Ai3(i+7));
ifirst3(i+7)=(Ai3(i+6)-C*Ar3(i+7)+C*Ai3(i+7));
i=9;
first3(i)=Ar3(i)+D*Ar3(i+1)-E*Ai3(i+1);
ifirst3(i)=(Ai3(i)+E*Ar3(i+1)+D*Ai3(i+1));
first3(i+1)=Ar3(i)-D*Ar3(i+1)+E*Ai3(i+1);
ifirst3(i+1)=(Ai3(i)-E*Ar3(i+1)-D*Ai3(i+1));
first3(i+2)=Ar3(i+2)-E*Ar3(i+3)-D*Ai3(i+3);
ifirst3(i+2)=Ai3(i+2)+D*Ar3(i+3)-E*Ai3(i+3);
first3(i+3)=Ar3(i+2)+E*Ar3(i+3)+D*Ai3(i+3);
ifirst3(i+3)=Ai3(i+2)-D*Ar3(i+3)+E*Ai3(i+3);
first3(i+4)=Ar3(i+4)+E*Ar3(i+5)-D*Ai3(i+5);
ifirst3(i+4)=(Ai3(i+4)+D*Ar3(i+5)+E*Ai3(i+5));
first3(i+5)=Ar3(i+4)-E*Ar3(i+5)+D*Ai3(i+5);
ifirst3(i+5)=(Ai3(i+4)-D*Ar3(i+5)-E*Ai3(i+5));
first3(i+6)=Ar3(i+6)-D*Ar3(i+7)-E*Ai3(i+7);
ifirst3(i+6)=Ai3(i+6)+E*Ar3(i+7)-D*Ai3(i+7);
first3(i+7)=Ar3(i+6)+D*Ar3(i+7)+E*Ai3(i+7);
ifirst3(i+7)=Ai3(i+6)-E*Ar3(i+7)+D*Ai3(i+7);
W = [first3(1);first3(16);first3(8);first3(12);first3(4);first3(14);first3(6);first3(10);first3(2);first3(15);first3(7);first3(11);first3(3);first3(13);first3(5);first3(9);]*X;
T = [ifirst3(1);ifirst3(16);ifirst3(8);ifirst3(12);ifirst3(4);ifirst3(14);ifirst3(6);ifirst3(10);ifirst3(2);ifirst3(15);ifirst3(7);ifirst3(11);ifirst3(3);ifirst3(13);ifirst3(5);ifirst3(9);]*X;
end
function myfi = getfi(input, issigned, wlen, flen)
fm = fimath('RoundMode', 'Nearest', ...
'OverflowMode', 'Saturate', ...
'ProductMode', 'FullPrecision', ...
'MaxProductWordLength', 128, ...
'SumMode', 'FullPrecision', ...
'MaxSumWordLength', 128, ...
'CastBeforeSum', true);
myfi = fi(input, issigned, wlen, flen, 'fimath', fm);
end
0 Kommentare
Antworten (1)
Kiran Kintali
am 1 Nov. 2020
See attached example for additional modeling guidelines for MATLAB to HDL.
0 Kommentare
Siehe auch
Kategorien
Mehr zu FPGA, ASIC, and SoC Development finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!