主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

awgn

向信号添加高斯白噪声

说明

Y = awgn(X,snr) 将高斯白噪声添加到向量信号 X。此语法假定 X 的功率为 0 dBW。有关加性高斯白噪声的详细信息,请参阅什么是 AWGN?

Y = awgn(X,snr,signalpower) 接受以 dBW 为单位的输入信号功率值。要在添加噪声之前测量 X 的功率,请将 signalpower 指定为 'measured'。如果输入信号功率由于衰落而随时间变化,并且信道的相干时间大于输入持续时间,则 'measured' 选项不会为循环中重复的 awgn 函数调用生成所请求的平均 SNR。

示例

Y = awgn(X,snr,signalpower,randobject) 还接受随机数流对象以生成正态随机噪声采样。有关生成可重复噪声采样的信息,请参阅提示

示例

Y = awgn(X,snr,signalpower,seed) 指定用于初始化正态随机数生成器的种子值,该生成器用于向输入信号添加高斯白噪声。

示例

Y = awgn(___,powertype) 支持之前任何语法中的输入参量,且将信号和噪声功率类型指定为 'dB''linear'。有关 SNR 与噪声相对功率的其他度量(例如 Es/N0Eb/N0)之间关系的信息,请参阅 AWGN Channel Noise Level

[Y,var] = awgn(___) 还返回用于以线性尺度生成随机噪声采样的总噪声方差。

示例

全部折叠

此示例说明如何为采用信道编码的通信链路设置比特能量与噪声密度比 (Eb/No)。

指定里德-所罗门码的码字长度和消息长度。指定调制阶数。

N = 15;        % R-S codeword length in symbols
K = 9;         % R-S message length in symbols
M = 16;        % Modulation order
bps = log2(M); % Bits per symbol

构造一个 (15,9) 里德-所罗门编码器和一个 16-PSK 调制器。指定对象以使其接受比特输入。

rsEncoder = comm.RSEncoder( ...
    CodewordLength=N, ...
    MessageLength=K, ...
    BitInput=true);

创建对应的里德-所罗门解码器和 16-PSK 解调器对象。

rsDecoder = comm.RSDecoder( ...
    CodewordLength=N, ...
    MessageLength=K, ...
    BitInput=true);

根据消息符号与码字长度之比计算里德-所罗门码率。

codeRate = K/N;

以 dB 为单位指定未编码的 Eb/No。使用码率和每符号比特数将未编码的 Eb/No 转换为对应的 SNR。

UncodedEbNo = 6;
SNR = convertSNR(UncodedEbNo,"ebno","SNR", ...
    BitsPerSymbol=bps, ...
    CodingRate=codeRate);

设置仿真的总误码数和总比特数。为了提高准确度,仿真应运行至累积了足够的误码数。总比特数用于确保仿真不会运行太长时间。

totalErrors = 100;
totalBits = 1e6;

构造误码率计算器 System object™ 并初始化误码率向量。

errorRate = comm.ErrorRate;
errorVec = zeros(3,1);

运行仿真以确定 BER。

while errorVec(2) < totalErrors && errorVec(3) < totalBits
    % Generate random bits
    dataIn = randi([0,1],360,1);
    % Add error correction capability by using the RS (15,9) encoder
    dataEnc = rsEncoder(dataIn);
    % Apply 16-PSK modulation
    txSig = pskmod(dataIn,M,InputType="bit");
    % Pass the modulated data through an AWGN channel
    rxSig = awgn(txSig,SNR);
    % Demodulate the received signal
    demodData = pskdemod(rxSig,M,OutputType="bit");
    % Decode the demodulated data with the RS (15,9) decoder
    dataOut = rsDecoder(demodData);
    % Collect error statistics
    errorVec = errorRate(dataIn,demodData);
end

显示生成的误码率。

ber = errorVec(1)
ber = 
0.0935

创建一个锯齿波。

t = (0:0.1:60)';
x = sawtooth(t);

添加高斯白噪声并绘制结果。

y = awgn(x,10,'measured');
plot(t,[x y])
legend('Original Signal','Signal with AWGN')

Plot of the original signal and the signal with AWGN.

在存在高斯噪声的情况下,使用非矩形 16 进制星座图传输和接收数据。显示含噪星座图的散点图,并估计两种不同 SNR 下的符号错误率 (SER)。

基于 V.29 标准(用于电话线调制解调器)创建一个 16-QAM 星座图。

c = [-5 -5i 5 5i -3 -3-3i -3i 3-3i 3 3+3i 3i -3+3i -1 -1i 1 1i];
sigpower = pow2db(mean(abs(c).^2));
M = length(c);

生成随机符号。

data = randi([0 M-1],2000,1);

使用 genqammod 函数调制数据。由于自定义星座图不是矩形,因此需要通用 QAM 调制。

modData = genqammod(data,c);

通过 SNR 为 20 dB 的 AWGN 信道传递信号。

rxSig = awgn(modData,20,sigpower);

显示接收信号和参考星座图 c 的散点图。

h = scatterplot(rxSig);
hold on
scatterplot(c,[],[],'r*',h)
grid
hold off

Constellation diagram scatter plot of the reference signal and the modulated signal passed through an awgn channel.

使用 genqamdemod 函数解调接收信号。确定符号错误数和 SER。

demodData = genqamdemod(rxSig,c);
[numErrors,ser] = symerr(data,demodData)
numErrors = 
4
ser = 
0.0020

使用 SNR 为 10 dB 的 AWGN 信道重复传输和解调过程。确定降低 SNR 后的 SER。与预期相符,当 SNR 降低时性能下降。

