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.

How to implement 8PSK modulation in Matlab?

Status
Not open for further replies.

umayumay

Newbie level 1
Joined
May 21, 2019
Messages
1
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
6
Hi. I'm trying to implement 8psk on matlab. My SER looks fine but BER looks like wrong. Can you tell me my mistake? Thank you by now.

Code:
clc, clear all, close all
N = 1e6-1;
M = 8;
k = log2(M);
SNR_db = 0:12;
max_b_sent = 3e7;

mapping =[1/sqrt(2) (1+1i)/2 (0+1i)/sqrt(2) (-1+1i)/2 -1/sqrt(2) (-1-1i)/(2) (0-1i)/sqrt(2) (1-1i)/(2)];
for m = 1:length(SNR_db)
    num_err = 0;
    num_tr = 0;
    num_symb_err = 0;
    num_symb_tr = 0;
    while (num_err<100) && (num_tr<max_b_sent)
          %Transmitter
          b = randi(2,1,N)-1;
          c = bi2de(reshape(b,k,N/k)','left-msb')';
          s = mapping(c+1);
          %AWGN Channel
          sigma = 10^(-SNR_db(m)/20);
          n = sigma*(1/sqrt(2))*(randn(1,N/k)+1i*randn(1,N/k));
          r = s+n;
          %Receiver
          Dist = [abs(r-mapping(1));abs(r-mapping(2));abs(r-mapping(3));abs(r-mapping(4));abs(r-mapping(5));abs(r-mapping(6));abs(r-mapping(7));abs(r-mapping(8))] ;
          [~,index] = min(Dist,[],1);
          c_est = index-1;
          b_est = reshape(de2bi(c_est,'left-msb')',1,N);
          num_err = num_err + sum(b~=b_est);
          num_tr = num_tr + N; 
          num_symb_err = num_symb_err + sum(c~=c_est);
          num_symb_tr = num_symb_tr + N/k;
    end
    ber(m) = num_err / num_tr ; 
    ser(m) = num_symb_err / num_symb_tr ; 
end
SNR_lin = 10.^(SNR_db/10);
% SER theory
ser_th = 2.*qfunc(sqrt(SNR_lin).*sin(pi/M));

% BER theory

ber_th = (1/M)*erfc(sqrt(SNR_lin*M)*sin(pi/M));
%ber_th = qfunc(sqrt(SNR_lin));

% SER drawing
figure
semilogy(SNR_db,ser,'*')
hold on
semilogy(SNR_db,ser_th,'r')

% BER drawing
figure
ebno = SNR_db-10*log10(k);
semilogy(ebno,ber,'*')
hold on
semilogy(ebno,ber_th,'r')
 
Last edited by a moderator:

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top