#include "stdafx.h"
#include "itpp/itcomm.h"
#include "uplink.h"
#include "channel_estimation.h"
using std::cin;
using std::cout;
using std::endl;
using namespace itpp;
int main()
{
CRC_Code crc("CRC-24");
Turbo_Codec turbo;
ivec gen(2);
QPSK qpsk;
OFDM ofdm(N, Ncp);
AWGN_Channel awgn_channel;
BERC berc;
it_file ff;
Real_Timer tt;
Channel_Specification channel_spec(ITU_Vehicular_A);
TDL_Channel channel(channel_spec, Ts);
int constraint_length = 4;
Sequence_Interleaver<bin> interleaver_in_turbo(inputbit_num_slot + crc_length);
Sequence_Interleaver<bin> interleaver1( Mbit);
Sequence_Interleaver<double> interleaver2( Mbit);
bvec input_bits(inputbits_num_frame);
Array<bvec> Slot_bits(slots_per_frame);
Array<bvec> Slot_bits_crc(slots_per_frame);
Array<bvec> Slot_bits_turboed(slots_per_frame);
Array<bvec> Slot_bits_interleaved(slots_per_frame);
ivec sequence_interleaver_inturbo;
ivec sequence_interleaver;
bvec transmit_bits(Mbit_frame);
cvec modulated_symb(Mbit_frame/2);
Array<cvec> modulated_symb_StoP(SCsymb_frame_useful);
Array<cvec> dft_symb(SCsymb_frame_useful);
Array<cvec> dft_symb_RS(SCsymb_frame);
Array<cvec> maped_symb(SCsymb_frame);
Array<cvec> ofdm_modulated_symb(SCsymb_frame);
Array<cvec> coeff;
cvec receive_symb;
cvec receive_symb_awgn;
Array<cvec> receive_symb_StoP(SCsymb_frame);
Array<cvec> ofdm_demodulated_symb(SCsymb_frame);
Array<cvec> fft_symb(SCsymb_frame);
Array<cvec> demaped_symb(SCsymb_frame);
cvec transmit_symb(SCsymb_frame * (N + Ncp));
Array<cvec> channel_estimated(SCsymb_frame);
cvec equilibrium_coefficient_mmse;
cvec equilibrium_coefficient_zf;
Array<cvec> equalizated_symb(SCsymb_frame);
Array<cvec> equalizated_symb_useful(SCsymb_frame_useful);
Array<cvec> idft_symb(SCsymb_frame_useful);
cvec idft_symb_PtoS(SCsymb_frame_useful * Msc_PUSCH);
vec demodulated_symb(Msymb);
Array<vec> slot_soft_bits(slots_per_frame);
Array<vec> slot_soft_bits_deinterleaved(slots_per_frame);
Array<bvec> slot_bits_deturboed(slots_per_frame);
Array<bvec> Slot_bits_decrc(slots_per_frame);
bvec output_bits(inputbits_num_frame);
//generator polynomials
gen(0) = 013;
gen(1) = 015;
//channel
channel.set_norm_doppler( norm_doppler);
//channel.set_fading_type(Static);
channel.set_fading_type(Correlated);
//RS
cvec reference_signal = 1/sqrt((double)Msc_PUSCH) *fft(qpsk.modulate_bits( randb( 2 * Msc_PUSCH)));
//turbo码内交织序列
interleaver_in_turbo.randomize_interleaver_sequence();
sequence_interleaver_inturbo = interleaver_in_turbo.get_interleaver_sequence();
turbo.set_parameters(gen, gen, constraint_length, sequence_interleaver_inturbo);
//交织序列
interleaver1.randomize_interleaver_sequence();
sequence_interleaver = interleaver1.get_interleaver_sequence();
interleaver2.set_interleaver_sequence(sequence_interleaver);
vec EbN0dB = linspace(0, 20, 3);
vec EbN0 = inv_dB(EbN0dB);
vec N0 = rate * Eb * pow(EbN0,-1.0);
vec bit_error_rate(EbN0dB.length());
vec block_error_rate(EbN0dB.length());
int block_error = 0;
cout << "\t\t\tstarting simulation"<<endl;
tt.tic();
for (int n=0; n<EbN0dB.length(); n++)
{
awgn_channel.set_noise(N0(n));
int loop_num = ((int)EbN0dB(n)/5 + 1) * loop_num_base;
for(int i=0;i<loop_num;i++)
{
cout << i << " ";
input_bits = randb(inputbits_num_frame);
for(int f=0;f<slots_per_frame;f++)//turbo 按每个时隙(资源块)进行
{
Slot_bits(f) = input_bits( f*inputbit_num_slot, (f+1)*inputbit_num_slot-1);
Slot_bits_crc(f) = crc.encode( Slot_bits(f));
turbo.encode(Slot_bits_crc(f), Slot_bits_turboed(f));
Slot_bits_interleaved(f) = interleaver1.interleave(Slot_bits_turboed(f));
transmit_bits.set_subvector(f * Mbit, Slot_bits_interleaved(f));
}
qpsk.modulate_bits( transmit_bits, modulated_symb);
int p = 0, q = 0;
for(int s=1;s<SCsymb_frame;s++)
{
/****************************transmit*************************************/
if(s % Nsymb_UL != RS_location)
{
//SP
modulated_symb_StoP(p) = modulated_symb(p * Msc_PUSCH, (p + 1) * Msc_PUSCH - 1);
//dft
dft_symb(p) = 1/sqrt((double)Msc_PUSCH) *fft( modulated_symb_StoP(p), Msc_PUSCH);
dft_symb_RS(s) = dft_symb(p);
p++;
}
else
{
//add RS
dft_symb_RS(s) = reference_signal;
}
//subcarrier map
maped_symb(s) = zeros_c( N);
maped_symb(s).set_subvector(map_location, dft_symb_RS(s));
//ofdm modulate
ofdm_modulated_symb(s) = ofdm.modulate( maped_symb(s));
//PS
transmit_symb.set_subvector(s * (N + Ncp), ofdm_modulated_symb(s));
/****************************transmit*************************************/
}
/************************channel and noise********************************/
receive_symb = channel( transmit_symb, coeff);
receive_symb = receive_symb.get(0, transmit_symb.length()- 1);
receive_symb_awgn = awgn_channel(receive_symb);
//receive_symb_awgn = receive_symb;
/************************channel and noise********************************/
for(int s=0;s<SCsymb_frame;s++)
{
//SP
receive_symb_StoP(s) = receive_symb_awgn.get(s * (N + Ncp), (s + 1) * (N + Ncp)-1);
//ofdm demodulate
ofdm_demodulated_symb(s) = ofdm.demodulate(receive_symb_StoP(s));
//subcarrier demap
demaped_symb(s) = ofdm_demodulated_symb(s).get(map_location, map_location + Msc_PUSCH - 1);
}
/**************************************channel estimation**************************/
channel_estimated = channel_estimation(demaped_symb, reference_signal);
/**************************************channel estimation**************************/
/************************************receive and detect****************************/
for(int s=0;s<SCsymb_frame;s++)
{
/************************************FDE***************************************/
//mmse
equilibrium_coefficient_mmse =elem_div(conj(channel_estimated(s)) ,
(elem_mult(channel_estimated(s) , conj(channel_estimated(s))) +
N0(n) * ones_c(Msc_PUSCH)));
equalizated_symb(s) =elem_mult(demaped_symb(s), equilibrium_coefficient_mmse);
//zf
//equilibrium_coefficient_zf = elem_div(ones_c(Msc_PUSCH), channel_estimated(s));
//equalizated_symb(s) =elem_mult(demaped_symb(s), equilibrium_coefficient_zf);
/************************************FDE***************************************/
if(s % Nsymb_UL != RS_location)
{
//remove RS
equalizated_symb_useful(q) = equalizated_symb(s);
//idft
idft_symb(q) = sqrt((double)Msc_PUSCH) * ifft(equalizated_symb_useful(q), Msc_PUSCH);
//PS
idft_symb_PtoS.set_subvector(q * Msc_PUSCH, idft_symb(q));
q++;
}
}
qpsk.demodulate_soft_bits(idft_symb_PtoS, N0(n), demodulated_symb);
for(int f=0;f<slots_per_frame;f++)//按每个时隙(资源块)进行
{
slot_soft_bits(f) = demodulated_symb.get(f*Mbit, (f+1)*Mbit-1);
slot_soft_bits_deinterleaved(f) = interleaver2.deinterleave(slot_soft_bits(f));
turbo.decode(slot_soft_bits_deinterleaved(f), slot_bits_deturboed(f));
if(false == crc.decode(slot_bits_deturboed(f), Slot_bits_decrc(f)))
block_error++;
output_bits.set_subvector( f*inputbit_num_slot, (f+1)*inputbit_num_slot-1, Slot_bits_decrc(f));
}
berc.count(output_bits,input_bits);
}//end of i
bit_error_rate(n) = berc.get_errorrate();
block_error_rate(n) = (double)block_error / (slots_per_frame*loop_num);
berc.clear();
block_error = 0;
cout <<"\nsnr = " << EbN0dB(n) << "\t" << "ber = " << bit_error_rate(n);
cout << "\t"<< "bler = " << block_error_rate(n) << endl;
}//end of n
//Save the results to file:
ff.open("uplink1_ber.it");
ff << Name("EbN0dB") << EbN0dB;
ff << Name("ber") << bit_e
评论14