rxSig = awgn(modData,10,sigpower);
demodData = genqamdemod(rxSig,c);
[numErrors,ser] = symerr(data,demodData)
numErrors = 
457
ser = 
0.2285

生成随机数据符号和 4-PSK 调制信号。

M = 4;
k = log2(M);
snr = 3;
data = randi([0 M-1],2000,1);
x = pskmod(data,M);

设置随机数生成器种子。

seed = 12345;

在调用 awgn 函数之前,使用 rng 函数生成可重复的随机噪声。

rng(seed);
y = awgn(x,snr);

计算误码数。

dataHat = pskdemod(y,M);
numErr1 = biterr(data,dataHat,k)
numErr1 = 
309

重置随机数生成器种子。

rng(seed);

解调 PSK 信号并计算误码数。

y = awgn(x,snr);
dataHat = pskdemod(y,M);
numErr2 = biterr(data,dataHat,k)
numErr2 = 
309

比较 numErr1numErr2。即使在重置随机数生成器种子后,误码数也是相等的。

isequal(numErr1, numErr2)
ans = logical
   1

通过使用 RandStream 对象和 reset 对象函数生成高斯白噪声添加结果。

将输入信号功率指定为 0 dBW,添加噪声以产生 10 dB 的 SNR,并使用本地随机流。向 sigin 添加两次高斯白噪声以产生 sigout1sigout2。使用 isequal 比较 sigout1sigout2。当不重置随机流时,输出不相等。

S = RandStream('mt19937ar',Seed=5489);
sigin = sqrt(2)*sin(0:pi/8:6*pi);
sigout1 = awgn(sigin,10,0,S);
sigout2 = awgn(sigin,10,0,S);
isequal(sigout1,sigout2)
ans = logical
   0

重置随机流对象,使该对象返回到向 sigout1 添加 AWGN 之前的状态。向 sigin 添加 AWGN 以产生 sigout3,然后比较 sigout1sigout3。当重置随机流时,输出相等。

reset(S);
sigout3 = awgn(sigin,10,0,S);
isequal(sigout1,sigout3)
ans = logical
   1

输入参数

全部折叠

输入信号,指定为标量、向量、数值数组或 dlarray (Deep Learning Toolbox) 对象。输入信号的功率假定为 0 dBW。如果 X 是复数,则 awgn 添加复数噪声。有关详细信息,请参阅数组支持

数据类型: double
复数支持:

信噪比(以 dB 为单位),指定为:

  • 如果输入信号是标量或向量,则指定为标量。

  • 如果输入信号是三维数组,则指定为标量或向量。有关详细信息,请参阅数组支持

函数将相同的 snr 值应用于每个通道。输入信号的列表示一个多通道信号的不同通道。

数据类型: double

信号功率(以 dBW 为单位),指定为标量或 'measured'

  • 标量 - 该值用作 X 的信号级别,以确定达到指定 snr 所需的噪声电平。

  • 'measured' - 计算 X 的信号级别,以确定达到指定 snr 所需的噪声电平。如果输入信号是 dlarraysnr 是向量,则无法使用此值。

如果输入信号是一个多通道信号,该函数将所有通道的 signalpower 值计算为单个值。然后它使用该值计算所有通道的噪声电平。

数据类型: double

随机数流对象,指定为 RandStream 对象。随机流对象的状态确定 randn 函数生成的数字序列。使用 reset (RandStream) 函数及其属性配置随机流对象。如果输入信号是 dlarray,则无法指定随机流对象。

有关生成可重复噪声采样的信息,请参阅提示

随机数生成器种子值,指定为标量。如果输入信号是 dlarray,则无法指定种子。

数据类型: double

信号功率单位,指定为 'dB''linear'

  • powertype'dB' 时,snr 以 dB 为单位测量,signalpower 以 dBW 为单位测量。

  • powertype'linear' 时,snr 以比值测量,signalpower 以瓦特为单位测量(假设参考负载为 1 欧姆)。

要设置 powertype 参量,您还必须设置 snrsignalpower

输出参量

全部折叠

输出信号,以标量、向量或 dlarray (Deep Learning Toolbox) 对象形式返回。返回的输出信号是添加了高斯白噪声的输入信号。如果输入信号 Xdlarray,则此输出 Y 也是 dlarray。有关详细信息,请参阅数组支持

以线性尺度表示的总噪声方差,以正标量形式返回或以向量形式返回(当 snr 是向量时)。函数使用噪声方差生成随机噪声采样。

详细信息

全部折叠

提示

  • 有关 SNR 与噪声相对功率的其他度量(例如 Es/N0Eb/N0)之间关系的信息,请参阅 AWGN Channel Noise Level

  • 要生成可重复的高斯白噪声采样,请执行以下操作之一:

    • 在调用 awgn 函数之前使用 rng(seed) 生成可重复的随机噪声。

    • 提供静态 seed 值作为 awgn 的输入,但在输入是 dlarray 对象时除外。

    • 在将 randobject 作为输入传递给 awgn 之前,对其使用 reset (RandStream) 函数,但在输入是 dlarray 对象时除外。

    • 提供已知状态中的 randobject 作为 awgn 的输入,但在输入是 dlarray 对象时除外。有关详细信息,请参阅 RandStream

  • 为了在 GPU 上重新生成 CPU 随机数流,两者使用的随机数生成器必须一致。有关详细信息,请参阅GPU 上的随机数流 (Parallel Computing Toolbox)

扩展功能

全部展开

版本历史记录

在 R2006a 之前推出

全部展开