Fixed point to float point conversion of 16 point ifft

1 Ansicht (letzte 30 Tage)
aitizaz
aitizaz am 12 Apr. 2011
Beantwortet: Kiran Kintali am 1 Nov. 2020
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

Antworten (1)

Kiran Kintali
Kiran Kintali am 1 Nov. 2020
See attached example for additional modeling guidelines for MATLAB to HDL.

Kategorien

Mehr zu FPGA, ASIC, and SoC Development finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by