readout_rm/nco_dpi/nco.m

83 lines
3.3 KiB
Matlab

function result=nco(fcw,ptw,clr,acc)
acc_o = (clr==0)*mod((acc+fcw),2^48);
% res = coef();
% pha = round(acc_o/2^29) + ptw*2^3;
% qua = floor(mod(pha/2^16,8));
% seg = floor(mod((pha/2^11),32));
% segp = seg + 1;
% segn = 32 - seg;
% pha = mod(pha,2^11);
%
%c2_list_hex=["3ffff","3ffb1","3fec4","3fd3a","3fb12","3f84d","3f4eb","3f0ed","3ec53","3e71e","3e150","3dae8","3d3e8","3cc51","3c424","3bb62","3b20d","3a827","39daf","392a9",...
% "38716","37af8","36e50","36121","3536d","34535","3367c","32744","31790","30762","2f6bc","2e5a1"];
c0_list=[262143,262065, 261828, 261434, 260882, 260173, 259307, 258285, 257107, 255774, 254288, 252648, 250856, 248913,...
246820, 244578, 242189, 239655, 236975, 234153, 231190, 228088, 224848, 221473, 217965, 214325, 210556, 206660, 202640, 198498, 194236, 189857];
c1_list=[0, 79, 158, 237, 315, 394, 472, 550, 628, 705, 782, 858, 934,1009,1084,1158,1231,1304,1376,1446,1517,1586,...
1654,1721,1787,1852,1916,1979,2041,2101,2161,2218];
c2_list=[39,39,39,39,39,39,39,39,39,38,38,38,38,37,37,37,36,36,35,35,35,34,34,33,33,32,31,31,30,30,29,28];
s0_list=[0,6433,12863,19284,25695,32089,38464,44817,51142,57436,63696,69917,76096,82230,88314,94344,100318,106232,112081,117863,123574,129210,134769,...
140246,145639,150945,156159,161279,166302,171225,176045,180759];
s1_list=[3217,3216,3213,3208,3202,3193,3182,3170,3155,3139,3121,3101,3079,3055,3029,3002,2972,2941,2908,2874,2837,2799,2759,2718,2675,2630,2584,2536,2487,2436,2384,2330];
s2_list=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16,17,18,19,20,21,22,22,23,24,25,25,26,27,28];
res_cos = [c2_list',c1_list',c0_list'];
res_sin = [s2_list',s1_list',s0_list'];
pha = round((clr==0)*acc/2^29) + ptw*2^3;
qua = floor(mod(pha/2^16,8));
longp = mod(pha,2^16);
longn = 2^16-1 - longp;
segp = floor(mod((longp/2^11),32)) + 1;
segn = floor(mod((longn/2^11),32)) + 1;
pha_p = mod(longp,2^11);
pha_n = mod(longn,2^11);
cp = round( ( res_cos(segp,3) - round( ((round(res_cos(segp,1)*pha_p/2^11) + res_cos(segp,2)) *pha_p/2^10) ))/2^3);
cn = round( ( res_cos(segn,3) - round( ((round(res_cos(segn,1)*pha_n/2^11) + res_cos(segn,2)) *pha_n/2^10) ))/2^3);
sp = round( ( res_sin(segp,3) + round( ((res_sin(segp,2) - round(res_sin(segp,1)*pha_p/2^11)) *pha_p/2^10) ))/2^3);
sn = round( ( res_sin(segn,3) + round( ((res_sin(segn,2) - round(res_sin(segn,1)*pha_n/2^11)) *pha_n/2^10) ))/2^3);
switch qua
case 0
my_c = cp;
my_s = sp;
case 1
my_c = sn;
my_s = cn;
case 2
my_c = -sp;
my_s = cp;
case 3
my_c = -cn;
my_s = sn;
case 4
my_c = -cp;
my_s = -sp;
case 5
my_c = -sn;
my_s = -cn;
case 6
my_c = sp;
my_s = -cp;
case 7
my_c = cn;
my_s = -sn;
otherwise
my_c = 0;
my_s = 0;
end
result.cos = my_c;
result.sin = my_s;
result.acc = acc_o;
%result.pha = round(acc/2^29 + ptw*2^3);
end