49 lines
1.7 KiB
Matlab
49 lines
1.7 KiB
Matlab
% Parameters
|
|
symbols = [0, 1, 2, 3]; % PAM-4 symbols
|
|
P_X = [0.25, 0.25, 0.25, 0.25]; % Uniform probabilities
|
|
sigma2 = 0.1; % Noise variance
|
|
received_samples = [0.2, 1.1, 1.9, 2.8];% Received symbols (example)
|
|
gray_bits = [0 0; 0 1; 1 1; 1 0]; % Gray coding (bits per symbol)
|
|
m = size(gray_bits, 2); % Bits per symbol
|
|
N = length(received_samples); % Number of received samples
|
|
|
|
% Conditional probability function for AWGN
|
|
q_Y_given_X = @(y, x) (1 / sqrt(2 * pi * sigma2)) * exp(-(y - x).^2 / (2 * sigma2));
|
|
|
|
% Entropy term
|
|
H_X = -sum(P_X .* log2(P_X)); % Entropy of input distribution
|
|
|
|
% GMI computation
|
|
noise_impact_term = 0;
|
|
for k = 1:N
|
|
y_k = received_samples(k); % Current received sample
|
|
[~, closest_symbol_idx] = min(abs(symbols - y_k)); % Closest symbol index
|
|
closest_symbol = symbols(closest_symbol_idx); % Closest symbol
|
|
|
|
for i = 1:m
|
|
% Extract i-th bit for each symbol
|
|
bit_mask = gray_bits(:, i); % Binary column for i-th bit of all symbols
|
|
matching_symbols = symbols(bit_mask == gray_bits(closest_symbol_idx, i));
|
|
|
|
% Numerator: Sum over x in x_{b_{k, i}}
|
|
numerator = sum(q_Y_given_X(y_k, matching_symbols) .* P_X(ismember(symbols, matching_symbols)));
|
|
|
|
% Denominator: Sum over all x
|
|
denominator = sum(q_Y_given_X(y_k, symbols) .* P_X);
|
|
|
|
% Logarithmic contribution
|
|
noise_impact_term = noise_impact_term + log2(numerator / denominator);
|
|
end
|
|
end
|
|
|
|
% Normalize the noise impact term by N
|
|
noise_impact_term = noise_impact_term / N;
|
|
|
|
% GMI
|
|
GMI = H_X + noise_impact_term;
|
|
NGMI = GMI / m;
|
|
|
|
|
|
% Display the result
|
|
fprintf('GMI: %.4f bits\n', GMI);
|
|
fprintf('NGMI: %.4f bits\n', NGMI); |