Agora  1.2.0
Agora project
generate_data_dl.m File Reference

Functions

 pilot_f (pilot_f==0)
 
 pilot_f (setdiff(1:N_SC, SC_IND_DATA))=0
 
 fwrite (fileID, pilot_f, 'float')
 
 fclose (fileID)
 
 fwrite (fileID, pilot_t, 'float')
 
 fwrite (fileID_data, tx_data_for_saving(:), 'uint8')
 
 fclose (fileID_data)
 
mod_fcn_16qam, tx_data arrayfun ()
 
otherwise fprintf ('Invalid MOD_ORDER(%d)! Must be in[2, 4, 16]\n', MOD_ORDER)
 
end IFFT Reshape the symbol vector into two different spatial streams length (tx_syms)/NUM_UE
 
 tx_syms_mat (SC_IND_DATA,:,:)
 
 ifft_in_mat_A (SC_IND_PILOTS, :)
 
Add CP Insert the cyclic prefix if (CP_LEN > 0) tx_cp
 
sqrt ()
 
 H_vec_float (1:2:end)
 
 H_vec_float (2:2:end)
 
 fwrite (fileID, H_vec_float, 'float')
 
N_SC, NUM_UE, NUM_UE zeros ()
 
 CSI_est (:, i,:)
 
end fprintf ("CSI_estimation error: %d/%d\n", sum(sum(sum(abs(CSI_est(SC_IND_DATA,:,:) -H_noisy(SC_IND_DATA,:,:))>0.5 *1e-1))), length(H_noisy(:)))
 
 rx_vec_float (1:2:end)
 
 rx_vec_float (2:2:end)
 
 fwrite (fileID, rx_vec_float, 'float')
 
 rx_syms_mat (i,:,:)
 
 switch (MOD_ORDER) case 2 % BPSK rx_data
 
 fprintf ("Uplink: correct data demodulation: %d/%d\n", sum(sum(sum(rx_data==tx_data_mat))), length(tx_data_mat(:)))
 
show data of symbol and all users from subcarrier to disp (squeeze(rx_data(1:6, 1,:)))
 
Reshape to a vector numel (tx_payload_mat))
 
pilot_t.', 1, NUM_UE tx_payload_vec ()
 
Downlink data analysis fprintf ("Downlink.....\n")
 
end fprintf ("CSI_estimation error: %d/%d\n", sum(sum(sum(abs(CSI_est(SC_IND_DATA,:,:) -H_from_file_float(SC_IND_DATA,:,:))>0.5 *1e-1))), length(H_from_file_float(:)))
 
 precoder_from_file (i,:,:)
 
 dl_rx_data_f (OFDM_START_OFFSET+i,:,:)
 
 dl_rx_data_f (424+i,:,:)
 
 dl_rx_data_saving_float (1:2:end)
 
 dl_rx_data_saving_float (2:2:end)
 
 fwrite (fileID, dl_rx_data_saving_float, 'float')
 
 fprintf ("Downlink: correct data demodulation: %d/%d\n", sum(sum(sum(ue_rx_data==tx_data_dl_raw))), length(SC_IND_DATA) *NUM_UE *(N_SYMS-NUM_UE))
 

Variables

Parameters MOD_ORDER = 16
 
 N_SC = 2048
 
 SC_IND_DATA = 425:1624
 
 OFDM_START_OFFSET = 424
 
 NUM_BS_ANT = 8
 
 NUM_UE = 8
 
 N_SYMS = 70
 
 N_OFDM_SYMS = (N_SYMS-NUM_UE)*NUM_UE
 
 N_DATA_SYMS = N_OFDM_SYMS * length(SC_IND_DATA)
 
used to generate new pilot files in time domain and frequency domain pilot in time domain
 
used to generate new data files original data(tx_data) for all users before modulation CP_LEN = 0
 
 frmLen = 100
 
