• 发文
  • 评论
  • 微博
  • 空间
  • 微信

基础:如何用MATLAB生成AWGN噪声?(附源代码)

FPGA算法工程师 2022-05-06 14:00 发文

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---

声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    FPGA算法工程师

    聊无线通信技术,致力于FPGA、...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码