用中文解释bits = randi([0,3],1,N); symbols = qammod(bits,4);
时间: 2023-06-02 16:02:02 浏览: 167
bits = randi([0,3],1,N) 表示生成一个长度为N的随机二进制序列,每个二进制数的取值范围在0到3之间。
symbols = qammod(bits,4) 表示将这个二进制序列转化成4-ary QAM调制的符号序列。QAM调制是一种常用的数字调制方式,4-ary QAM调制表示每个符号有4个取值,符号序列的长度为N/2。
相关问题
clear all; %% 参数设置 M = 4; % 调制阶数 N = 1e5; % 仿真比特数 SNRdB = 0:1:14; % 信噪比范围 Es = 1; % 符号能量 Eb = Es / log2(M); % 比特能量 sigma = sqrt(Es ./ (2 * 10 .^ (SNRdB/10))); % 噪声标准差 %% 信源产生信息比特 bits = randi([0, 1], 1, N); %% 调制 symbols = zeros(1, N/2); for i = 1:N/2 if bits(2i-1)==0 && bits(2i)==0 symbols(i) = -3; elseif bits(2i-1)==0 && bits(2i)==1 symbols(i) = -1; elseif bits(2i-1)==1 && bits(2i)==0 symbols(i) = 1; elseif bits(2i-1)==1 && bits(2i)==1 symbols(i) = 3; end end %% 信道 noises = randn(1, N/2) .* sigma; received = symbols + noises; %% 接收端检测 LLR = zeros(1, N); for i = 1:N/2 LLR(2i-1) = received(i) / sigma(find(SNRdB==SNRdB(i))); LLR(2i) = LLR(2i-1); end %% 将检测结果与信源原始信息比较计算误符号率和误比特率 BER = zeros(size(SNRdB)); SER = zeros(size(SNRdB)); for i = 1:length(SNRdB) % 接收端检测 noises = randn(1, N/2) . sigma(i); received = symbols + noises; LLR = zeros(1, N); for j = 1:N/2 LLR(2j-1) = received(j) / sigma(i); LLR(2j) = LLR(2j-1); end % 软判决译码 bits_hat = zeros(1, N); for j=1:N/2 if LLR(2j-1)>0 bits_hat(2j-1) = 1; end if LLR(2j)>0 bits_hat(2j) = 1; end end % 统计误码率 BER(i) = sum(bits~=bits_hat) / N; SER(i) = sum(symbols~=received) / (N/2); end %% 作图 semilogy(SNRdB, SER, 'k-o', 'linewidth', 2); hold on; semilogy(SNRdB, qfunc(sqrt(210.^(SNRdB/10))), 'r', 'linewidth', 2); grid on; xlabel('SNR(dB)'); ylabel('Symbol Error Rate'); legend('Simulation', 'Theory'); 这个程序出现了错误使用 .* 矩阵维度必须一致。 出错 Untitled (第 29 行) noises = randn(1, N/2) .* sigma; 错误,请更改形成新的MATLAB程序
根据错误提示,矩阵维度必须一致,说明 `sigma` 的维度与 `randn(1, N/2)`同。可以使用 `repmat` 函数将 `sigma` 扩展到与 `randn(1, N/2)` 维度相同的矩阵,如下所示:
```
noises = randn(1, N/2) .* repmat(sigma', 1, N/2);
```
将该代码替换原来的 `noises` 行即可。
%生成随机二进制码 bits = randi([0 1],1,N); %二进制编码到4-PAM符号映射 for k=1:length(bits)/2 if bits(2*k-1)==0 && bits(2*k)==0 symbols(k)=-3; elseif bits(2*k-1)==0 && bits(2*k)==1 symbols(k)=-1; elseif bits(2*k-1)==1 && bits(2*k)==1 symbols(k)=3; else symbols(k)=1; end end %计算AWGN噪声样本标准差 EsN0 = 10^(EsN0/10); N0 = 1/(2*R*EsN0); sigma = sqrt(N0/2); %生成AWGN噪声向量,与信号相加即可 noise = sigma*randn(1,length(symbols)); received = symbols + noise; local_code = [-3 0; -1 -2; 1 2; 3 0]; %相关器输出 for k=1:N/2 r = received(2*k-1:2*k); correlations = sum(repmat(r,4,1).*local_code,2); [Y, I] = max(correlations); decisions(k) = local_code(I,1); end %统计错误个数 num_errors = sum(abs(decisions-symbols(1:length(decisions)))>0); %计算误码率和误符号率 bit_error_rate = num_errors/N; symbol_error_rate = bit_error_rate/log2(M); %绘制误码率曲线 figure(1); semilogy(EsN0dB,theory_ber,'k-',EsN0dB,BER,'ro'); axis([0 15 1e-6 1]) xlabel('E_s/N_0 (dB)'); ylabel('BER'); legend('Theoretical','Simulation');
这段代码是用来模拟基于4-PAM调制的数字通信系统,并计算误码率和误符号率的。其中,随机生成长度为N的二进制码,将其映射到4-PAM符号集合中,然后加入AWGN噪声,接收端对接收到的信号进行相关运算,得到最接近的符号作为决策,并统计误码率和误符号率。最后,使用semilogy函数绘制误码率曲线,并将仿真结果与理论结果进行比较。
阅读全文
相关推荐