frame length Generate pilot if GENERATE_PILOT pilot_f = randi(3,N_SC,1)-2
 
 pilot_t = ifft(pilot_f, N_SC)
 
 fileID = fopen('../files/experiment/pilot_f_2048.bin','w')
 
end Generate data if GENERATE_DATA tx_data = randi(MOD_ORDER, 1, N_DATA_SYMS) - 1
 
 tx_data_for_saving = reshape(tx_data, length(SC_IND_DATA), N_OFDM_SYMS/NUM_UE, NUM_UE)
 
 fileID_data = fopen(sprintf('../files/experiment/orig_data_2048_ant%d.bin',NUM_BS_ANT),'w')
 
end Modulate data modvec_bpsk = (1/sqrt(2)) .* [-1 1]
 
 modvec_16qam = (1/sqrt(10)) .* [-3 -1 +3 +1]
 
 getbit13 = @(x) (bitget(x,3) * 2 + bitget(x,1))
 
 getbit24 = @(x) (bitget(x,4) * 2 + bitget(x,2))
 
 mod_fcn_bpsk = @(x) complex(modvec_bpsk(1+x),0)
 
 mod_fcn_qpsk = @(x) complex(modvec_bpsk(1+bitshift(x, -1)), modvec_bpsk(1+mod(x, 2)))
 
 mod_fcn_16qam = @(x) complex(modvec_16qam(1+bitshift(x, -2)), modvec_16qam(1+mod(x,4)))
 
switch MOD_ORDER case BPSK tx_syms = arrayfun(mod_fcn_bpsk, tx_data)
 
 return
 
end IFFT Reshape the symbol vector into two different spatial streams size
 
Construct the IFFT input matrix ifft_in_mat = zeros(NUM_BS_ANT, N_SC, N_OFDM_SYMS/NUM_BS_ANT)
 
Insert the data and pilot values
 
Perform the IFFT tx_payload_mat = ifft(ifft_in_mat, N_SC, 1)
 
 H = repmat(H,1,1,N_SC)
 
 noise = (randn(N_SC,NUM_UE, NUM_BS_ANT) + 1i*randn(N_SC, NUM_UE, NUM_BS_ANT))/sqrt(2)/100
 
 H_noisy = H + noise
 
 H_vec = reshape(H_noisy, 1, numel(H_noisy))
 
 H_vec_float = zeros(1,size(H_vec,2)*2)
 
 H_from_file = fread(fileID,[1,N_SC*NUM_UE*NUM_BS_ANT*2],'float')
 
for i
 
end pilot_all_ue = reshape(pilot_all_ue, N_SC,1,NUM_UE)
 
 tx_mat_all = cat(2,pilot_all_ue,tx_payload_mat)
 
 tx_mat = reshape(tx_mat_all,N_SC*N_SYMS,NUM_UE)
 
Rx data rx_mat_all = zeros(N_SC,N_SYMS,NUM_BS_ANT)
 
 tx_mat_all_f = fft(tx_mat_all,N_SC,1)
 
 rx_mat_all_f = zeros(N_SC,N_SYMS,NUM_BS_ANT)
 
 rx_mat = tx_mat*H
 
CSI estimation CSI_est = zeros(N_SC,NUM_UE,NUM_BS_ANT)
 
 pilot_est = zeros(N_SC,NUM_UE,NUM_BS_ANT)
 
 rx_vec = reshape(rx_mat_all, 1, numel(rx_mat_all))
 
 rx_vec_float = zeros(1,size(rx_vec,2)*2)
 
end H_est = squeeze(CSI_est(1,:,:))
 
 rx_data_fft = fft(rx_mat_data,N_SC,1)
 
 precoder_all = zeros(length(SC_IND_DATA),NUM_BS_ANT,NUM_UE)
 
 rx_syms_mat = zeros(length(SC_IND_DATA),N_SYMS-NUM_UE,NUM_UE)
 
 rx_mat_data = rx_mat_all(:,:,NUM_UE+1:end)
 
