Talk:BCH code
Appearance
Dispute on Graph
I dont know how this is going to be useful, but to the best of my knowledge this is the graph I obtained from running my simulation code. The main program is given here (ancillary functions omitted for want of space). You can get the full program from | here.
#!/usr/bin/octave -q #A simple communications channel, %BPSK uncoded. System.BER=[]; System.Error=[]; System.Length=36*1000; System.Mesg=zeros(1,System.Length); System.Coded=[]; %BCH coded. System.BCHError=[]; System.BCHBER=[]; System.BCHLength=System.Length*(63.0/36.0); System.BCHCoded=zeros(1,System.BCHLength); System.BCHDeCoded=[]; %BPSK parameters. System.Modulated=[]; System.DeModulated=[]; System.DeCoded=[]; System.CarrierRate=10; System.DataRate=2; System.SNRdb=0:0.5:10; gen_poly=BCH_poly(); Length=length(System.SNRdb); System.BCHActualErrors=zeros(1,Length); System.BCHCorrected=zeros(1,Length); %Additive White Gaussian Noise, power. System.N0=5; for iter=1:Length disp('=>') System.SNRdb(iter) System.BCHBER disp('Simulating AWGN channel with BCH & BPSK') %Value of SNR Eb=System.SNR=10^(System.SNRdb(iter)/10)*System.N0; %Signal strength, power. System.Eb= System.SNR*System.N0; Ec=Eb*36.0/63.0; %Source Message System.Mesg=mod(floor(randn(1,System.Length)),2); Rxword=[]; Chunks=length(System.Mesg)/36; for biter=1:Chunks bmesg=System.Mesg((biter-1)*36+1:biter*36); cwmesg=GF_product(gen_poly,GF_polarize(bmesg)); %convert from the 0,-1 mode to the 1,0 mode. cwmesgTx=cwmesg+1; System.BCHCoded((biter-1)*63+1:(biter)*63)=cwmesg; %Modulate BPSK bch1=bpskmod(cwmesgTx,20,10,sqrt(Ec)); %Add noise bch2=bch1+sqrt(System.N0)*boxmuller(length(bch1)); %Demodulate BPSK cwRx=bpskdemod(bch2,20,10,sqrt(Ec)); % This is in the +1,+0 mode, % convert to a 0,-1 mode cwrecv=cwRx-1; Rxword=[Rxword cwrecv]; %error pos gives roots w.r.t index of 0. errpos=BCH_decode_berlekamp(cwrecv,63,36,5);%_berlekamp %so add +1, to convert error position locations form 0 index, to +1 index. errpos=errpos+1; if isempty(errpos) %disp('Codeword is correct') correctw=cwrecv; else %printf('Correcting %d errors\n',length(errpos)) %errpos correctw=cwrecv; for i=1:length(errpos) %flip the bits, correctw(errpos(i))=-(1+correctw(errpos(i))); end end %disp('Corrected CW') %correctw %fgets(stdin) CorrectError=length(errpos); System.BCHCorrected(iter)=System.BCHCorrected(iter)+CorrectError; System.BCHDeCoded((biter-1)*63+1:biter*63)=correctw; end System.BCHActualErrors(iter)=Difference(System.BCHCoded,Rxword); System.BCHError(iter)=Difference(System.BCHCoded,System.BCHDeCoded); System.BCHBER(iter)=System.BCHError(iter)/System.BCHLength; %BPSK part of simulation, System.Coded=System.Mesg; %Modulate System.Modulated=bpskmod(System.Coded,System.CarrierRate,System.DataRate,sqrt(System.Eb)); %Channel with AWGN System.Channel=System.Modulated + sqrt(System.N0)*randn(1,length(System.Modulated)); %DeModulate System.DeModulated=bpskdemod(System.Channel,System.CarrierRate,System.DataRate,sqrt(System.Eb)); %Channel Decode System.DeCoded=System.DeModulated; %Error Calculation System.Error(iter)=Difference(System.Coded,System.DeCoded); System.BER(iter)=System.Error(iter)/System.Length; end disp('System Error') System.Error disp('System BER') System.BER disp('System.BCHError') System.BCHError disp('System.BCHBER') System.BCHBER disp('System BCH Actual') System.BCHActualErrors disp('System BCH Corrected') System.BCHCorrected disp('System SNRdb') System.SNRdb semilogy(System.SNRdb,System.BER,";Simulated BPSK;",System.SNRdb,0.5*erfc(sqrt(10.^(System.SNRdb/10))),";Theoretical BPSK;",System.SNRdb,System.BCHBER,";Simulated BCH, [63,36];") title "BPSK Uncoded, Vs BCH Coded systems" save bchchannel_sim System fgets(stdin) fgets(stdin)
Let me know whats the problem, if there is any. --பராசக்தி 16:48, 16 September 2006 (UTC)