Fixed point to float point conversion of 16 point ifft

조회 수: 2 (최근 30일)
aitizaz
aitizaz 2011년 4월 12일
답변: Kiran Kintali 2020년 11월 1일
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

답변 (1개)

Kiran Kintali
Kiran Kintali 2020년 11월 1일
See attached example for additional modeling guidelines for MATLAB to HDL.

카테고리

Help CenterFile Exchange에서 FPGA, ASIC, and SoC Development에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by