Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[SOLVED] Problem with BER when the ofdm modulation is added to cdma-SFBC system

Status
Not open for further replies.

moneer

Newbie level 5
Joined
Dec 22, 2009
Messages
10
Helped
1
Reputation
2
Reaction score
1
Trophy points
1,283
Location
Jordan
Activity points
1,481
hi all
iam doing a research on MIMO-cdma ofdm system
the programe works fine when its only cdma-stbc but the problem when i add the ofdm modulation to it the BER goes all wrong, if any one can help me.
thanks
( here is the file since i cant attach it
clc
clear all
close all
%%
% We start by defining some common simulation parameters
numPackets = 10; % number of packets
EbNo = 0:2:16; % Eb/No varying to 20 dB
N = 2; % maximum number of Tx antennas
M = 2; % maximum number of Rx antennas
D = 1;
segmar = 0.1;
Nc = 128; % CDMA code Length
nbitpersym = 10; % number of bits per OFDM symbol (same as the number of subcarriers for BPSK)
nsym = 10; % number of symbols
len_fft = 256; % fft size
sub_car = 10; % number of data subcarriers

EsNo= EbNo + 10*log10(52/64)+ 10*log10(64/80); % symbol to noise ratio

snr= EsNo - 10*log10(64/80); % snr as to be used by awgn fn.
frmLen = nbitpersym*nsym; % frame length
%%
% and set up the simulation.
% Seed states for repeatability
seed = [98765 12345]; randn('state', seed(1)); rand('twister', seed(2));
%%

% Set up a figure for visualizing BER results
h = gcf; grid on; hold on;
set(gca, 'yscale', 'log', 'xlim', [EbNo(1), EbNo(end)], 'ylim', [1e-5 1]);
xlabel('Eb/No (dB)'); ylabel('BER'); set(h,'NumberTitle','off');
set(h, 'renderer', 'zbuffer'); set(h,'Name','Transmit vs. Receive Diversity');
title('Transmit vs. Receive Diversity');


% Create BPSK mod-demod objects
P = 2; % modulation order
bpskmod = modem.pskmod('M', P, 'SymbolOrder', 'Gray');
bpskdemod = modem.pskdemod(bpskmod);

% Pre-allocate variables for speed
tx2 = zeros(frmLen, N); H = zeros(frmLen, N, M);
r21 = zeros(frmLen, 1); r12 = zeros(frmLen, 2);
z21 = zeros(frmLen, 1); z21_1 = zeros(frmLen/N, 1); z21_2 = z21_1;
z12 = zeros(frmLen, M); H1 = zeros(1,15*nsym); H2 = H1;
H3 = H1; H4 = H1; H5 = H1; H6 = H1; H7 = H1; H8 = H1;
error11 = zeros(1, numPackets); BER11 = zeros(1, length(EbNo));
error21 = error11; BER21 = BER11; error12 = error11; BER12 = BER11;
ant1 = complex(zeros(1,frmLen));Gold_code_matrix = zeros(Nc,33);
ant2 = ant1; ant3= ant1;ant4= ant1; r3 = zeros(1,frmLen);r4 = zeros(1,frmLen);
% STBCDEC Space-Time Block Combiner
z = complex(zeros(1,frmLen));
z0 = complex(zeros(1, D)); z1 = z0;
%% CDMA codes
% PN sequence
h= hadamard(Nc);
ds = h(1,:);
ds2 = h(2,:);
%we use symbol energy normalized to 1
%thus, DS energy is normalized to 1 (it is a pulsewaveform)
ds=ds/norm(ds);
ds2=ds2/norm(ds2);

%%
% Loop over several EbNo points
for idx = 1:length(snr)
% Loop over the number of packets
for packetIdx = 1:numPackets

%function [ant1, ant2] = stbcenc(u)
% STBCENC Space-Time Block Encoder
% Outputs the Space-Time block encoded signal per antenna.
data = randint(1, frmLen, 2); % data vector per user per channel
tx = modulate(bpskmod, data); % BPSK modulation
tx = tx/norm(tx);
data2 = randint(1,frmLen,2);
tx3 = modulate(bpskmod, data2);
tx3 = tx3/norm(tx3);
% Alamouti Space-Time Block Encoder, G2, full rate
% G2 = [s0 s1; -s1* s0*]
for i = 1:size(tx,2)/2
s0 = tx:), 2*i-1); s1 = tx:), 2*i);
ant1:), [2*i-1 2*i]) = [s0 -conj(s1)];
ant2:), [2*i-1 2*i]) = [s1 conj(s0)];
s2 = tx3:), 2*i-1); s3 = tx3:), 2*i);
ant3:), [2*i-1 2*i]) = [s2 -conj(s3)];
ant4:), [2*i-1 2*i]) = [s3 conj(s2)];
end
%% OFDM Modulation
% serial to parallel conversion

