git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4306 818b1a75-f10b-46b9-bf7c-635c3b92a50f
219 lines
6.6 KiB
Matlab
219 lines
6.6 KiB
Matlab
clear;
|
|
card=0;
|
|
|
|
limeparms;
|
|
TX_LO_LEAKAGE_MIN0 = 99999;
|
|
TX_LO_LEAKAGE_MIN1 = 99999;
|
|
%freq_rx = 1907588000*[1 1 1 1];
|
|
freq_rx = 859500000*[1 1 1 1];
|
|
freq_tx = freq_rx; %+1920000;
|
|
rf_vcocal = rf_vcocal_859*[1 1 1 1];
|
|
rf_rxdc = rf_rxdc*[1 1 1 1];
|
|
rxgain = 30*[1 1 1 1];
|
|
txgain = 25*[1 1 1 1];
|
|
tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
|
|
syncmode = SYNCMODE_FREE;
|
|
rffe_rxg_low = 31*[1 1 1 1];
|
|
rffe_rxg_final = 31*[1 1 1 1];
|
|
rffe_band = TVWS_TDD*[1 1 1 1];
|
|
|
|
sleepafterconfig=0.2
|
|
|
|
% coarse calibration loop for both rx chains
|
|
for txdc_I=0:4:63
|
|
for txdc_Q=0:4:63
|
|
rf_mode = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAByp+RFBBLNA1)*[1 1 0 0];
|
|
rf_mode = rf_mode + (DMAMODE_RX+DMAMODE_TX)*[1 1 0 0];
|
|
rf_local = (txdc_I + (txdc_Q)*(2^6) + 31*(2^12) + 31*(2^18))*[1 1 1 1];
|
|
|
|
oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rxgain,txgain,0,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band);
|
|
sleep(sleepafterconfig)
|
|
|
|
s=oarf_get_frame(card);
|
|
sF0 = 20*log10(abs(fftshift(fft(s(:,1)))));
|
|
sF1 = 20*log10(abs(fftshift(fft(s(:,2)))));
|
|
|
|
f = (7.68*(0:length(s(:,1))-1)/(length(s(:,1))))-3.84;
|
|
spec0 = sF0;
|
|
spec1 = sF1;
|
|
|
|
RX_LO_LEAKAGE0 = sF0(1+(length(sF0)/2));
|
|
TX_LO_LEAKAGE0 = sF0(1+(.75*length(sF0)));
|
|
TX_SIG0 = sF0(1+((11/16)*length(sF0)));
|
|
TX_IQ0 = sF0(1+((13/16)*length(sF0))) - TX_SIG0;
|
|
RX_IQ0 = sF0(1+((5/16)*length(sF0))) - TX_SIG0;
|
|
RX_LO_LEAKAGE1 = sF1(1+(length(sF0)/2));
|
|
TX_LO_LEAKAGE1 = sF1(1+(.75*length(sF0)));
|
|
TX_SIG1 = sF1(1+((11/16)*length(sF0)));
|
|
TX_IQ1 = sF1(1+((13/16)*length(sF0))) - TX_SIG1;
|
|
RX_IQ1 = sF1(1+((5/16)*length(sF0))) - TX_SIG1;
|
|
% subplot(211)
|
|
% plot(f',spec0,'r')
|
|
% axis([-3.84,3.84,40,160])
|
|
% subplot(212)
|
|
% plot(f',spec1,'b')
|
|
% axis([-3.84,3.84,40,160])
|
|
% grid
|
|
% drawnow
|
|
if (TX_LO_LEAKAGE0 < TX_LO_LEAKAGE_MIN0)
|
|
TX_LO_LEAKAGE_MIN0=TX_LO_LEAKAGE0;
|
|
txdc_I_min0 = txdc_I;
|
|
txdc_Q_min0 = txdc_Q;
|
|
TX_LO_LEAKAGE0
|
|
txdc_I_min0
|
|
txdc_Q_min0
|
|
fflush(stdout);
|
|
end
|
|
if (TX_LO_LEAKAGE1 < TX_LO_LEAKAGE_MIN1)
|
|
TX_LO_LEAKAGE_MIN1=TX_LO_LEAKAGE1;
|
|
txdc_I_min1 = txdc_I;
|
|
txdc_Q_min1 = txdc_Q;
|
|
TX_LO_LEAKAGE1
|
|
txdc_I_min1
|
|
txdc_Q_min1
|
|
fflush(stdout);
|
|
end
|
|
end
|
|
end
|
|
|
|
% fine calibration loop for RX1 (RX2 stays constant)
|
|
txdc_I_min02 = txdc_I_min0;
|
|
txdc_Q_min02 = txdc_Q_min0;
|
|
for deltaI = -3:3,
|
|
for deltaQ = -3:3,
|
|
txdc_I = txdc_I_min0 + deltaI;
|
|
txdc_Q = txdc_Q_min0 + deltaQ;
|
|
|
|
if (txdc_I>=0) && (txdc_Q>=0) && (txdc_I < 64) && (txdc_Q < 64)
|
|
% printf("txdc_IQ => (%d,%d)\n",txdc_I,txdc_Q);
|
|
% fflush(stdout);
|
|
|
|
|
|
rf_local(1) = txdc_I + (txdc_Q)*(2^6) + 31*(2^12) + 31*(2^18);
|
|
rf_local(2) = txdc_I_min1 + (txdc_Q_min1)*(2^6) + 31*(2^12) + 31*(2^18);
|
|
|
|
oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rxgain,txgain,0,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band);
|
|
sleep(sleepafterconfig)
|
|
|
|
s=oarf_get_frame(card);
|
|
sF0 = 20*log10(abs(fftshift(fft(s(:,1)))));
|
|
spec0 = sF0;
|
|
spec1 = sF1;
|
|
|
|
RX_LO_LEAKAGE = sF0(1+(length(sF0)/2));
|
|
TX_LO_LEAKAGE = sF0(1+(.75*length(sF0)));
|
|
TX_SIG = sF0(1+((11/16)*length(sF0)));
|
|
TX_IQ = sF0(1+((13/16)*length(sF0))) - TX_SIG;
|
|
RX_IQ = sF0(1+((5/16)*length(sF0))) - TX_SIG;
|
|
% subplot(211)
|
|
% plot(f',spec0,'r')
|
|
% axis([-3.84,3.84,40,160])
|
|
% grid
|
|
% drawnow
|
|
if (TX_LO_LEAKAGE < TX_LO_LEAKAGE_MIN0)
|
|
TX_LO_LEAKAGE_MIN0=TX_LO_LEAKAGE;
|
|
txdc_I_min02 = txdc_I;
|
|
txdc_Q_min02 = txdc_Q;
|
|
TX_LO_LEAKAGE
|
|
txdc_I_min02
|
|
txdc_Q_min02
|
|
fflush(stdout);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
% fine calibration loop for RX2 (RX1 stays constant)
|
|
txdc_I_min12 = txdc_I_min1;
|
|
txdc_Q_min12 = txdc_Q_min1;
|
|
for deltaI = -3:3,
|
|
for deltaQ = -3:3,
|
|
txdc_I = txdc_I_min1 + deltaI;
|
|
txdc_Q = txdc_Q_min1 + deltaQ;
|
|
|
|
if (txdc_I>=0) && (txdc_Q>=0) && (txdc_I < 64) && (txdc_Q < 64)
|
|
% printf("txdc_IQ => (%d,%d)\n",txdc_I,txdc_Q);
|
|
% fflush(stdout);
|
|
|
|
% rf_local = txdc_I_min02 + (txdc_Q_min02)*(2^6) + (txdc_I)*(2^12) + (txdc_Q)*(2^18);
|
|
rf_local(1) = txdc_I_min02 + (txdc_Q_min02)*(2^6) + 31*(2^12) + 31*(2^18);
|
|
rf_local(2) = txdc_I + (txdc_Q)*(2^6) + 31*(2^12) + 31*(2^18);
|
|
|
|
oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rxgain,txgain,0,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band);
|
|
sleep(sleepafterconfig)
|
|
|
|
s=oarf_get_frame(card);
|
|
sF1 = 20*log10(abs(fftshift(fft(s(:,2)))));
|
|
spec1 = sF1;
|
|
|
|
RX_LO_LEAKAGE = sF1(1+(length(sF0)/2));
|
|
TX_LO_LEAKAGE = sF1(1+(.75*length(sF0)));
|
|
TX_SIG = sF1(1+((11/16)*length(sF0)));
|
|
TX_IQ = sF1(1+((13/16)*length(sF0))) - TX_SIG;
|
|
RX_IQ = sF1(1+((5/16)*length(sF0))) - TX_SIG;
|
|
% subplot(212)
|
|
% plot(f',spec1,'b')
|
|
% axis([-3.84,3.84,40,160])
|
|
% grid
|
|
% drawnow
|
|
|
|
if (TX_LO_LEAKAGE < TX_LO_LEAKAGE_MIN1)
|
|
TX_LO_LEAKAGE_MIN1=TX_LO_LEAKAGE;
|
|
txdc_I_min12 = txdc_I;
|
|
txdc_Q_min12 = txdc_Q;
|
|
TX_LO_LEAKAGE
|
|
txdc_I_min12
|
|
txdc_Q_min12
|
|
fflush(stdout);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
TX_LO_LEAKAGE_MIN0
|
|
txdc_I_min02
|
|
txdc_Q_min02
|
|
TX_LO_LEAKAGE_MIN1
|
|
txdc_I_min12
|
|
txdc_Q_min12
|
|
|
|
rf_local(1) = txdc_I_min02 + (txdc_Q_min02)*(2^6) + 31*(2^12) + 31*(2^18);
|
|
rf_local(2) = txdc_I_min12 + (txdc_Q_min12)*(2^6) + 31*(2^12) + 31*(2^18);
|
|
|
|
|
|
oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rxgain,txgain,0,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band);
|
|
sleep(sleepafterconfig)
|
|
|
|
s=oarf_get_frame(card);
|
|
sF0 = 20*log10(abs(fftshift(fft(s(:,1)))));
|
|
sF1 = 20*log10(abs(fftshift(fft(s(:,2)))));
|
|
spec0 = sF0;
|
|
spec1 = sF1;
|
|
|
|
RX_LO_LEAKAGE = sF0(1+(length(sF0)/2))
|
|
TX_LO_LEAKAGE = sF0(1+(.75*length(sF0)))
|
|
TX_SIG = sF0(1+((11/16)*length(sF0)))
|
|
TX_IQ = sF0(1+((13/16)*length(sF0))) - TX_SIG
|
|
RX_IQ = sF0(1+((5/16)*length(sF0))) - TX_SIG
|
|
|
|
RX_LO_LEAKAGE = sF1(1+(length(sF0)/2))
|
|
TX_LO_LEAKAGE = sF1(1+(.75*length(sF0)))
|
|
TX_SIG = sF1(1+((11/16)*length(sF0)))
|
|
TX_IQ = sF1(1+((13/16)*length(sF0))) - TX_SIG
|
|
RX_IQ = sF1(1+((5/16)*length(sF0))) - TX_SIG
|
|
|
|
subplot(211)
|
|
plot(f',spec0,'r')
|
|
subplot(212)
|
|
plot(f',spec1,'b')
|
|
axis([-3.84,3.84,40,160])
|
|
grid
|
|
drawnow
|
|
|
|
%gpib_send(gpib_card,gpib_device,'OUTP:STAT OFF'); % activate output
|
|
%legend('Antenna Port 0','Antenna Port 1');
|
|
grid
|
|
|
|
rf_local
|
|
|