size __pad1__
 
 rx_syms = precoder * rx_data_fft
 
 demod_fcn_bpsk = @(x) double(real(x)>0)
 
 demod_fcn_qpsk = @(x) double(2*(real(x)>0) + 1*(imag(x)>0))
 
 demod_fcn_16qam = @(x) (8*(real(x)>0)) + (4*(abs(real(x))<0.6325)) + (2*(imag(x)>0)) + (1*(abs(imag(x))<0.6325))
 
case QPSK rx_data = arrayfun(demod_fcn_qpsk, rx_syms_mat(:))
 
 tx_data_mat = reshape(tx_data,length(SC_IND_DATA),N_SYMS-NUM_UE,NUM_UE)
 
 rx_data_from_file = fread(fileID,[1,N_SC*N_SYMS*NUM_BS_ANT*2],'float')
 
 rx_data_from_file_float = rx_data_from_file(1:2:end)+1j*rx_data_from_file(2:2:end)
 
 rx_pilot_from_file = rx_data_from_file_float(:,1:8,:)
 
 H_from_file_float = H_from_file(1:2:end)+1j*H_from_file(2:2:end)
 
Precoder calculation and precoding precoder_from_file = zeros(N_SC,NUM_BS_ANT,NUM_UE)
 
end original data before modulation tx_data_dl_raw = reshape(tx_data,length(SC_IND_DATA),N_SYMS-NUM_UE, NUM_UE)
 
original data after modulation tx_data_dl = reshape(tx_syms,length(SC_IND_DATA),N_SYMS-NUM_UE, NUM_UE)
 
 precoded_data = zeros(N_SC,NUM_BS_ANT,N_SYMS-NUM_UE)
 
 dl_rx_data_f = zeros(N_SC,NUM_BS_ANT,N_SYMS-NUM_UE)
 
end ifft_data = ifft(precoded_data,N_SC,1)
 
 dl_rx_data = ifft(dl_rx_data_f,N_SC,1)
 
if GENERATE_DATA dl_rx_data_saving = dl_rx_data(:).* N_SC
 
 dl_rx_data_saving_float = zeros(1,length(dl_rx_data_saving)*2)
 
end dl_rx_data_fft_orig = fft(dl_rx_data,N_SC,1)
 
 dl_rx_data_fft = zeros(length(SC_IND_DATA),NUM_UE,N_SYMS-NUM_UE)
 
case QPSK ue_rx_data = arrayfun(demod_fcn_qpsk, dl_rx_data_fft(:))
 

Function Documentation

◆ arrayfun()

mod_fcn_16qam, tx_data arrayfun ( )
virtual

◆ CSI_est()

CSI_est ( ,
i  ,
 
)

◆ disp()

show data of symbol and all users from subcarrier to disp ( squeeze(rx_data(1:6, 1,:))  )

◆ dl_rx_data_f() [1/2]

dl_rx_data_f ( 424+  i,
,
 
)

◆ dl_rx_data_f() [2/2]

dl_rx_data_f ( OFDM_START_OFFSET i,
,
 
)

◆ dl_rx_data_saving_float() [1/2]

dl_rx_data_saving_float ( 1:2:end  )

◆ dl_rx_data_saving_float() [2/2]

dl_rx_data_saving_float ( 2:2:end  )

◆ fclose() [1/2]

fclose ( fileID  )

◆ fclose() [2/2]

fclose ( fileID_data  )

◆ fprintf() [1/6]

end fprintf ( "CSI_estimation error: %d/%d\n ,
sum(sum(sum(abs(CSI_est(SC_IND_DATA,:,:) -H_from_file_float(SC_IND_DATA,:,:))>0.5 *1e-1)))  ,
length(H_from_file_float(:))   
)

◆ fprintf() [2/6]

