0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用MATLAB生成AWGN噪声

FPGA技术江湖 来源:FPGA算法工程师 作者:FPGA算法工程师 2022-07-03 15:10 次阅读

huanying

MATLAB中的help文档,是一个神奇的存在,检索你想找的关键词,会自动检索出与关键词相关的内容。例如:检索一下“awgn”,我们可以得到如下图所示的界面。

830b2f06-f396-11ec-ba43-dac502259ad0.png

可以非常方便地查阅函数的语法定义,信号定义,以及给出example。

83351730-f396-11ec-ba43-dac502259ad0.png

835a3754-f396-11ec-ba43-dac502259ad0.png

大部分非核心函数,可以打开看到源码,例如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 inputsig = varargin{1};validateattributes(sig, {'numeric'}, ...    {'nonempty'}, 'awgn', 'signal input');
% Validate SNR inputreqSNR = varargin{2};validateattributes(reqSNR, {'numeric'}, ...    {'real','scalar','nonempty'}, 'awgn', 'SNR input');
% Validate signal powerif 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    endelse    sigPower = 1; % linear, defaultend
% Validate state or power typeif nargin >= 4        coder.internal.errorIf(comm.internal.utilities.isCharOrStringScalar(varargin{4}) && ...        all(~strcmpi(varargin{4}, {'db','linear'})), ...        'commInvalidPowerType');
    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');    endelse % Default    isStream = false;end
% Validate power typeif nargin == 5    coder.internal.errorIf(comm.internal.utilities.isCharOrStringScalar(varargin{4}), ... % Type has been specified as the 4th input        'commInputAfterPowerType');     coder.internal.errorIf(all(~strcmpi(varargin{5}, {'db','linear'})), ...        'commInvalidPowerType'); end
isLinearScale = ((nargin == 4) && ~isStream && strcmpi(varargin{4}, 'linear')) || ...    ((nargin == 5) && strcmpi(varargin{5}, 'linear'));
% Cross-validationcoder.internal.errorIf(isLinearScale && (sigPower < 0), ...    'commInvalidSigPowerForLinearMode');
coder.internal.errorIf(isLinearScale && (reqSNR < 0), ...    'commInvalidSNRForLinearMode');
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));    endelse    if ~isreal(sig)        noise = sqrt(noisePower/2)* (randn(size(sig)) + 1i*randn(size(sig)));    else        noise = sqrt(noisePower)* randn(size(sig));    endend    
y = sig + noise; 
% [EOF]

但是,如果不用MATLAB内置的awgn函数,如何用MATLAB生成AWGN噪声?

可以自己写一个,可以找找别人写的,站在别人的肩膀上,可以看得更远。(如果是学习,建议理解awgn背后的原理和定义,然后自己写;如果只是为了应用,提高效率,直接用,浮躁的沉不下来的心,已经蔓延~)

下面这份文档,借花献佛,在不用内置的函数下,用MATLAB生成AWGN噪声,可以参考一下。

836d4024-f396-11ec-ba43-dac502259ad0.png

839de4b8-f396-11ec-ba43-dac502259ad0.png

83c57a5a-f396-11ec-ba43-dac502259ad0.png

83dbdf98-f396-11ec-ba43-dac502259ad0.png

84399d54-f396-11ec-ba43-dac502259ad0.png

文档来源于https://www.gaussianwaves.com,国外的网站,总是这么专业!

高斯波形,信号处理,通信系统,简洁明了。

845173c0-f396-11ec-ba43-dac502259ad0.png

846c5e24-f396-11ec-ba43-dac502259ad0.png

8496bca0-f396-11ec-ba43-dac502259ad0.png

84a6228a-f396-11ec-ba43-dac502259ad0.png

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 send

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