par_data1 = reshape(ant1,nbitpersym,nsym).';
par_data2 = reshape(ant2,nbitpersym,nsym).';
par_data3 = reshape(ant3,nbitpersym,nsym).';
par_data4 = reshape(ant4,nbitpersym,nsym).';

% fourier transform time doamain data and normalizing the data
IFFT_data1 = (sqrt(100))*ifft(fftshift(par_data1.')).';
IFFT_data2 = (sqrt(100))*ifft(fftshift(par_data2.')).';
IFFT_data3 = (sqrt(100))*ifft(fftshift(par_data3.')).';
IFFT_data4 = (sqrt(100))*ifft(fftshift(par_data4.')).';

% addition cyclic prefix

cylic_add_data1 = [IFFT_data1:),(6:10)) IFFT_data1].';
cylic_add_data2 = [IFFT_data2:),(6:10)) IFFT_data2].';
cylic_add_data3 = [IFFT_data3:),(6:10)) IFFT_data3].';
cylic_add_data4 = [IFFT_data4:),(6:10)) IFFT_data4].';

% parallel to serial coversion

ser_data1 = reshape(cylic_add_data1,15*nsym,1)';
ser_data2 = reshape(cylic_add_data2,15*nsym,1)';
ser_data3 = reshape(cylic_add_data3,15*nsym,1)';
ser_data4 = reshape(cylic_add_data4,15*nsym,1)';

%%
ant11 = kron(ser_data1,ds);
ant22 = kron(ser_data2,ds);
ant33 = kron(ser_data3,ds2);
ant44 = kron(ser_data4,ds2);
%% Correlated Rayliegh Channel Design
Kr=[1 0 0 0 .0056 .0056 .0056 0.0056;0 1 0 0 .0056 .0056 .0056 0.0056;
0 0 1 0 .0056 .0056 .0056 0.0056; 0 0 0 1 .0056 .0056 .0056 0.0056;
0.0056 0.0056 0.0056 0.0056 1 0 0 0; 0.0056 0.0056 0.0056 0.0056 0 1 0 0;
0.0056 0.0056 0.0056 0.0056 0 0 1 0;0.0056 0.0056 0.0056 0.0056 0 0 0 1];
Kg=Kr;
for i=1:64
if Kr(i)==0.0056
Kg(i)=0.1;
end
end
% obtaining the coloring matrix
[L,P,U]=lu(Kg);
segmag = sqrt((2*segmar^2)/(2-pi/2));
V=sqrt(segmag/2)*(randn(8,1)+j*randn(8,1));
W=L*V;
segmar=sqrt((2-(pi/2))*0.5*(segmag^2));
E=1/segmar;
Ri=E.*W;
H1:),1:3:end) = sqrt(Ri(1)/2)*(randn(1,frmLen/2)+j*randn(1,frmLen/2));
H2:),1:3:end) = sqrt(Ri(2)/2)*(randn(1,frmLen/2)+j*randn(1,frmLen/2));
H3:),1:3:end) = sqrt(Ri(3)/2)*(randn(1,frmLen/2)+j*randn(1,frmLen/2));
H4:),1:3:end) = sqrt(Ri(4)/2)*(randn(1,frmLen/2)+j*randn(1,frmLen/2));
H5:),1:3:end) = sqrt(Ri(5)/2)*(randn(1,frmLen/2)+j*randn(1,frmLen/2));
H6:),1:3:end) = sqrt(Ri(6)/2)*(randn(1,frmLen/2)+j*randn(1,frmLen/2));
H7:),1:3:end) = sqrt(Ri(7)/2)*(randn(1,frmLen/2)+j*randn(1,frmLen/2));
H8:),1:3:end) = sqrt(Ri(8)/2)*(randn(1,frmLen/2)+j*randn(1,frmLen/2));
H1:),2:3:end) = H1:),1:3:end);H1:),3:3:end) = H1:),1:3:end);
H2:),2:3:end) = H2:),1:3:end);H2:),3:3:end) = H2:),1:3:end);
H3:),2:3:end) = H3:),1:3:end);H3:),3:3:end) = H3:),1:3:end);
H4:),2:3:end) = H4:),1:3:end);H4:),3:3:end) = H4:),1:3:end);
H5:),2:3:end) = H5:),1:3:end);H5:),3:3:end) = H5:),1:3:end);
H6:),2:3:end) = H6:),1:3:end);H6:),3:3:end) = H6:),1:3:end);
H7:),2:3:end) = H7:),1:3:end);H7:),3:3:end) = H7:),1:3:end);
H8:),2:3:end) = H8:),1:3:end);H8:),3:3:end) = H8:),1:3:end);
H1 = rectpulse(H1,Nc);H2 = rectpulse(H2,Nc);H3 = rectpulse(H3,Nc);
H4 = rectpulse(H4,Nc);H5 = rectpulse(H5,Nc);H6 = rectpulse(H6,Nc);
H7 = rectpulse(H7,Nc);H8 = rectpulse(H8,Nc);
%%
a1=max(max(abs(H1)));a2=max(max(abs(H2)));a3=max(max(abs(H3)));
a4=max(max(abs(H4)));a5=max(max(abs(H5)));a6=max(max(abs(H6)));
a7=max(max(abs(H7)));a8=max(max(abs(H8)));
H1=H1./a1;H2=H2./a2;H3=H3./a3;H4=H4./a4;H5=H5./a5;
H6=H6./a6;H7=H7./a7;H8=H8./a8;
%%
rx11 = awgn(((ant11.*(H1)+ant22.*(H3)+...
(ant33.*(H5)+ant44.*(H7)))/sqrt(N)), EbNo(idx));
rx22 = awgn(((ant11.*(H2)+ant22.*(H4)+...
(ant33.*(H6)+ant44.*(H8)))/sqrt(N)), EbNo(idx));
%%
%rx11 = a1*rx11./abs(H1);
%rx11 = a3*rx11./abs(H3);
%rx11 = a5*rx11./abs(H5);
%rx11 = a7*rx11./abs(H7);
%rx22 = a2*rx22./abs(H2);
%rx22 = a4*rx22./abs(H4);
%rx22 = a6*rx22./abs(H6);
%rx22 = a8*rx22./abs(H8);
%% filter
%[CC,DD] = butter(6,0.5,'low');
%rx1_1 = filter(CC,DD,rx11);
%rx2_2 = filter(CC,DD,rx22);

