function signal_out = awgn_channel(signal_in, options) %AWGN_CHANNEL Apply additive white Gaussian noise to a signal object. arguments signal_in options.snr_dB (1,1) double = 20 options.randkey = [] end signal_out = signal_in; x = signal_in.signal; signalPower = mean(abs(x).^2, 'all'); %or use signal_in.power if signalPower == 0 return end snrLinear = 10^(options.snr_dB/10); noisePower = signalPower / snrLinear; if isempty(options.randkey) if isreal(x) noise = sqrt(noisePower) * randn(size(x)); else noise = sqrt(noisePower / 2) * (randn(size(x)) + 1i * randn(size(x))); end else rs = RandStream('mt19937ar', 'Seed', options.randkey); if isreal(x) noise = sqrt(noisePower) * randn(rs, size(x)); else noise = sqrt(noisePower / 2) * (randn(rs, size(x)) + 1i * randn(rs, size(x))); end end signal_out.signal = x + noise; if isa(signal_out, 'Signal') desc = sprintf('AWGN channel with SNR %.2f dB', options.snr_dB); meta = struct('snr_dB', options.snr_dB, 'randkey', options.randkey); signal_out = signal_out.logbookentry(desc, meta); end end