(4)MATLAB使用randn仿真加性高斯白噪声信道


前言

在通信系统仿真中,经常需要用到加性高斯白噪声信道。MATLAB中可以使用randn函数生成高斯随机变量,作为高斯白噪声叠加到有用信号上,从而仿真加性高斯白噪声信道对信号的影响。本文给出MATLAB仿真代码。


一、仿真代码

代码如下:

f = 1;                                 % 信号频率,单位Hz
fs = 1000;                             % 采样率,单位samples per second
T = 10;                                % 信号时长,单位s
t = 0:1/fs:T;
x = sin(2*pi*f*t);
px = norm(x).^2/length(x);             % 计算信号x的功率,噪声功率=0.5,单位W
snr = 20;                              % 信噪比,dB形式
pn = px./(10.^(snr./10));              % 根据snr计算噪声功率,单位W
n = sqrt(pn) * randn(1,length(x));     % 根据噪声功率产生相应的加性高斯白噪声序列
y = x + n;                             % 信号叠加高斯白噪声,生成有噪信号

figure()
subplot(2,1,1);
plot(t,x);
ylim([-2 2]);
grid on;
title('正弦信号x')
subplot(2,1,2);
plot(t,y);
ylim([-2 2]);
grid on;
title('叠加了加性高斯白噪声后的正弦信号')

% 计算噪声功率(也即噪声方差)
var(n)                                 % 噪声功率=0.005,是信号功率的1%

说明:当信噪比设置为20dB时,意味着,信号功率是噪声功率的100倍。上述代码中,信号的功率为0.5W,所以最终得出的信号功率为0.5/100=0.005W。

二、仿真结果

仿真结果如下:
在这里插入图片描述

后记

本文为了说明加性高斯白噪声信道的底层原理,帮助大家理解加性高斯白噪声信道是如何工作的,所以使用了randn函数进行实现。在MATLAB中,有专门的加性高斯白噪声信道函数awgn,后续将进行介绍。

以下是使用MATLAB实现双极性不归零码通过高斯白噪声信道后的误码率性能的代码。假设发送端发送的双极性不归零码为+1和-1,接收端采用匹配滤来检测信号。高斯白噪声信道的信噪比为Eb/No,其中Eb为每个比特的能量,No为噪声功率谱密度。 ```matlab % 双极性不归零码通过高斯白噪声信道后的误码率性能仿真 clc; clear; close all; %% 参数设置 N = 10^6; % 发送比特数 EbN0dB = 0:2:12; % 信噪比范围 EbN0 = 10.^(EbN0dB/10); % 信噪比 T = 1; % 每个比特的时间长度 SNRdB = EbN0dB + 10*log10(1/T); % 信噪比转换为信噪比比特 sigma = sqrt(1./(2*EbN0)); % 噪声标准差 %% 发送双极性不归零码 s = randi([0,1],1,N); % 随机生成发送比特 s(s==0) = -1; % 0映射为-1 s_up = upsample(s,2); % 2倍上采样 s_polar = zeros(1,length(s_up)); s_polar(1) = s_up(1); for i = 2:length(s_up) s_polar(i) = s_up(i)*s_up(i-1); % 双极性不归零码 end %% 通过高斯白噪声信道 r = zeros(length(sigma),length(s_polar)); % 接收信号 for i = 1:length(sigma) n = sigma(i)*randn(1,length(s_polar)); % 添加高斯白噪声 r(i,:) = s_polar + n; % 接收信号 end %% 检测信号 h = [1, -1]; % 匹配滤器 y = zeros(size(r)); % 匹配滤器输出 for i = 1:length(sigma) y(i,:) = filter(h,1,r(i,:)); % 匹配滤波 end y(y>=0) = 1; % 大于等于0判为1 y(y<0) = -1; % 小于0判为-1 %% 计算误码率 err = zeros(1,length(sigma)); % 错误比特数 for i = 1:length(sigma) err(i) = sum(s~=y(i,1:2:end)); % 统计错误比特数 end Pb = err/N; % 每个比特的误码率 Pe = Pb/2; % 每个码元的误码率 %% 画图 figure; semilogy(SNRdB, Pe, 'b-o', 'LineWidth', 2); grid on; xlabel('信噪比(dB)'); ylabel('误码率'); title('双极性不归零码通过高斯白噪声信道后的误码率性能'); ``` 运行以上代码,即可得到双极性不归零码通过高斯白噪声信道后的误码率曲线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值