%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Copyright (c) 2019 Francisco Javier Garcia-Gomez % Institute for Communications Engineering (LNT) % Technical University of Munich, Germany % www.lnt.ei.tum.de % % All rights reserved. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Permission is hereby granted, free of charge, to any person obtaining a % copy of this software and associated documentation files (the % "Software"), to deal in the Software without restriction, including % without limitation the rights to use, copy, modify, merge, publish, % distribute, sublicense, and/or sell copies of the Software, and to permit % persons to whom the Software is furnished to do so, subject to the % following conditions: % % The above copyright notice and this permission notice shall be included % in all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS % OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN % NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, % DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR % OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE % USE OR OTHER DEALINGS IN THE SOFTWARE. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%% example_mi_cg_complex_16qam.m %%%%%%%%%%%%%%%%%%%%%% % % Example usage of the function mi_cg to numerically compute mutual % information between two complex sequences. This file simulates a % one-dimensional complex AWGN channel with 16-QAM constellation for % different SNRs, and then plots the achievable rate, which is equal to two % times the 4-PAM curve of Fig. 1 of [1]. % % Note that using mi_cg with complex sequences assumes that the channel % model q(Y|X) is circularly symmetric for a given X=x (i.e., that the % received clouds are circular). This is not the case in a channel with % phase noise: see example_it_mi_cg.m for an example of how to deal with % non-circularly-symmetric channels. % % [1] G. David Forney and Gottfried Ungerboeck, "Modulation and Coding for % Linear Gaussian Channels", IEEE Trans. Inf. Theory vol. 44, no. 6, pp. % 2384-2415, October 1998 % % Technische Universitaet Muenchen - Lehrstuhl fuer Nachrichtentechnik % Date: 12.12.2019 % Author: Francisco Javier Garcia-Gomez % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear; % close all; %%% Simulation parameters M_QAM=16; % QAM size var_w=1; % noise variance SNR_dB_values=(-5):2:25; % 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_PAM=sqrt(M_QAM); % number of points per real dimension X_1d=-(M_PAM-1)+2*(0:(M_PAM-1)); % generate PAM X=X_1d+1i*X_1d.'; % transform to QAM X=X(:).'*sqrt(3/2/(M_QAM-1)); % set to unit power X=[real(X); imag(X)]; % separate real and imaginary parts %%% Uniformly choose transmit indices idx_tx=randi(M_QAM, [1, N]); %%% AWGN noise w=sqrt(var_w)*(randn([2, N]));%+1i*randn([1, N])); %%% Loop over the SNR values MI_awgn=zeros(1, n_SNR); fig = figure(1); for i_SNR=1:n_SNR % transmitted points s=sqrt(SNR_values(i_SNR)*var_w)*X(:, idx_tx); % AWGN channel r_awgn = s+w; %%%%%%%%%%%% clf hold on xlim([-20, 20]); ylim([-20, 20]); %received signal scatter(r_awgn(1,:),r_awgn(2,:),1,"red",'.'); %tx signal constellation scatter(s(1,:),s(2,:),4,"black",'o','filled'); %uni power transmit constallation scatter(X(1,:),X(2,:),5,'blue','o','filled'); drawnow pause(0.1) %%%%%%%%%%%% % Compute MI 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 I_shannon=log2(1+SNR_values); figure(2); hold on plot(SNR_dB_values, I_shannon, '-', 'DisplayName', 'log_2 (1+SNR)'); hold on; plot(SNR_dB_values, MI_awgn, '--', 'DisplayName', [num2str(M_QAM) '-QAM, AWGN']); hold off; xlabel('SNR (dB)'); ylabel('Achievable rate (bits/complex dimension)'); title(['Achievable rate of ' num2str(M_QAM) '-QAM in AWGN']); legend('Location', 'NorthWest');