%% CDMA Demodulation
for v=1:length(ser_data1), %we have length of ser_data blocks
r3(v)=real(ds*rx11((v-1)*Nc+1:v*Nc)');
r4(v)=real(ds*rx22((v-1)*Nc+1:v*Nc)');
end
%% OFDM Demodulation
ser_to_para1 = reshape(r3,15,nsym).'; % serial to parallel coversion
ser_to_para2 = reshape(r4,15,nsym).'; % serial to parallel coversion

cyclic_pre_rem1 = ser_to_para1:),(6:end)); %cyclic prefix removal
cyclic_pre_rem2 = ser_to_para2:),(6:end)); %cyclic prefix removal

FFT_recdata1 =(sqrt(10)/128)*fftshift(fft(cyclic_pre_rem1.')).'; % freq domain transform
FFT_recdata2 =(sqrt(10)/128)*fftshift(fft(cyclic_pre_rem2.')).'; % freq domain transform

ser_data_1 = reshape(FFT_recdata1.',nbitpersym*nsym,1)'; % serial coversion
ser_data_2 = reshape(FFT_recdata2.',nbitpersym*nsym,1)'; % serial coversion

%%
rx1 = ser_data_1; rx2 = ser_data_2;
%%
%Reconstruct the Channels to use at STBC decoder
H1 = intdump(H1,Nc);
H2 = intdump(H2,Nc);
H3 = intdump(H3,Nc);
H4 = intdump(H4,Nc);
H5 = intdump(H5,Nc);
H6 = intdump(H6,Nc);
H7 = intdump(H7,Nc);
H8 = intdump(H8,Nc);
H1 = fft(H1); H2 = fft(H2); H3 = fft(H3);H4 = fft(H4);
H5 = fft(H5); H6 = fft(H6); H7 = fft(H7);H8 = fft(H8);
%%
e = 0.001*(randn(1,1)+j*randn(1,1));
% Space Time Combiner
for i = 1:size(rx1,2)/2
z0:), D) = rx1:), 2*i-1).* (conj(H1:), 2*i-1)+e)) + ...
conj(rx1:), 2*i)).* ((H3:), 2*i)+e))+...
rx2:), 2*i-1).* (conj(H2:), 2*i-1)+e)) + ...
conj(rx2:), 2*i)).* ((H4:), 2*i)+e));
z1:), D) = rx1:), 2*i-1).* (conj(H3:), 2*i-1)+e)) - ...
conj(rx1:), 2*i)).* ((H1:), 2*i)+e))+...
rx2:), 2*i-1).* (conj(H4:), 2*i-1)+e)) - ...
conj(rx2:), 2*i)).* ((H2:), 2*i)+e));

z:), [2*i-1 2*i]) = [z0 z1];
end

demod21 = demodulate(bpskdemod, z);
error21(packetIdx) = biterr(demod21, data);
end
% for G2 coded 2x1 system
BER21(idx) = sum(error21)/(numPackets*frmLen);
% Plot results
semilogy(EbNo(1:idx), BER21(1:idx), 'g*');
legend('SFBC System (2Tx 2Rx)');
drawnow;
end
fitBER21 = berfit(EbNo, BER21);
semilogy(EbNo, fitBER21, 'g');
hold off;
)
thanks
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top