end fprintf ( "CSI_estimation error: %d/%d\n ,
sum(sum(sum(abs(CSI_est(SC_IND_DATA,:,:) -H_noisy(SC_IND_DATA,:,:))>0.5 *1e-1)))  ,
length(H_noisy(:))   
)

◆ fprintf() [3/6]

Downlink data analysis fprintf ( "Downlink.....\n"  )

◆ fprintf() [4/6]

fprintf ( "Downlink: correct data demodulation: %d/%d\n ,
sum(sum(sum(ue_rx_data==tx_data_dl_raw)))  ,
length(SC_IND_DATA) *NUM_UE *(N_SYMS-NUM_UE  
)

◆ fprintf() [5/6]

fprintf ( "Uplink: correct data demodulation: %d/%d\n ,
sum(sum(sum(rx_data==tx_data_mat)))  ,
length(tx_data_mat(:))   
)

◆ fprintf() [6/6]

otherwise fprintf ( 'Invalid MOD_ORDER(%d)! Must be in\n [2, 4, 16],
MOD_ORDER   
)

◆ fwrite() [1/6]

fwrite ( fileID  ,
dl_rx_data_saving_float  ,
'float'   
)

◆ fwrite() [2/6]

fwrite ( fileID  ,
H_vec_float  ,
'float'   
)

◆ fwrite() [3/6]

fwrite ( fileID  ,
pilot_f  ,
'float'   
)

◆ fwrite() [4/6]

fwrite ( fileID  ,
pilot_t  ,
'float'   
)

◆ fwrite() [5/6]

fwrite ( fileID  ,
rx_vec_float  ,
'float'   
)

◆ fwrite() [6/6]

fwrite ( fileID_data  ,
tx_data_for_saving(:)  ,
'uint8'   
)

◆ H_vec_float() [1/2]

H_vec_float ( 1:2:end  )

◆ H_vec_float() [2/2]

H_vec_float ( 2:2:end  )

◆ if()

Add CP Insert the cyclic prefix if ( CP_LEN  ,
 
)

◆ ifft_in_mat_A()

ifft_in_mat_A ( SC_IND_PILOTS  ,
 
)

◆ length()

end IFFT Reshape the symbol vector into two different spatial streams length ( tx_syms  )

◆ numel()

Reshape to a vector numel ( tx_payload_mat  )

◆ pilot_f() [1/2]

pilot_f ( pilot_f  = =0)

◆ pilot_f() [2/2]

pilot_f ( setdiff(1:N_SC, SC_IND_DATA )
pure virtual

◆ precoder_from_file()

precoder_from_file ( i  ,
,
 
)

◆ rx_syms_mat()

rx_syms_mat ( i  ,
,
 
)

◆ rx_vec_float() [1/2]

rx_vec_float ( 1:2:end  )

◆ rx_vec_float() [2/2]

rx_vec_float ( 2:2:end  )

◆ sqrt()

2 sqrt ( )
staticvirtual

◆ switch()

switch ( MOD_ORDER  )

◆ tx_payload_vec()

pilot_t.',1,NUM_UE tx_payload_vec ( )
virtual

◆ tx_syms_mat()

tx_syms_mat ( SC_IND_DATA  ,
,
 
)

◆ zeros()

N_SC,NUM_UE,NUM_UE zeros ( )
staticvirtual

Variable Documentation

◆ __pad1__

size __pad1__

◆ CP_LEN

used to generate new data files original data (tx_data) for all users before modulation CP_LEN = 0

◆ CSI_est

CSI estimation CSI_est = zeros(N_SC,NUM_UE,NUM_BS_ANT)

◆ demod_fcn_16qam

demod_fcn_16qam = @(x) (8*(real(x)>0)) + (4*(abs(real(x))<0.6325)) + (2*(imag(x)>0)) + (1*(abs(imag(x))<0.6325))

◆ demod_fcn_bpsk

demod_fcn_bpsk = @(x) double(real(x)>0)

◆ demod_fcn_qpsk

demod_fcn_qpsk = @(x) double(2*(real(x)>0) + 1*(imag(x)>0))

◆ dl_rx_data

dl_rx_data = ifft(dl_rx_data_f,N_SC,1)

◆ dl_rx_data_f

dl_rx_data_f = zeros(N_SC,NUM_BS_ANT,N_SYMS-NUM_UE)

◆ dl_rx_data_fft

◆ dl_rx_data_fft_orig

end dl_rx_data_fft_orig = fft(dl_rx_data,N_SC,1)

◆ dl_rx_data_saving

if GENERATE_DATA dl_rx_data_saving = dl_rx_data(:).* N_SC

◆ dl_rx_data_saving_float

dl_rx_data_saving_float = zeros(1,length(dl_rx_data_saving)*2)

◆ domain

used to generate new pilot files in time domain and frequency domain pilot in time domain

◆ fileID

fileID = fopen('../files/experiment/pilot_f_2048.bin','w')

◆ fileID_data

else fileID_data = fopen(sprintf('../files/experiment/orig_data_2048_ant%d.bin',NUM_BS_ANT),'w')

◆ frmLen

frmLen = 100

◆ getbit13

getbit13 = @(x) (bitget(x,3) * 2 + bitget(x,1))

◆ getbit24

getbit24 = @(x) (bitget(x,4) * 2 + bitget(x,2))

◆ H

H = repmat(H,1,1,N_SC)

◆ H_est

end H_est = squeeze(CSI_est(1,:,:))

◆ H_from_file

H_from_file = fread(fileID,[1,N_SC*NUM_UE*NUM_BS_ANT*2],'float')

◆ H_from_file_float

H_from_file_float = H_from_file(1:2:end)+1j*H_from_file(2:2:end)

◆ H_noisy

H_noisy = H + noise

◆ H_vec

H_vec = reshape(H_noisy, 1, numel(H_noisy))

◆ H_vec_float

H_vec_float = zeros(1,size(H_vec,2)*2)

◆ i

for i
Initial value:

◆ ifft_data

end ifft_data = ifft(precoded_data,N_SC,1)

◆ ifft_in_mat

other subcarriers will remain at ifft_in_mat = zeros(NUM_BS_ANT, N_SC, N_OFDM_SYMS/NUM_BS_ANT)

◆ mod_fcn_16qam

mod_fcn_16qam = @(x) complex(modvec_16qam(1+bitshift(x, -2)), modvec_16qam(1+mod(x,4)))

◆ mod_fcn_bpsk

mod_fcn_bpsk = @(x) complex(modvec_bpsk(1+x),0)

◆ mod_fcn_qpsk

mod_fcn_qpsk = @(x) complex(modvec_bpsk(1+bitshift(x, -1)), modvec_bpsk(1+mod(x, 2)))

◆ MOD_ORDER

Parameters MOD_ORDER = 16

◆ modvec_16qam

modvec_16qam = (1/sqrt(10)) .* [-3 -1 +3 +1]

◆ modvec_bpsk

end Modulate data modvec_bpsk = (1/sqrt(2)) .* [-1 1]

◆ N_DATA_SYMS

N_DATA_SYMS = N_OFDM_SYMS * length(SC_IND_DATA)

◆ N_OFDM_SYMS

N_OFDM_SYMS = (N_SYMS-NUM_UE)*NUM_UE

◆ N_SC

N_SC = 2048

◆ N_SYMS

N_SYMS = 70

◆ noise

noise = (randn(N_SC,NUM_UE, NUM_BS_ANT) + 1i*randn(N_SC, NUM_UE, NUM_BS_ANT))/sqrt(2)/100

◆ NUM_BS_ANT

NUM_BS_ANT = 8

◆ NUM_UE

Reshape the symbol vector to a matrix with one column per OFDM symbol N_OFDM_SYMS NUM_UE = 8

◆ OFDM_START_OFFSET

OFDM_START_OFFSET = 424

◆ pilot_all_ue

end pilot_all_ue = reshape(pilot_all_ue, N_SC,1,NUM_UE)

◆ pilot_est

pilot_est = zeros(N_SC,NUM_UE,NUM_BS_ANT)

◆ pilot_f

pilot_f = randi(3,N_SC,1)-2

◆ pilot_t

pilot_t = ifft(pilot_f, N_SC)

◆ precoded_data

precoded_data = zeros(N_SC,NUM_BS_ANT,N_SYMS-NUM_UE)

◆ precoder_all

◆ precoder_from_file

Precoder calculation and precoding precoder_from_file = zeros(N_SC,NUM_BS_ANT,NUM_UE)

◆ return

return

◆ rx_data

◆ rx_data_fft

rx_data_fft = fft(rx_mat_data,N_SC,1)

◆ rx_data_from_file

rx_data_from_file = fread(fileID,[1,N_SC*N_SYMS*NUM_BS_ANT*2],'float')

◆ rx_data_from_file_float

rx_data_from_file_float = rx_data_from_file(1:2:end)+1j*rx_data_from_file(2:2:end)

◆ rx_mat

rx_mat = tx_mat*H

◆ rx_mat_all

rx_mat_all = zeros(N_SC,N_SYMS,NUM_BS_ANT)

◆ rx_mat_all_f

rx_mat_all_f = zeros(N_SC,N_SYMS,NUM_BS_ANT)

◆ rx_mat_data

rx_mat_data = rx_mat_all(:,:,NUM_UE+1:end)

◆ rx_pilot_from_file

rx_pilot_from_file = rx_data_from_file_float(:,1:8,:)

◆ rx_syms

rx_syms = precoder * rx_data_fft

◆ rx_syms_mat

◆ rx_vec

rx_vec = reshape(rx_mat_all, 1, numel(rx_mat_all))

◆ rx_vec_float

rx_vec_float = zeros(1,size(rx_vec,2)*2)

◆ SC_IND_DATA

SC_IND_DATA = 425:1624

◆ size

Reshape to a vector size

◆ tx_data

tx_data = randi(MOD_ORDER, 1, N_DATA_SYMS) - 1

◆ tx_data_dl

tx_data_dl = reshape(tx_syms,length(SC_IND_DATA),N_SYMS-NUM_UE, NUM_UE)

◆ tx_data_dl_raw

tx_data_dl_raw = reshape(tx_data,length(SC_IND_DATA),N_SYMS-NUM_UE, NUM_UE)

◆ tx_data_for_saving

tx_data_for_saving = reshape(tx_data, length(SC_IND_DATA), N_OFDM_SYMS/NUM_UE, NUM_UE)

◆ tx_data_mat

tx_data_mat = reshape(tx_data,length(SC_IND_DATA),N_SYMS-NUM_UE,NUM_UE)

◆ tx_mat

tx_mat = reshape(tx_mat_all,N_SC*N_SYMS,NUM_UE)

◆ tx_mat_all

tx_mat_all = cat(2,pilot_all_ue,tx_payload_mat)

◆ tx_mat_all_f

tx_mat_all_f = fft(tx_mat_all,N_SC,1)

◆ tx_payload_mat

tx_payload_mat = ifft(ifft_in_mat, N_SC, 1)

◆ tx_syms

case QPSK tx_syms = arrayfun(mod_fcn_bpsk, tx_data)

◆ ue_rx_data

end ue_rx_data = arrayfun(demod_fcn_qpsk, dl_rx_data_fft(:))

◆ values

Insert the data and pilot values
pilot_t
pilot_t
Definition: generate_data_dl.m:28
i
for i
Definition: generate_data_dl.m:152
NUM_UE
NUM_UE
Definition: generate_data_dl.m:7
pilot_all_ue
end pilot_all_ue
Definition: generate_data_dl.m:155