135 lines
4.3 KiB
Matlab
135 lines
4.3 KiB
Matlab
|
|
clear;
|
|
I_shannon=[];
|
|
for cmplx = [1,0]
|
|
cnt = 1;
|
|
for M_PAM = [2,4,8,16]
|
|
|
|
% close all;
|
|
usegarcia = 0;
|
|
|
|
complex_constellation = cmplx;
|
|
|
|
%%% Simulation parameters
|
|
% M_PAM=2; % QAM size
|
|
var_w=1; % noise variance
|
|
SNR_dB_values=(-5):1:35; % SNR values in dB
|
|
N=8000; % number of Monte-Carlo points
|
|
|
|
%%% Derived parameters
|
|
n_SNR=length(SNR_dB_values);
|
|
SNR_values=10.^(SNR_dB_values/10);
|
|
|
|
%%% Generation of QAM constellation with power 1
|
|
M=sqrt(M_PAM); % number of points per real dimension
|
|
|
|
if complex_constellation
|
|
X_ = qammod(0:M_PAM-1,M_PAM,"gray");
|
|
else
|
|
X_ = pammod(0:M_PAM-1,M_PAM,0,'gray');
|
|
end
|
|
|
|
X_ = X_ ./ rms(unique(X_));
|
|
X_=[real(X_); imag(X_)];
|
|
|
|
%%%%%%%%%%%%
|
|
figure(10);
|
|
clf
|
|
hold on
|
|
scatter(X_(1,:),X_(2,:),15,'red','x','DisplayName','Matlab');
|
|
%%%%%%%%%%%%
|
|
|
|
%%% Uniformly choose transmit indices
|
|
idx_tx=randi(M_PAM, [1, N]);
|
|
|
|
%%% AWGN noise
|
|
w=sqrt(var_w)*(randn([2, N]));
|
|
|
|
%%% Loop over the SNR values
|
|
|
|
MI_awgn=zeros(1, n_SNR);
|
|
fig = figure(2);
|
|
for i_SNR=1:n_SNR
|
|
|
|
if usegarcia
|
|
|
|
|
|
%scale transmitted points acc. to SNR condition (this is not correct I think, the papaer also show diff results)
|
|
% s=sqrt(SNR_values(i_SNR)*var_w)*X(:, idx_tx);
|
|
|
|
%scale nosie acc. to snr condition
|
|
noise_power = mean(abs(X_(1, idx_tx)+1i*X_(2, idx_tx)).^2) / SNR_values(i_SNR); % Noise power
|
|
w_ = sqrt(noise_power) .* w / sqrt(2);
|
|
|
|
% AWGN channel
|
|
r_awgn = X(:, idx_tx)+w_;
|
|
% snr_meas(i_SNR) = snr(s(1,:)+1i*s(2,:),w(1,:)+1i*w(2,:));
|
|
snr_meas(i_SNR) = snr(X_(1, idx_tx)+1i*X_(2, idx_tx),w_(1,:)+1i*w_(2,:));
|
|
end
|
|
|
|
s_ = sqrt(SNR_values(i_SNR)*var_w) * X_(:, idx_tx);
|
|
% r_awgn_ = s_ + w;
|
|
|
|
if cmplx
|
|
r_awgn_ = awgn(X_(:, idx_tx),SNR_dB_values(i_SNR),"measured",10);
|
|
w_awgn_matlab = r_awgn_ - X_(:,idx_tx);
|
|
snr_meas_(i_SNR) = snr(X_(1, idx_tx)+1i*X_(2, idx_tx) , w_awgn_matlab(1,:)+1i*w_awgn_matlab(2,:));
|
|
else
|
|
r_awgn_ = awgn(X_(1, idx_tx),SNR_dB_values(i_SNR),"measured",10);
|
|
w_awgn_matlab = r_awgn_ - X_(1,idx_tx);
|
|
snr_meas_(i_SNR) = snr(X_(1, idx_tx) , w_awgn_matlab(1,:));
|
|
end
|
|
|
|
%%%%%%%%%%%%
|
|
clf
|
|
hold on
|
|
xlim([-4, 4]);
|
|
ylim([-4, 4]);
|
|
%received signal
|
|
scatter(X_(1, idx_tx),X_(2, idx_tx),3,"black",'o','DisplayName','Tx Constellation');
|
|
|
|
|
|
if cmplx
|
|
scatter(r_awgn_(1,:),r_awgn_(2,:),1,"red",'x','DisplayName','Matlab Mapping');
|
|
else
|
|
scatter(r_awgn_,zeros(size(r_awgn_)),1,"red",'x','DisplayName','Matlab Mapping');
|
|
end
|
|
drawnow
|
|
|
|
MI_awgn_(i_SNR)=air(X_, r_awgn_, idx_tx);
|
|
% The following also works but is slower
|
|
% MI_awgn(i_SNR)=mi_cg(s, r_awgn);
|
|
end
|
|
|
|
figure(4);
|
|
hold on
|
|
|
|
if isempty(I_shannon)
|
|
I_shannon=log2(1+db2pow(snr_meas_));
|
|
plot(snr_meas_, I_shannon, '-', 'DisplayName', 'log_2 (1+SNR)','Color','black');
|
|
end
|
|
|
|
if usegarcia
|
|
plot(SNR_dB_values, MI_awgn, '--', 'DisplayName', ['GARCIA ',num2str(M_PAM) '-QAM, AWGN']);
|
|
end
|
|
|
|
cols = linspecer(6);
|
|
if complex_constellation
|
|
plot(snr_meas_, MI_awgn_, ':', 'DisplayName', ['',num2str(M_PAM) '-QAM, AWGN'],'LineWidth',1,'Color',cols(cnt,:));
|
|
else
|
|
plot(snr_meas_, MI_awgn_, '-', 'DisplayName', ['',num2str(M_PAM) '-PAM, AWGN'],'LineWidth',1,'Color',cols(cnt,:));
|
|
end
|
|
|
|
hold off;
|
|
ylim([0,8]);
|
|
xlim([min(SNR_dB_values) max(SNR_dB_values)])
|
|
xlabel('SNR (dB)'); ylabel('Achievable rate (bits/complex dimension)');
|
|
title(['Achievable rate of ' num2str(M_PAM) '-QAM in AWGN']);
|
|
legend('Location', 'NorthWest');
|
|
yline(log2(M_PAM),'LineStyle',':','HandleVisibility','off','Color','black');
|
|
|
|
autoArrangeFigures;
|
|
cnt = cnt+1;
|
|
|
|
end
|
|
end |