文章出处:【微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    182

    文章

    2963

    浏览量

    230143
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62426
  • AWGN
    +关注

    关注

    0

    文章

    7

    浏览量

    6731

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

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    何用matlab仿真CCD的噪声

    现在已经用光学设计软件仿真出了图像,怎么在matlab中给它加CCD的仿真噪声!谢谢啦
    发表于 11-29 16:52

    何用matlab写出sollin算法

    何用matlab写出sollin算法?求大神带我学习,价格好商量。
    发表于 04-17 20:30

    Matlab中的snr

    matlab中产生高斯白噪声可以直接应用两个函数,一个是WGN,另一个是AWGN。WGN用于产生高斯白噪声AWGN则用于在某一信号中加
    发表于 05-27 10:10

    何用matlab生成正弦波数据?

    何用matlab生成正弦波数据?
    发表于 11-22 07:15

    AWGN信道仿真数据量研究

    研究了蒙特卡罗仿真原理和仿真结果置信度;结合AWGN(加性白高斯噪声)信道特点,甄选出3 个合适的参量,即误码个数、置信概率和仿真结果最大相对误差;提出了AWGN 信道下仿真数据
    发表于 09-08 15:25 21次下载

    MathWorks推出基于MATLAB生成HDL代码的产品

    MathWorks 近日宣布推出 HDL Coder,该产品 支持MATLAB 自动生成 HDL 代码,允许工程师利用广泛应用的 MATLAB 语言实现 FPGA 和 ASIC 设计。
    发表于 03-07 09:27 2150次阅读
    MathWorks推出基于<b class='flag-5'>MATLAB</b><b class='flag-5'>生成</b>HDL代码的产品

    MATLAB如何生成EXE文件介绍

    MATLAB如何生成EXE文件介绍,感兴趣的小伙伴们可以看看。
    发表于 07-25 10:45 0次下载

    详解如何用AD生成Gerber文件

    详解如何用AD生成Gerber文件
    发表于 11-23 11:07 0次下载

    一文了解加性高斯白噪声AWGN)资料下载

    电子发烧友网为你提供一文了解加性高斯白噪声AWGN)资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-03 08:55 91次下载
    一文了解加性高斯白<b class='flag-5'>噪声</b>(<b class='flag-5'>AWGN</b>)资料下载

    何用matlab生成一个可编程FIR滤波器的硬件HDL代码?

    01 概述 本文通过matlab自带的工具箱生成一个可编程FIR滤波器的硬件HDL代码,可生成VHDL或者Verilog HDL两种类型的代码。 02 具体操作步骤 新建一个matlab
    的头像 发表于 05-03 09:37 3541次阅读
    如<b class='flag-5'>何用</b><b class='flag-5'>matlab</b><b class='flag-5'>生成</b>一个可编程FIR滤波器的硬件HDL代码?

    何用MATLAB实现静态仿真电子版下载

    何用MATLAB实现静态仿真电子版下载
    发表于 05-27 10:40 0次下载

    何用MATLAB进行电路仿真

    本文演示如何用MATLAB进行电路仿真,测量RLC电路的电压。我用的是R2014a,不同版本软件界面稍有差别。
    的头像 发表于 08-09 17:14 1.3w次阅读

    【C语言应用】如何用C代码生成一维码?

    【C语言应用】如何用C代码生成一维码?
    的头像 发表于 08-25 12:42 2395次阅读
    【C语言应用】如<b class='flag-5'>何用</b>C代码<b class='flag-5'>生成</b>一维码?

    NC3400系列同轴AWGN噪声源介绍

    Noisecom的NC3400系列同轴AWGN噪声源需用高ENR和抗高入射点RF使用功率(例如ATE、辐射计和雷达系统)的最佳选择。考虑到NC3400系列噪声源的校正精度和平面度比较低,VSWR也
    发表于 02-08 09:07 491次阅读

    何用MATLAB进行电路仿真?

    本文演示如何用MATLAB进行电路仿真,测量RLC电路的电压。我用的是R2014a,不同版本软件界面稍有差别。
    的头像 发表于 05-26 09:47 4635次阅读
    如<b class='flag-5'>何用</b><b class='flag-5'>MATLAB</b>进行电路仿真?