function [snr_all, snr_per_level] = calc_snr(tx_signal, eq_noise) % CALC_SNR Calculates overall SNR and level-wise SNR for a PAM-M constellation. % % [snr_all, snr_per_level] = calc_snr(tx_signal, eq_noise) % % Inputs: % tx_signal - Vector of transmitted signal values. % eq_noise - Vector of corresponding noise samples. % % Outputs: % snr_all - Overall SNR computed using all signal values. % snr_per_level - A vector where each element is the SNR computed % for a unique amplitude level in tx_signal. % % The function first computes the overall SNR using the full signal vectors. % Then it uses the unique levels in tx_signal to calculate the SNR for % the symbols corresponding to each level separately. if isa(tx_signal,'Signal') tx_signal = tx_signal.signal; end if isa(eq_noise,'Signal') eq_noise = eq_noise.signal; end % Calculate overall SNR using the complete signals snr_all = snr(tx_signal, eq_noise); % Get the unique amplitude levels in the transmitted signal levels = unique(tx_signal); % Preallocate an array to store the SNR for each unique level % Loop over each unique level to compute the SNR for that level for i = 1:length(levels) % Find indices where tx_signal equals the current level idx = (tx_signal == levels(i)); % Compute the SNR for these indices snr_per_level(i) = snr(tx_signal(idx), eq_noise(idx)); end end