Image talk:Channel Capacity for complex constellations.jpg

From Wikipedia, the free encyclopedia

[edit] source

If you post the Matlab source as well, I can create a better SVG version Alessio Damato 17:32, 15 May 2007 (UTC)


[edit] Matlab Source code

I haven't quite figured out all of the wikipedia markup. So to view this code, just edit the entry and copy and paste.

% Channel Capacity for complex constellations
clear all;
% N is the number of samples we're going to be simulating
% To make the plots smoother, jack up this number
N = 3000;
% The x-axis
SNR = logspace(-.3, 2);
EBNO = logspace(-.16, 2);

%Initialize the noise
Z = ((randn(1,N)) + j*(randn(1,N)))/sqrt(2);
qam = [-1 -1/3 1/3 1];
qam16 = [];
for i=1:4
    qam16 = [qam16 (qam(i) + j*qam)];
end
bits = [1 2 3 4 4];

for i = 1:5
    if(i==1)
        the_xs = HW1_pskX(1, 2);
        r = 1;
    elseif(i==2)
        the_xs = HW1_pskX(1, 4);
        r = 2;
    elseif(i==3)
        the_xs = HW1_pskX(1, 8);
        r = 3;
    elseif(i==4)
        the_xs = HW1_pskX(1, 16);
        r = 4;
    elseif(i==5)
        the_xs = qam16;
        r = 4;
    end

    for s = 1:length(SNR);
        snr = SNR(s);
        the_x = the_xs*sqrt(snr);
        M = length(the_x);
        X = the_x(randint(1,N,M)+1);
        
        Y = X + Z;
        lP = 0;
        for y = Y
            p = HW1_pYget(y, the_x);
            if(p > 1 || p < 0)
                fprintf('Bad p=%d, y=%d, i=%d\n', p,y,i);
            end
            lP = lP + log2(p);
        end
        HY = -lP/length(Y);
        C(i, s) = HY - log2(pi*exp(1));
    end
    
    for s = 1:length(EBNO);
        snr = (EBNO(s)*r);
        the_x = the_xs*sqrt(snr);
        M = length(the_x);
        X = the_x(randint(1,N,M)+1);
        
        Y = X + Z;
        lP = 0;
        for y = Y
            p = HW1_pYget(y, the_x);
            if(p > 1 || p < 0)
                fprintf('Bad p=%d, y=%d, i=%d\n', p,y,i);
            end
            lP = lP + log2(p);
        end
        HY = -lP/length(Y);
        C2(i, s) = HY - log2(pi*exp(1));
    end
end

figure(1);clf; hold on;
subplot(211);
colors = 'rgbmc';
for i=1:5
    plot(log10(SNR)*10, C(i,:),colors(i),'LineWidth',4); hold on;
end
legend('BPSK', 'QPSK', '8 PSK', '16 PSK', '16 QAM','Location','NorthWest');
xlabel('SNR db');
ylabel('Capacity (bits per channel use)');


% This second plot is for the capacity plots vs EB/N0 but I'm pretty
% sure there is a bug in it, so don't use it.
subplot(212); hold on;
for i=1:5
    plot(log10(EBNO)*10, C2(i,:),colors(i),'LineWidth',4); hold on;
end
legend('BPSK', 'QPSK', '8 PSK', '16 PSK', '16 QAM','Location','NorthWest');
xlabel('E_b / N_0 db');
ylabel('Capacity (bits per channel use)');
title('Channel Capacity for complex constellations')
% figure(2); clf; 
% the_xp = HW1_pskX(snr, 16);
% plot(real(the_xp), imag(the_xp));


%%%%%%%
% Some helper functions:
%%%%%%%%%%%%%%%
function p = HW1_pYget(y, X)
    M = length(X);
    p = 1/M * 1/pi * sum(exp(-abs(y - X).^2));

function X = HW1_pskX(SNR, M)
    m = 0:(M-1);
    X = sqrt(SNR)*exp(j*2*pi*m/M);

Speedplane 04:54, 17 May 2007 (UTC)

if you want to post source code, just put in within <pre>...</pre> (as I did for your code). Thanks for the source, I'll use to soon. Alessio Damato 08:43, 17 May 2007 (UTC)