基础:如何用MATLAB生成AWGN噪声?(附源代码),AWGN 2023-11-14 20:35:38 0 0 MATLAB中的help文档,是一个神奇的存在,检索你想找的关键词,会自动检索出与关键词相关的内容。例如:检索一下“awgn”,我们可以得到如下图所示的界面。 可以非常方便地查阅函数的语法定义,信号定义,以及给出example。 大部分非核心函数,可以打开看到源码,例如awgn的源码: function y = awgn(varargin) %AWGN Add white Gaussian noise to a signal. % Y = AWGN(X,SNR) adds white Gaussian noise to X. The SNR is in dB. % The power of X is assumed to be 0 dBW. If X is complex, then % AWGN adds complex noise. % % Y = AWGN(X,SNR,SIGPOWER) when SIGPOWER is numeric, it represents % the signal power in dBW. When SIGPOWER is 'measured', AWGN measures % the signal power before adding noise. % % Y = AWGN(X,SNR,SIGPOWER,S) uses S to generate random noise samples with % the RANDN function. S can be a random number stream specified by % RandStream. S can also be an integer, which seeds a random number % stream inside the AWGN function. If you want to generate repeatable % noise samples, then either reset the random stream input before calling % AWGN or use the same seed input. % % Y = AWGN(..., POWERTYPE) specifies the units of SNR and SIGPOWER. % POWERTYPE can be 'db' or 'linear'. If POWERTYPE is 'db', then SNR % is measured in dB and SIGPOWER is measured in dBW. If POWERTYPE is % 'linear', then SNR is measured as a ratio and SIGPOWER is measured % in Watts. % % Example 1: % % To specify the power of X to be 0 dBW and add noise to produce % % an SNR of 10dB, use: % X = sqrt(2)*sin(0:pi/8:6*pi);% Y = awgn(X,10,0); % % Example 2: % % To specify the power of X to be 3 Watts and add noise to % % produce a linear SNR of 4, use: % X = sqrt(2)*sin(0:pi/8:6*pi); % Y = awgn(X,4,3,'linear'); % % Example 3: % % To cause AWGN to measure the power of X and add noise to % % produce a linear SNR of 4, use: % X = sqrt(2)*sin(0:pi/8:6*pi); % Y = awgn(X,4,'measured','linear'); % % Example 4: % % To specify the power of X to be 0 dBW, add noise to produce % % an SNR of 10dB, and utilize a local random stream, use: % S = RandStream('mt19937ar','Seed',5489); % X = sqrt(2)*sin(0:pi/8:6*pi); % Y = awgn(X,10,0,S); % % Example 5: % % To specify the power of X to be 0 dBW, add noise to produce % % an SNR of 10dB, and produce reproducible results, use: % reset(RandStream.getGlobalStream) % X = sqrt(2)*sin(0:pi/8:6*pi); % Y = awgn(X,10,0); % % % See also comm.AWGNChannel, WGN, RANDN, RandStream/RANDN, and BSC. % Copyright 1996-2018 The MathWorks, Inc. %#codegen narginchk(2,5); % Validate signal input sig = varargin{1}; validateattributes(sig, {'numeric'}, ... {'nonempty'}, 'awgn', 'signal input'); % Validate SNR input reqSNR = varargin{2}; validateattributes(reqSNR, {'numeric'}, ... {'real','scalar','nonempty'}, 'awgn', 'SNR input'); % Validate signal power if nargin >= 3 if strcmpi(varargin{3}, 'measured') sigPower = sum(abs(sig(:)).^2)/numel(sig); % linear else validateattributes(varargin{3}, {'numeric'}, ... {'real','scalar','nonempty'}, 'awgn', 'signal power input'); sigPower = varargin{3}; % linear or dB end else sigPower = 1; % linear, default end % Validate state or power type if nargin >= 4 coder.internal.errorIf(comm.internal.utilities.isCharOrStringScalar(varargin{4}) && ... all(~strcmpi(varargin{4}, {'db','linear'})), ... 'comm:awgn:InvalidPowerType'); isStream = ~isempty(varargin{4}) && ~comm.internal.utilities.isCharOrStringScalar(varargin{4}); if isStream && ~isa(varargin{4}, 'RandStream') % Random stream seed validateattributes(varargin{4}, {'double'}, ... {'real','scalar','nonnegative','integer','<',2^32}, ... 'awgn', 'seed input'); end else % Default isStream = false; end % Validate power type if nargin == 5 coder.internal.errorIf(comm.internal.utilities.isCharOrStringScalar(varargin{4}), ... % Type has been specified as the 4th input 'comm:awgn:InputAfterPowerType'); coder.internal.errorIf(all(~strcmpi(varargin{5}, {'db','linear'})), ... 'comm:awgn:InvalidPowerType'); end isLinearScale = ((nargin == 4) && ~isStream && strcmpi(varargin{4}, 'linear')) || ... ((nargin == 5) && strcmpi(varargin{5}, 'linear')); % Cross-validation coder.internal.errorIf(isLinearScale && (sigPower < 0), ... 'comm:awgn:InvalidSigPowerForLinearMode'); coder.internal.errorIf(isLinearScale && (reqSNR < 0), ... 'comm:awgn:InvalidSNRForLinearMode'); if ~isLinearScale % Convert signal power and SNR to linear scale if (nargin >= 3) && ~comm.internal.utilities.isCharOrStringScalar(varargin{3}) % User-specified signal power sigPower = 10^(sigPower/10); end reqSNR = 10^(reqSNR/10); end noisePower = sigPower/reqSNR; if isStream if isa(varargin{4}, 'RandStream') stream = varargin{4}; elseif isempty(coder.target) stream = RandStream('shr3cong', 'Seed', varargin{4}); else stream = coder.internal.RandStream('shr3cong', 'Seed', varargin{4}); end if ~isreal(sig) noise = sqrt(noisePower/2)* (randn(stream, size(sig)) + ... 1i*randn(stream, size(sig))); else noise = sqrt(noisePower)* randn(stream, size(sig)); end else if ~isreal(sig) noise = sqrt(noisePower/2)* (randn(size(sig)) + 1i*randn(size(sig))); else noise = sqrt(noisePower)* randn(size(sig)); end end y = sig + noise; % [EOF] 但是,如果不用MATLAB内置的awgn函数,如何用MATLAB生成AWGN噪声? 可以自己写一个,可以找找别人写的,站在别人的肩膀上,可以看得更远。(如果是学习,建议理解awgn背后的原理和定义,然后自己写;如果只是为了应用,提高效率,直接用,浮躁的沉不下来的心,已经蔓延~) 下面这份文档,借花献佛,在不用内置的函数下,用MATLAB生成AWGN噪声,可以参考一下。 文档来源于https://www.gaussianwaves.com,国外的网站,总是这么专业! 高斯波形,信号处理,通信系统,简洁明了。 MATLAB 源码: %author - Mathuranathan Viswanathan (gaussianwaves.com %This code is part of the books: Wireless communication systems using Matlab & Digital modulations using Matlab. function [r,n,N0] = add_awgn_noise(s,SNRdB,L) %Function to add AWGN to the given signal %[r,n,N0]= add_awgn_noise(s,SNRdB) adds AWGN noise vector to signal %'s' to generate a %resulting signal vector 'r' of specified SNR %in dB. It also returns the noise vector 'n' that is added to the %signal 's' and the spectral density N0 of noise added % %[r,n,N0]= add_awgn_noise(s,SNRdB,L) adds AWGN noise vector to %signal 's' to generate a resulting signal vector 'r' of specified %SNR in dB. The parameter 'L' specifies the oversampling ratio used %in the system (for waveform simulation). It also returns the noise %vector 'n' that is added to the signal 's' and the spectral %density N0 of noise added s_temp=s; if iscolumn(s), s=s.'; end; %to return the result in same dim as 's' gamma = 10?(SNRdB/10); %SNR to linear scale if nargin==2, L=1; end %if third argument is not given, set it to 1 if isvector(s), P=L*sum(abs(s).?2)/length(s);%Actual power in the vector else %for multi-dimensional signals like MFSK P=L*sum(sum(abs(s).?2))/length(s); %if s is a matrix [MxN] end N0=P/gamma; %Find the noise spectral density if(isreal(s)), n = sqrt(N0/2)*randn(size(s));%computed noise else n = sqrt(N0/2)*(randn(size(s))+1i*randn(size(s)));%computed noise end r = s + n; %received signal if iscolumn(s_temp), r=r.'; end;%return r in original format as s end ---END--- 原文标题 : 基础:如何用MATLAB生成AWGN噪声?(附源代码) 收藏(0)