diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_calibration_exmimo_freq.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_calibration_exmimo_freq.m new file mode 100755 index 0000000000000000000000000000000000000000..3de37c09341fab97622a6320c27f42c130425808 --- /dev/null +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_calibration_exmimo_freq.m @@ -0,0 +1,276 @@ +close all +clear all +hold off + +%gpib_card=0; % first GPIB PCI card in the computer +%gpib_device=28; % this is configured in the signal generator Utilities->System->GPIB->Address menu +smbv_ip_addr = "192.168.12.201"; +command = [getenv("OPENAIR_TARGETS") "/TEST/ROHDE_SCHWARZ/EthernetRawCommand.out"]; + +fc = 1907600e3; +%fc = 2.6e9; +%fc=700e6; + +fs = 7680e3; +fref = fc+fs/4; + +power_dBm = [-70 -80 -90]; %needs to be adjusted based on carrier freq +cables_loss_dB = 11; % we need to account for the power loss between the signal generator and the card input (splitter, cables) +nb_meas = 10; + +dual_tx = 0; +tdd = 1; +card = 0; +limeparms; +%rf_mode = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAMax+RFBBNORM+DMAMODE_RX+DMAMODE_TX)*[1 1 1 1]; +rf_mode = (RXEN+0+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAMax+RFBBNORM+DMAMODE_RX+0)*[1 1 1 1]; +freq_rx = fc*[1 1 1 1]; +freq_tx = freq_rx; +tx_gain = 25*[1 1 1 1]; +rx_gain = 15*[1 1 1 1]; +%rf_local= [8254744 8255063 8257340 8257340]; %rf_local*[1 1 1 1]; +rf_local = [8254813 8255016 8254813 8254813]; %exmimo2_2 +%rf_rxdc = rf_rxdc*[1 1 1 1]; +%rf_rxdc = ((128+rxdc_I) + (128+rxdc_Q)*(2^8))*[1 1 1 1]; +rf_rxdc = [37059 35459 36300 36999]; %exmimo2_2 +rf_vcocal=rf_vcocal_19G*[1 1 1 1]; +eNBflag = 0; +tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_TESTRX; +syncmode = SYNCMODE_FREE; +%syncmode = [SYNCMODE_MASTER SYNCMODE_SLAVE]; +rffe_rxg_low = 63*[1 1 1 1]; +rffe_rxg_final = 63*[1 1 1 1]; +rffe_band = B19G_TDD*[1 1 1 1]; +autocal = [1 1 1 1]; +resampling_factor = [2 2 2 2]; + + +system(sprintf('%s %s ''*RST;*CLS''',command, smbv_ip_addr)); % reset and configure the signal generator +%gpib_send(gpib_card,gpib_device,sprintf("POW %ddBm",power_dBm+cables_loss_dB)); +%gpib_send(gpib_card,gpib_device,'POW -14dBm'); +%gpib_send(gpib_card,gpib_device,'FREQ 1.91860GHz'); +%gpib_send(gpib_card,gpib_device,'FREQ 1.919225GHz'); +%gpib_send(gpib_card,gpib_device,'FREQ 1.909225GHz'); +system(sprintf('%s %s ''FREQ %ldHz''',command,smbv_ip_addr,fref)); + +%for card=1:oarf_get_num_detected_cards +%oarf_config_exmimo(card-1,freq_rx,freq_tx,tdd_config,syncmode(card),rx_gain,tx_gain,eNBflag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal,resampling_factor); +%end + +autocal = [0 0 0 0]; + +ALL_rxrfmode = [LNAByp LNAMed LNAMax]; +%ALL_rxrfmode = [LNAMax]; +ALL_gain = 0:10:30; + +num_chains = 4*oarf_get_num_detected_cards; + +SpN0 = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +%SpN1 = zeros(length(ALL_rxrfmode),length(ALL_gain)); +N0 = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +%N1 = zeros(length(ALL_rxrfmode),length(ALL_gain)); +S0 = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +S0_lin = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +%S1 = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +G0 = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +G1 = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +NF0 = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +NF1 = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +NF2 = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +SNR0 = zeros(length(ALL_rxrfmode),length(ALL_gain),num_chains); +%SNR1 = zeros(length(ALL_rxrfmode),length(ALL_gain)); + +%keyboard + +for mode_idx = 3 + LNA=ALL_rxrfmode(mode_idx); + + system(sprintf('%s %s ''POW %d dBm''',command,smbv_ip_addr,power_dBm(mode_idx)+cables_loss_dB)); + + idx_gain = 1; + for rx_gain=ALL_gain + + rf_mode = (RXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNA+RFBBNORM+DMAMODE_RX)*[1 1 1 1]; + rx_gain = rx_gain * [1 1 1 1]; + + for card=1:oarf_get_num_detected_cards + oarf_config_exmimo(card-1,freq_rx,freq_tx,tdd_config,syncmode(card),rx_gain,tx_gain,eNBflag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal,resampling_factor); + end + sleep(1); + + % signal measurement + system(sprintf('%s %s ''OUTP:STAT ON''',command,smbv_ip_addr)); % activate output + sleep(.5); + %f1 = (7.68*(0:length(s(:,2))-1)/(length(s(:,2))))-3.84; + f1 = (7.68*(0:307200-1)/307200)-3.84; + %nidx = find(f1>=0.5 & f1<=1.5); %1MHz + nidx = find(f1>=1.5 & f1<=2.5); %1MHz + sidx = find(f1>=1.87 & f1<=1.97); %100kHz + + SpN0_temp = 0; + spn0_temp = 0; + for k=1:nb_meas + s=oarf_get_frame(0); + sleep(.5); + s = s - repmat(mean(s,1),size(s,1),1); + + SpN0_temp = SpN0_temp + mean(abs(s).^2,1) - abs(mean(s,1)).^2; + sf = fftshift(fft(s),1)/sqrt(length(s)); + %np = 10*log10(sum(abs(sf(nidx,:)).^2)); + %sp_temp = sp_temp + 10*log10(sum(abs(sf(sidx,:)).^2)); + spn0_temp = spn0_temp + sum(abs(sf).^2); + end + %SpN0(mode_idx,idx_gain,:) = mean(abs(s).^2,1) - abs(mean(s,1)).^2; + %SpN1(mode_idx,idx_gain) = mean(abs(s(:,2)).^2) - abs(mean(s(:,2))).^2; + SpN0(mode_idx,idx_gain,:) = SpN0_temp/nb_meas; + spn0 = spn0_temp/nb_meas; + + %keyboard; + + sf = fftshift(fft(s),1)/sqrt(length(s)); + figure(1); + hold off + plot(f1,20*log10(abs((sf(:,3)))),'r'); + hold on + plot(f1(nidx),20*log10(abs(sf(nidx,3))),'b'); + plot(f1(sidx),20*log10(abs(sf(sidx,3))),'g'); + + title("Signal"); + ylim([0 200]); + + % noise measurement + system(sprintf('%s %s ''OUTP:STAT OFF''',command,smbv_ip_addr)); % deactivate output + sleep(.5); + + N0_temp = 0; + np_temp = 0; + np_temp_unit = 0; + for k=1:nb_meas + s=oarf_get_frame(0); %oarf_get_frame + sleep(.5); + s = s - repmat(mean(s,1),size(s,1),1); + + N0_temp = N0_temp + mean(abs(s).^2,1) - abs(mean(s,1)).^2; + %N1(idx_power,idx_gain) = mean(abs(s(:,2)).^2) - abs(mean(s(:,2))).^2; + sf = fftshift(fft(s),1)/sqrt(length(s)); + np_temp = np_temp + sum(abs(sf).^2); + np_temp_unit = np_temp_unit + sum(abs(sf(nidx,:)).^2); + end + N0(mode_idx,idx_gain,:) = N0_temp/nb_meas; + %N0(mode_idx,idx_gain,:) = mean(abs(s).^2,1) - abs(mean(s,1)).^2; + %N1(mode_idx,idx_gain) = mean(abs(s(:,2)).^2) - abs(mean(s(:,2))).^2; + %G1(mode_idx,idx_gain,:) = sp - power_dBm(mode_idx); + np = np_temp/nb_meas; + snr = 10*log10((spn0-np)./np); %measured snr + snr_real = power_dBm(mode_idx) - (-174 + 10*log10(7.68e6)); %signal over thermal noise + + np_unit = np_temp_unit/nb_meas; + snr_output_unit = 10*log10((spn0-np_unit)./np_unit); %measured snr + snr_input_unit = power_dBm(mode_idx) - (-174 + 10*log10(1e6)); %signal over thermal noise + + NF1(mode_idx,idx_gain,:) = snr_real - snr; + NF2(mode_idx,idx_gain,:) = snr_input_unit - snr_output_unit; + + sf = fftshift(fft(s),1)/sqrt(length(s)); + figure(2); + hold off + plot(f1,20*log10(abs((sf(:,3)))),'r'); + title("Noise"); + ylim([0 200]); + + % do some plausibility checks + % if ((N0(mode_idx,idx_gain) > SpN0(mode_idx,idx_gain)) || + % (N1(mode_idx,idx_gain) > SpN1(mode_idx,idx_gain))) + % error("something is wrong"); + % end + + S0_lin(mode_idx,idx_gain,:) = SpN0(mode_idx,idx_gain,:)-N0(mode_idx,idx_gain,:); + S0_lin(mode_idx,idx_gain,S0_lin(mode_idx,idx_gain,:)<0) = 0; + S0(mode_idx,idx_gain,:) = 10*log10(S0_lin(mode_idx,idx_gain,:)); + %S1(mode_idx,idx_gain) = 10*log10(SpN1(mode_idx,idx_gain)-N1(mode_idx,idx_gain)); + G0(mode_idx,idx_gain,:) = S0(mode_idx,idx_gain,:) - power_dBm(mode_idx); + %G1(mode_idx,idx_gain) = S1(mode_idx,idx_gain) - power_dBm; + NF0(mode_idx,idx_gain,:) = 10*log10(N0(mode_idx,idx_gain,:)) - G0(mode_idx,idx_gain,:) + 105; % 108 is the thermal noise + %NF1(mode_idx,idx_gain) = 10*log10(N1(mode_idx,idx_gain)) - G1(mode_idx,idx_gain) + 105; + SNR0(mode_idx,idx_gain,:) = S0(mode_idx,idx_gain,:)-10*log10(N0(mode_idx,idx_gain,:)); + %SNR1(mode_idx,idx_gain) = S1(mode_idx,idx_gain)-10*log10(N1(mode_idx,idx_gain)); + + %printf(' %d: Signal strength (%f,%f), Gain (%f %f), N (%f %f) SNR (%f %f) NF (%f %f)\n', + % rx_gain(1), S0(mode_idx,idx_gain),S1(mode_idx,idx_gain), + % G0(mode_idx,idx_gain),G1(mode_idx,idx_gain), + % 10*log10(N0(mode_idx,idx_gain)),10*log10(N1(mode_idx,idx_gain)), + % SNR0(mode_idx,idx_gain),SNR1(mode_idx,idx_gain), + % NF0(mode_idx,idx_gain),NF1(mode_idx,idx_gain)); + %fflush(stdout); + %fprintf(fid,'%d, %d, %d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n', + %power_dBm,gain2391,gain9862, S0,S1,G0,G1,10*log10(N0),10*log10(N1),SNR0,SNR1,NF0,NF1); + %keyboard + + figure(3) + hold off + plot(ALL_gain,G0(:,:,1),'o-','markersize',10) + hold on + plot(ALL_gain,G0(:,:,2),'x-','markersize',10) + plot(ALL_gain,G0(:,:,3),'s-','markersize',10) + plot(ALL_gain,G0(:,:,4),'d-','markersize',10) + %legend('Byp RX0','Med RX0','Max RX0','Byp RX1','Med RX1','Max RX1'); + legend('Byp RX0','Med RX0','Max RX0','Byp RX1','Med RX1','Max RX1','Byp RX2','Med RX2','Max RX2','Byp RX3','Med RX3','Max RX3'); + title('Gains') + xlabel('rx gains (dB)') + ylabel('NF (dB)') + + figure(4) + hold off + plot(ALL_gain,NF0(:,:,1),'o-','markersize',10) + hold on + plot(ALL_gain,NF0(:,:,2),'x-','markersize',10) + plot(ALL_gain,NF0(:,:,3),'s-','markersize',10) + plot(ALL_gain,NF0(:,:,4),'d-','markersize',10) + %legend('Byp RX0','Med RX0','Max RX0','Byp RX1','Med RX1','Max RX1'); + legend('Byp RX0','Med RX0','Max RX0','Byp RX1','Med RX1','Max RX1','Byp RX2','Med RX2','Max RX2','Byp RX3','Med RX3','Max RX3'); + title('Averaged Noise Figure measured in time domain') + xlabel('rx gains (dB)') + ylabel('NF (dB)') + + figure(5) + hold off + plot(ALL_gain,NF1(:,:,1),'o-','markersize',10) + hold on + plot(ALL_gain,NF1(:,:,2),'x-','markersize',10) + plot(ALL_gain,NF1(:,:,3),'s-','markersize',10) + plot(ALL_gain,NF1(:,:,4),'d-','markersize',10) + %legend('Byp RX0','Med RX0','Max RX0','Byp RX1','Med RX1','Max RX1'); + legend('Byp RX0','Med RX0','Max RX0','Byp RX1','Med RX1','Max RX1','Byp RX2','Med RX2','Max RX2','Byp RX3','Med RX3','Max RX3'); + title('Averaged Noise Figure measured in frequency domain') + xlabel('rx gains (dB)') + ylabel('NF (dB)') + + + figure(6) + hold off + plot(ALL_gain,NF2(:,:,1),'o-','markersize',10) + hold on + plot(ALL_gain,NF2(:,:,2),'x-','markersize',10) + plot(ALL_gain,NF2(:,:,3),'s-','markersize',10) + plot(ALL_gain,NF2(:,:,4),'d-','markersize',10) + %legend('Byp RX0','Med RX0','Max RX0','Byp RX1','Med RX1','Max RX1'); + legend('Byp RX0','Med RX0','Max RX0','Byp RX1','Med RX1','Max RX1','Byp RX2','Med RX2','Max RX2','Byp RX3','Med RX3','Max RX3'); + title('Unit Bandwidth Noise Figure measured in frequency domain') + xlabel('rx gains (dB)') + ylabel('NF (dB)') + + idx_gain = idx_gain + 1; + + end + + end + +%gpib_send(gpib_card,gpib_device,'OUTP:STAT OFF'); % deactivate output + +%l0 = [ALL_gain2391; ones(size(ALL_gain2391))].'\G0; +%l1 = [ALL_gain2391; ones(size(ALL_gain2391))].'\G1; + + + + +