www.pudn.com > OFDM_simu.rar > OFDM_4qam.m


%function Ber=NoEqualizer(SNR) 
 
% Initialize the parameters 
NumLoop = 1000; 
NumSubc = 128; 
NumCP = 8; 
SyncDelay = 0; 
 
% Generate the random binary stream for transmit test 
BitsTx = floor(rand(1,NumLoop*NumSubc)*2); 
 
% Modulate (generates QAM symbols) 
% input: BitsTx(1,NumLoop*NumSubc); output: SymQAM(NumLoop,NumSubc/2) 
SymQAMtmp = reshape(BitsTx,2,NumLoop*NumSubc/2).'; 
SymQAMtmptmp = bi2de(SymQAMtmp,2,'left-msb'); 
%00->-1-i,01->-1+i,10->1-i,11->1+i 
QAMTable = [-1-i -1+i 1-i 1+i]; 
SymQAM = QAMTable(SymQAMtmptmp+1); 
 
% IFFT 
% input: SymQAM(NumLoop,NumSubc/2); output: SymIFFT(NumSubc,NumLoop) 
SymIFFT = zeros(NumSubc,NumLoop); 
SymIFFTtmp = reshape(SymQAM,NumSubc/2,NumLoop); 
SymIFFTtmptmp = zeros(NumSubc,NumLoop); 
SymIFFTtmptmp(1,:) = real(SymIFFTtmp(1,:)); 
SymIFFTtmptmp(NumSubc/2+1,:) = imag(SymIFFTtmp(1,:)); 
SymIFFTtmptmp(2:NumSubc/2,:) = SymIFFTtmp(2:NumSubc/2,:); 
SymIFFTtmptmp((NumSubc/2+2):NumSubc,:) = flipdim(conj(SymIFFTtmp(2:NumSubc/2,:)),1); 
SymIFFT = ifft(SymIFFTtmptmp,NumSubc,1); 
 
% Add cyclic prefix 
% input: SymIFFT(NumSubc,NumLoop); output: SymCP(NumSubc + NumCP,NumLoop) 
NumAddPrefix = NumSubc + NumCP; 
SymCP = zeros(NumAddPrefix,NumLoop); 
RowPrefix = (NumSubc - NumCP + 1):NumSubc; 
SymCP = [SymIFFT(RowPrefix,:);SymIFFT]; 
 
% Go through the channel 
% input: SymCP(NumSubc + NumCP,NumLoop); output: SymCh(1,(NumSubc + NumCP)*NumLoop) 
SymCh = zeros(1,(NumSubc + NumCP)*NumLoop); 
SymChtmp = SymCP(:).'; 
Ch = [1 1/2 1/4]; 
SymChtmptmp = filter(Ch,1,SymChtmp); 
% Add the AWGN 
snr=0;% = SNR + 10*log10(log2(2)); 
SymCh = awgn(SymChtmptmp,snr,'measured'); 
 
 
% remove guard intervals 
% input: SymCh(1,(NumSubc + NumCP)*NumLoop); output: SymDeCP(NumSubc,NumLoop) 
SymDeCP = zeros(NumSubc,NumLoop); 
SymDeCPtmp = reshape(SymCh,NumSubc + NumCP,NumLoop); 
SymDeCP = SymDeCPtmp((NumCP+1+SyncDelay):NumAddPrefix+SyncDelay,:); 
 
% FFT 
% input: SymDeCP(NumSubc,NumLoop); output: SymFFT(NumSubc,NumLoop) 
SymFFT = fft(SymDeCP,NumSubc,1); 
 
% Make decision(Include DeQAM) 
% SymFFT(NumSubc,NumLoop); output: SymDec(NumSubc,NumLoop) 
SymDec = zeros(NumSubc,NumLoop); 
SymEqtmp(1,:) = SymFFT(1,:)+i*SymFFT(NumSubc/2+1,:); 
SymEqtmp(2:NumSubc/2,:) = SymFFT(2:NumSubc/2,:); 
for m = 1:NumLoop 
    for n = 1:NumSubc/2 
        Real = real(SymEqtmp(n,m)); 
        Imag = imag(SymEqtmp(n,m)); 
        if( abs((Real -1)) < abs((Real +1  )) ) 
            SymDec(2*n-1,m) = 1; 
        else 
            SymDec(2*n-1,m) = 0; 
        end 
        if( abs((Imag -1)) < abs((Imag +1  )) ) 
            SymDec(2*n,m) = 1; 
        else 
            SymDec(2*n,m) = 0; 
        end 
    end 
end 
 
% Bit Error 
BitsRx = zeros(1,NumSubc*NumLoop); 
BitsRx = SymDec(:).'; 
[Num,Ber] = symerr(BitsTx,BitsRx)