From 996ecbe55c8b3518eb836f5dab656f83561b09f6 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger <florian.kaltenberger@eurecom.fr> Date: Wed, 12 Mar 2014 17:43:42 +0000 Subject: [PATCH] updated scripts for TX signal generation for CORRIDOR git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5153 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- targets/PROJECTS/CORRIDOR/OFDM_TX.m | 19 ++++++ targets/PROJECTS/CORRIDOR/OFDM_TX_FRAME.m | 25 ++++++++ .../PROJECTS/CORRIDOR/OFDM_TX_FRAME_MIMO.m | 4 +- targets/PROJECTS/CORRIDOR/QAM_MOD.m | 25 ++++++++ targets/PROJECTS/CORRIDOR/generation_ca.m | 53 +++++++++++----- targets/PROJECTS/CORRIDOR/tx_sig_ca.m | 60 ++++++++++++++----- 6 files changed, 155 insertions(+), 31 deletions(-) create mode 100644 targets/PROJECTS/CORRIDOR/OFDM_TX.m create mode 100644 targets/PROJECTS/CORRIDOR/OFDM_TX_FRAME.m create mode 100644 targets/PROJECTS/CORRIDOR/QAM_MOD.m diff --git a/targets/PROJECTS/CORRIDOR/OFDM_TX.m b/targets/PROJECTS/CORRIDOR/OFDM_TX.m new file mode 100644 index 000000000..f477acd83 --- /dev/null +++ b/targets/PROJECTS/CORRIDOR/OFDM_TX.m @@ -0,0 +1,19 @@ +function [sig,sig_length] = OFDM_TX(num_carriers,num_zeros,prefix_length,input) + +% OFDM Transmitter - DC removed +% sig is the output signal +% length is the length of the output signal +% num_carriers - number of sub-carriers (power of 2) +% num_zeros - number of zeros minus 1 (DC) in output spectrum (odd) +% prefix_length - length of cyclic prefix +% input - input dimensions (length = number_carriers - num_zeros - 1) + +if (length(input) + num_zeros + 1 ~= num_carriers) + fprintf('error in lengths\n'); + return; + end + +ext_input = [0 input(1:length(input)/2) zeros(1,num_zeros) input((1+length(input)/2) : length(input))]; +output_1 = ifft(ext_input); +sig = [output_1((num_carriers - prefix_length + 1) : num_carriers) output_1]; +sig_length = length(sig); diff --git a/targets/PROJECTS/CORRIDOR/OFDM_TX_FRAME.m b/targets/PROJECTS/CORRIDOR/OFDM_TX_FRAME.m new file mode 100644 index 000000000..2248d84f2 --- /dev/null +++ b/targets/PROJECTS/CORRIDOR/OFDM_TX_FRAME.m @@ -0,0 +1,25 @@ +function [sig, sig_f] = OFDM_TX_FRAME(num_carriers,num_zeros,prefix_length,num_symbols_frame,preamble_length) + +% sig - output signal +% sig_length - output signal length +% num_carriers - number of sub-carriers +% num_zeros - number of zero carriers minus 1 (DC) +% prefix_length - length of cyclic prefix +% num_symbols_frame - number of symbols per OFDM frame +% preamble_length - length of 4-QAM preamble + +num_useful_carriers = num_carriers - num_zeros -1; + +sig = zeros(1,(num_carriers+prefix_length)*num_symbols_frame); +sig_f = zeros(num_symbols_frame,num_useful_carriers); +for k=1:preamble_length + QAM4_preamble = QAM_MOD(4,floor(256*abs(rand(1,num_useful_carriers/4)))); + sig((k-1)*(num_carriers+prefix_length)+1:k*(num_carriers+prefix_length)) = OFDM_TX(num_carriers,num_zeros,prefix_length,QAM4_preamble); + sig_f(k,:) = QAM4_preamble; +end + +for k=preamble_length+1:num_symbols_frame + QAM_data = QAM_MOD(256,floor(256*abs(rand(1,num_useful_carriers)))); + sig((k-1)*(num_carriers+prefix_length)+1:k*(num_carriers+prefix_length)) = OFDM_TX(num_carriers,num_zeros,prefix_length,QAM_data); + sig_f(k,:) = QAM_data; +end diff --git a/targets/PROJECTS/CORRIDOR/OFDM_TX_FRAME_MIMO.m b/targets/PROJECTS/CORRIDOR/OFDM_TX_FRAME_MIMO.m index 877aad2f0..39dfaca69 100644 --- a/targets/PROJECTS/CORRIDOR/OFDM_TX_FRAME_MIMO.m +++ b/targets/PROJECTS/CORRIDOR/OFDM_TX_FRAME_MIMO.m @@ -29,13 +29,13 @@ sig_f = zeros(num_ant,num_symbols_frame,num_useful_carriers); for a=1:num_ant for k=(floor((a-1)/2)+1):t_dec:preamble_length QAM4_preamble = zeros(1,num_useful_carriers); - QAM4_preamble((mod(a-1,2)+1):f_dec:num_useful_carriers) = QAM_MOD(4,floor(256*abs(rand(1,num_useful_carriers/4/f_dec)))); + QAM4_preamble((mod(a-1,2)+1):f_dec:num_useful_carriers) = QAM_MOD(4,floor(4*abs(rand(1,num_useful_carriers/f_dec)))); sig(a,(k-1)*(num_carriers+prefix_length)+1:k*(num_carriers+prefix_length)) = OFDM_TX(num_carriers,num_zeros,prefix_length,QAM4_preamble); sig_f(a,k,:) = QAM4_preamble; end for k=preamble_length+1:num_symbols_frame - QAM_data = QAM_MOD(256,floor(256*abs(rand(1,num_useful_carriers)))); + QAM_data = QAM_MOD(256,floor(4*abs(rand(1,num_useful_carriers)))); sig(a,(k-1)*(num_carriers+prefix_length)+1:k*(num_carriers+prefix_length)) = OFDM_TX(num_carriers,num_zeros,prefix_length,QAM_data); sig_f(a,k,:) = QAM_data; end diff --git a/targets/PROJECTS/CORRIDOR/QAM_MOD.m b/targets/PROJECTS/CORRIDOR/QAM_MOD.m new file mode 100644 index 000000000..61707a1eb --- /dev/null +++ b/targets/PROJECTS/CORRIDOR/QAM_MOD.m @@ -0,0 +1,25 @@ +function [sig,sig_length] = QAM_MOD(size,input) + +% sig - output symbols +% size - modulation size (4,16,256) +% input - vector of bytes to be modulated + +AM2 = [-1 1]; +AM4 = [-3 -1 1 3]; AM4 = 2*AM4/sqrt(AM4*AM4'); +AM16 = [-15 -13 -11 -9 -7 -5 -3 -1 1 3 5 7 9 11 13 15]; AM16 = 4*AM16/sqrt(AM16*AM16'); + +sig = zeros(1,length(input)); +sig_length = length(input); + +for l=1:length(input) + if (size == 256) + sig(l) = (AM16(1+ floor((input(l)/16))) + sqrt(-1)*AM16(1+rem(input(l),16)))/sqrt(2); + + elseif (size == 16) + sig(l) = (AM4(1+rem(floor(input(l)/4),4)) + sqrt(-1)*AM4(1+rem(input(l),4)))/sqrt(2); + + elseif (size == 4) + sig(l) = (AM2(1+rem(floor(input(l)/2),2)) + sqrt(-1)*AM2(1+rem(input(l),2)))/sqrt(2); + + end +end diff --git a/targets/PROJECTS/CORRIDOR/generation_ca.m b/targets/PROJECTS/CORRIDOR/generation_ca.m index 54b40c9b6..58c2775c8 100644 --- a/targets/PROJECTS/CORRIDOR/generation_ca.m +++ b/targets/PROJECTS/CORRIDOR/generation_ca.m @@ -1,3 +1,5 @@ +%% this script generates the signals for the CORRIDOR channel sounding campaing + %addpath('../../../openair1/SIMULATION/LTE_PHY/') %addpath('../../../openair1/PHY/LTE_ESTIMATION/') %addpath('../../../openair1/PHY/LTE_REFSIG/') @@ -7,9 +9,10 @@ rng(42); %make sure seed random numbers are alwyas the same % load the LTE sync sequence primary_synch; +nant = 4; %% this generates one LTE frame (10ms) full of OFDM modulated random QPSK symbols - +%% 20MHz carrier nb_rb = 100; %this can be 25, 50, or 100 num_carriers = 2048/100*nb_rb; num_zeros = num_carriers-(12*nb_rb+1); @@ -17,7 +20,7 @@ prefix_length = num_carriers/4; %this is extended CP num_symbols_frame = 120; preamble_length = 120; -[s1,f1] = OFDM_TX_FRAME(num_carriers,num_zeros,prefix_length,num_symbols_frame,preamble_length); +[s1,f1] = OFDM_TX_FRAME_MIMO(num_carriers,num_zeros,prefix_length,num_symbols_frame,preamble_length,nant); % scale to conserve energy (Matlabs IFFT does not scale) s1=s1*sqrt(num_carriers); @@ -26,15 +29,15 @@ s1=s1*sqrt(num_carriers); pss0_up = interp(primary_synch0_time,num_carriers/128); pss0_up_cp = [pss0_up(num_carriers-prefix_length+1:end) pss0_up]; -s1(1:num_carriers+prefix_length) = pss0_up_cp; +s1(:,1:num_carriers+prefix_length) = repmat(pss0_up_cp,nant,1); -%% and now the other carrier +%% 10MHz carrier nb_rb = 50; %this can be 25, 50, or 100 num_carriers = 2048/100*nb_rb; num_zeros = num_carriers-(12*nb_rb+1); prefix_length = num_carriers/4; %this is extended CP -[s2,f2] = OFDM_TX_FRAME(num_carriers,num_zeros,prefix_length,num_symbols_frame,preamble_length); +[s2,f2] = OFDM_TX_FRAME_MIMO(num_carriers,num_zeros,prefix_length,num_symbols_frame,preamble_length,nant); % scale to conserve energy (Matlabs IFFT does not scale) s2=s2*sqrt(num_carriers); @@ -43,23 +46,43 @@ s2=s2*sqrt(num_carriers); pss0_up = interp(primary_synch0_time,num_carriers/128); pss0_up_cp = [pss0_up(num_carriers-prefix_length+1:end) pss0_up]; -s2(1:num_carriers+prefix_length) = pss0_up_cp; +s2(:,1:num_carriers+prefix_length) = repmat(pss0_up_cp,nant,1); + +%% 5MHz carrier +nb_rb = 25; %this can be 25, 50, or 100 +num_carriers = 2048/100*nb_rb; +num_zeros = num_carriers-(12*nb_rb+1); +prefix_length = num_carriers/4; %this is extended CP + +[s3,f3] = OFDM_TX_FRAME_MIMO(num_carriers,num_zeros,prefix_length,num_symbols_frame,preamble_length,nant); +% scale to conserve energy (Matlabs IFFT does not scale) +s3=s3*sqrt(num_carriers); + +% upsample PSS to the right frequency and insert it in the first symbol of the frame + +pss0_up = interp(primary_synch0_time,num_carriers/128); +pss0_up_cp = [pss0_up(num_carriers-prefix_length+1:end) pss0_up]; + +s3(:,1:num_carriers+prefix_length) = repmat(pss0_up_cp,nant,1); -%% combine the two carriers +%% combine the 10 and 20 MHz carriers f1_shift = -5e6; f2_shift = 10e6; sample_rate = 30.72e6*2; -s1_up = interp(s1,2); -s1_shift = s1_up .* exp(2*1i*pi*f1_shift*(0:length(s1_up)-1)/sample_rate); -s2_up = interp(s2,4); -s2_shift = s2_up .* exp(2*1i*pi*f2_shift*(0:length(s2_up)-1)/sample_rate); -s = s1_shift + s2_shift/sqrt(2); +s = zeros(nant,sample_rate/100); +for a=1:nant + s1_up = interp(s1(a,:),2); + s1_shift = s1_up .* exp(2*1i*pi*f1_shift*(0:length(s1_up)-1)/sample_rate); + s2_up = interp(s2(a,:),4); + s2_shift = s2_up .* exp(2*1i*pi*f2_shift*(0:length(s2_up)-1)/sample_rate); + s(a,:) = s1_shift + s2_shift/sqrt(2); +end %% figure(1) hold off -plot(linspace(-sample_rate/2,sample_rate/2,length(s)),20*log10(abs(fftshift(fft(s))))) +plot(linspace(-sample_rate/2,sample_rate/2,length(s)),20*log10(abs(fftshift(fft(s,[],2))))) %% save for later use (channel estimation and transmission with the SMBV) -save('ofdm_pilots_sync_30MHz.mat','-v7','s','f1','f2','num_carriers','num_zeros','prefix_length','num_symbols_frame','preamble_length'); -mat2wv(s, 'ofdm_pilots_sync_30MHz.wv', sample_rate, 1); +save('ofdm_pilots_sync_30MHz.mat','-v7','s','f1','f2','f3','num_carriers','num_zeros','prefix_length','num_symbols_frame','preamble_length'); +mat2wv(s(1,:), 'ofdm_pilots_sync_30MHz.wv', sample_rate, 1); diff --git a/targets/PROJECTS/CORRIDOR/tx_sig_ca.m b/targets/PROJECTS/CORRIDOR/tx_sig_ca.m index 1e408c848..4372388d6 100644 --- a/targets/PROJECTS/CORRIDOR/tx_sig_ca.m +++ b/targets/PROJECTS/CORRIDOR/tx_sig_ca.m @@ -1,5 +1,11 @@ +% this script sends the signals previously generated with generation_ca to +% the cards. We need in total 7 cards configured as follows +% card0 - card3: 20MHz, 1 channel each, s1, freq 2590 MHz +% card4 - card5: 10MHz, 2 channels each, s2, freq 2605 MHz +% card6: 5MHz, 4 channels, s3, freq 771.5 MHz + +addpath('../../../targets/ARCH/EXMIMO/USERSPACE/OCTAVE') limeparms; -freq = 2.6e9; num_cards = oarf_get_num_detected_cards; @@ -8,16 +14,15 @@ num_cards = oarf_get_num_detected_cards; rf_rxdc = rf_rxdc*[1 1 1 1]; rf_vcocal=rf_vcocal_19G*[1 1 1 1]; -if (num_cards>0) - % card 0: 20MHz - card = 0; +for card=0:min(3,num_cards-1) + % card 0-3: 20MHz active_rf = [1 0 0 0]; autocal = [1 1 1 1]; resampling_factor = [0 0 0 0]; rf_mode = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF10+RXLPFNORM+RXLPFEN+RXLPF10+LNA1ON+LNAMax+RFBBNORM)*active_rf; rf_mode = rf_mode+((DMAMODE_RX+DMAMODE_TX)*active_rf); - freq_rx = (freq-10e6)*active_rf; + freq_rx = 2590e6*active_rf; freq_tx = freq_rx; tx_gain = 10*active_rf; %[1 1 1 1]; rx_gain = 0*active_rf; %1 1 1 1]; @@ -25,10 +30,10 @@ if (num_cards>0) eNBflag = 0; tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_TESTTX; %tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB; - if (num_cards>1) + if (card==0) syncmode = SYNCMODE_MASTER; else - syncmode = SYNCMODE_FREE; + syncmode = SYNCMODE_SLAVE; end rffe_rxg_low = 31*active_rf; %[1 1 1 1]; rffe_rxg_final = 63*active_rf; %[1 1 1 1]; @@ -36,16 +41,37 @@ if (num_cards>0) oarf_config_exmimo(card,freq_rx,freq_tx,tdd_config,syncmode,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 -if (num_cards>1) - % card 1: 10MHz - card = 1; +for card=4:min(5,num_cards-1) + % card 4-5: 10MHz active_rf = [1 1 0 0]; autocal = [1 1 1 1]; resampling_factor = [1 1 1 1]; rf_mode = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF5+RXLPFNORM+RXLPFEN+RXLPF5+LNA1ON+LNAMax+RFBBNORM)*active_rf; rf_mode = rf_mode+((DMAMODE_RX+DMAMODE_TX)*active_rf); - freq_rx = (freq+5e6)*active_rf; + freq_rx = 2605e6*active_rf; + freq_tx = freq_rx; + tx_gain = 13*active_rf; %[1 1 1 1]; + rx_gain = 0*active_rf; %1 1 1 1]; + eNBflag = 0; + tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_TESTTX; + %tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB; + syncmode = SYNCMODE_SLAVE; + rffe_rxg_low = 31*active_rf; %[1 1 1 1]; + rffe_rxg_final = 63*active_rf; %[1 1 1 1]; + rffe_band = B19G_TDD*active_rf; %[1 1 1 1]; + oarf_config_exmimo(card,freq_rx,freq_tx,tdd_config,syncmode,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 + +for card=6:min(6,num_cards-1) + % card 6: 5MHz + active_rf = [1 1 1 1]; + autocal = [1 1 1 1]; + resampling_factor = [2 2 2 2]; + + rf_mode = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF5+RXLPFNORM+RXLPFEN+RXLPF5+LNA1ON+LNAMax+RFBBNORM)*active_rf; + rf_mode = rf_mode+((DMAMODE_RX+DMAMODE_TX)*active_rf); + freq_rx = 771.5e6*active_rf; freq_tx = freq_rx; tx_gain = 13*active_rf; %[1 1 1 1]; rx_gain = 0*active_rf; %1 1 1 1]; @@ -62,9 +88,15 @@ end amp = pow2(14)-1; s1p = 2*floor(amp*(s1./max([real(s1) imag(s1)]))); s2p = 2*floor(amp*(s2./max([real(s2) imag(s2)]))); +s3p = 2*floor(amp*(s3./max([real(s3) imag(s3)]))); -if (num_cards>1) - oarf_send_frame(1,repmat(s2p,4,1).',16); +for card=min(6,num_cards-1):-1:6 + oarf_send_frame(card,s3p.',16); +end +for card=min(5,num_cards-1):-1:4 + oarf_send_frame(card,s2p.',16); +end +for card=min(3,num_cards-1):-1:0 + oarf_send_frame(card,s1p.',16); end -oarf_send_frame(0,repmat(s1p,4,1).',16); -- GitLab