matlabsignal-processingdigitalmodulation

BPSK modulation and SNR : Matlab


Considering an Additive White Gaussian Noise (AWGN) communication channel where a signal taking values from BPSK modulation is being transmitted. Then, the received noisy signal is :y[k] = s[k] + w[k] where s[k] is either +1,-1 symbol and w[k] is the zero mean white gaussian noise.

-- I want to estimate the signal s and evaluate the performance by varing SNR from 0:40 dB. Let, the estimated signal be hat_s.

So, the graph for this would have on X axis the SNR range and on Y Axis the Mean Square Error obtained between the known signal values and the estimates i.e., s[k] - hat_s[k]

Question 1: How do I define signal-to-noise ratio? Would the formula of SNR be sigma^2/sigma^2_w. I am confused about the term in the numerator: what is the variance of the signal, sigma^2, usually considered?

Question 2: But, I don't know what the value of the variance of the noise is, so how does one add noise?

This is what I have done.

N = 100; %number of samples
s = 2*round(rand(N,1))-1;
 %bpsk modulation
y = awgn(s,10,'measured'); %adding noise but I don't know
the variance of the signal and noise 

%estimation using least squares

hat_s = y./s;


 mse_s = ((s-hat_s).^2)/N;

Please correct me where wrong. Thank you.


Solution

  • First I think that it is important to know what are the things we have an a BPSK system:

    The constellation of a BPSK system is [-A , A] in this case [-1,1] the SNR will vary from 0 db to 40 db

    I thing that the answer is in this function:

    y = awgn( ... ); from matlab central:

    y = awgn(x,snr) adds white Gaussian noise to the vector signal x. The scalar snr specifies the signal-to-noise ratio per sample, in dB. If x is complex, awgn adds complex noise. This syntax assumes that the power of x is 0 dBW.

    y = awgn(x,snr,sigpower) is the same as the syntax above, except that sigpower is the power of x in dBW.

    y = awgn(x,snr,'measured') is the same as y = awgn(x,snr), except that awgn measures the power of x before adding noise.

    you use y = awgn(x,snr,'measured'), so you do not need to worry, beacuse matlab carries all for you, measure the power of the signal, and then apply to channel a noise with the variance needed to get that SNR ratio.

    let's see how can this happen

    SNRbit = Eb/No = A^2/No = dmin^2 /4N0
    
    the constelation [A,-A] in this case is [-1,1] so
    
    10 log10(A^2/N0) = 10 log10(1/N0) = SNRbitdb
    
    SNRlineal = 10^(0.1*SNRdb)
    

    so with that:

    noise_var=0.5/(EbN0_lin); % s^2=N0/2
    

    and the signal will be something like this

    y = s + sqrt(noise_var)*randn(1,size);
    

    so in your case, I will generate the signal as you do:

    >> N = 100; %number of samples
    >> s = 2*round(rand(N,1))-1; %bpsk modulation
    

    then prepare a SNR varies from 0 to 40 db

    >> SNR_DB = 0:1:40;
    

    after that calulating all the posible signals:

    >> y = zeros(100,length(SNR_DB));
    
    >> for i = 1:41
    y(:,i) = awgn(s,SNR_DB(i),'measured');
    end
    

    at this point the best way to see the signal is using a constellation plot like this:

    >> scatterplot(y(:,1));
    >> scatterplot(y(:,41));
    

    scatter plot 40 db

    scatter plot 0 db

    you can see a bad signal 0 db noise equal power as signal and a very good signal signal bigger than 40 DB noise. Eb/No = Power signal - Power noise db, so 0 means power noise equal to power of signal, 40 db means power of signal bigger bigger bigger than power of noise

    then for you plot calculate the mse, matlab has one function for this

    err = immse(X,Y) Description

    example

    err = immse(X,Y) calculates the mean-squared error (MSE) between the arrays X and Y. X and Y can be arrays of any dimension, but must be of the same size and class.

    so with This:

    >> for i = 1:41
    err(i) = immse(s,y(:,i));
    end
    >> stem(SNR_DB,err)
    

    enter image description here

    For plots, and since we are working in db, it should be beeter to use logarithmic axes