H = sqrt(0.5)*(randn(nR,nT)+j*randn(nR,nT));
时间: 2023-12-16 20:04:25 浏览: 162
这段代码是什么意思?
这段代码定义了一个矩阵 H,矩阵的大小是 nR 行 nT 列。其中 randn 函数生成一个均值为0,方差为1的正态分布随机数矩阵,j 表示虚数单位。整个式子的意思是,H 的每个元素都是一个随机的复数,其实部和虚部都是服从均值为0,方差为0.5的正态分布。这段代码通常是在研究无线通信信道的时候使用,用于模拟随机信道。
相关问题
clear; close all; clc; q=1.6e-19; Ib=202e-6; N0=2*q*Ib; Rb=1e6; Tb=1/Rb; R=1; sig_length=1e6; D=5; c=0.15; nt=0.1289; nr=0.9500; N = 10^5; Eb_N0_dB = 1:15; Eb_N0 = 10.^(Eb_N0_dB./10); M = 4; k = 2; s0 = [1 0 0 0]; s1 = [0 1 0 0]; s2 = [0 0 1 0]; s3 = [0 0 0 1]; alpha = [1 2 3 4]; for ii = 1:length(Eb_N0) transmit = randsrc(1,N,alpha); receive = zeros(1,N); P_avg(ii)=sqrt(N0*Rb*Eb_N0(ii)/(2*R^2)); i_peak(ii)=2*R*P_avg(ii); Ep(ii)=i_peak(ii)^2*Tb; sgma(ii)=sqrt(N0*Ep(ii)/2); th=0.5*Ep(ii); for jj = 1:length(transmit) y = zeros(1,4); if transmit(jj) == 1 y =nt*nr.*s0.*exp(-c*D)+sgma(ii)*randn(size(s2)); elseif transmit(jj) == 2 y = nt*nr.*s1.*exp(-c*D)+sgma(ii)*randn(size(s2)); elseif transmit(jj) == 3 y = nt*nr.*s2.*exp(-c*D)+sgma(ii)*randn(size(s2)); elseif transmit(jj) == 4 y = nt*nr.*s3.*exp(-c*D)+sgma(ii)*randn(size(s2)); end y(find(y>th))=1; cmetrics = [dot(y,s0) dot(y,s1) dot(y,s2) dot(y,s3)]; [C, receiveindex] = max(cmetrics); receive(jj) = receiveindex; end errorCount(ii) = nnz([receive - transmit]); end totalError = errorCount/N代码逐句解释
这段代码实现了一个基本的QPSK数字通信系统的仿真,其中QPSK是一种调制方式,将数字信息编码成一个复数信号,其中每个复数点代表两个比特(bit)的信息。下面对代码逐句解释:
```
clear; close all; clc;
```
清空变量,关闭所有的图形窗口,清空命令行窗口。
```
q=1.6e-19; Ib=202e-6; N0=2*q*Ib; Rb=1e6; Tb=1/Rb; R=1; sig_length=1e6; D=5; c=0.15;
```
定义常量,包括电子电荷q、电流Ib、噪声功率谱密度N0、码率Rb、码元时间Tb、电阻R、信号长度sig_length、传播距离D和损耗系数c。
```
nt=0.1289; nr=0.9500; N = 10^5; Eb_N0_dB = 1:15; Eb_N0 = 10.^(Eb_N0_dB./10); M = 4; k = 2;
```
定义常量,包括发射端天线增益nt、接收端天线增益nr、发送比特数N、信号能量与噪声功率比Eb/N0(单位为分贝)、调制方式M(这里为QPSK)和每个符号所代表的比特数k。
```
s0 = [1 0 0 0]; s1 = [0 1 0 0]; s2 = [0 0 1 0]; s3 = [0 0 0 1]; alpha = [1 2 3 4];
```
定义4个QPSK调制点,每个点代表两个比特,因此一个符号可以代表4个比特。alpha定义了4个调制点所对应的整数值,分别是1、2、3、4。
```
for ii = 1:length(Eb_N0)
```
循环,从Eb/N0的最小值开始,逐渐增加。
```
transmit = randsrc(1,N,alpha);
```
产生长度为N的随机整数向量,取值为alpha中的四个整数。
```
receive = zeros(1,N);
```
初始化接收向量。
```
P_avg(ii)=sqrt(N0*Rb*Eb_N0(ii)/(2*R^2));
```
计算平均功率。
```
i_peak(ii)=2*R*P_avg(ii);
```
计算峰值电流。
```
Ep(ii)=i_peak(ii)^2*Tb;
```
计算每个符号的能量。
```
sgma(ii)=sqrt(N0*Ep(ii)/2);
```
计算噪声标准差。
```
th=0.5*Ep(ii);
```
计算判决门限。
```
for jj = 1:length(transmit)
```
循环,处理每个发送比特。
```
y = zeros(1,4);
```
初始化接收信号向量。
```
if transmit(jj) == 1
y =nt*nr.*s0.*exp(-c*D)+sgma(ii)*randn(size(s2));
elseif transmit(jj) == 2
y = nt*nr.*s1.*exp(-c*D)+sgma(ii)*randn(size(s2));
elseif transmit(jj) == 3
y = nt*nr.*s2.*exp(-c*D)+sgma(ii)*randn(size(s2));
elseif transmit(jj) == 4
y = nt*nr.*s3.*exp(-c*D)+sgma(ii)*randn(size(s2));
end
```
模拟信号在传输过程中的衰减和噪声影响。
```
y(find(y>th))=1;
```
判决,如果接收信号大于判决门限,则判定为1。
```
cmetrics = [dot(y,s0) dot(y,s1) dot(y,s2) dot(y,s3)];
```
计算接收信号与四个调制点之间的相关性。
```
[C, receiveindex] = max(cmetrics);
```
找到相关性最大的调制点。
```
receive(jj) = receiveindex;
```
记录接收到的比特值。
```
end
```
处理完一个符号,继续处理下一个符号。
```
errorCount(ii) = nnz([receive - transmit]);
```
计算误比特率。
```
end
```
处理完所有的Eb/N0值。
```
totalError = errorCount/N
```
计算误比特率。
SNR_dB=20; SNR_linear=10.^(SNR_dB/10.); N_iter=50000; sq2=sqrt(0.5); grps = ['r-'; 'b-';'g-';'p-']; for Icase=1:4 if Icase==1, nT=1; nR=1; % 2x2 elseif Icase==2, nT=2; nR=2; % 4x4 elseif Icase==3,nT=4; nR=4; else nT=8; nR=8; end n=min(nT,nR); I = eye(n); for iter=1:N_iter H = sq2*(randn(nR,nT)+j*randn(nR,nT)); C(iter) = log2(real(det(I+SNR_linear/nT*H'*H))); end [PDF,Rate] = hist(C,50); PDF = PDF/N_iter; for i=1:50, CDF(Icase,i) = sum(PDF([1:i])); end plot(Rate,CDF(Icase,:),grps(Icase,:)); hold on这段代码的原理
这段代码是用来模拟无线通信中的信道容量。它通过生成随机的信道矩阵 H,然后计算该信道矩阵下的信道容量,并对其进行多次重复,最终得到信道容量的概率分布函数(PDF)和累积分布函数(CDF)。其中,信噪比(SNR)是一个关键参数,它用来控制信道的质量。代码中的变量 nT 和 nR 分别代表发射端和接收端的天线数,它们决定了信道矩阵 H 的维度。PDF 和 CDF 的绘制则用来显示不同信道维度下的信道容量分布情况。
阅读全文
相关推荐









