|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2007-9-16 12:52
|
显示全部楼层
主程序如下:
% Coding (编码)
% Interleaving (洗牌,插序)
% AWGN-Kanal (有线传输信道噪声模型)
%
clear;
N = 300; % 随机比特序列长度
M = 30; % Interleaving的行数,必须能被N整除
SNR = -6 : 2 : 6; % 信噪比单位dB
packets = 50; % 仿真的包数目
mod = 'QAM'; % 调制方式(QAM, 16QAM, 64QAM)
ov = 8;
delay = 6;
g = rcosine(1, ov, 'sqrt/fir', 0.25, delay);
% ===== 循环信噪比 =====
display ('开始计算...');
for k = 1 : length(SNR)
n_error = 0;
% ===== 循环所有包 =====
for pa = 1 : packtes
% ===== 生成随机序列 =====
bitSequence = randint (N, 1);
% ===== 发送端构建数据报文 =====
% 编码率 R = 1/2, 约束长度 L = 3 polynom {5,7}进行编码
codedBits = convEncoder (bitSequence);
% 进行洗牌
[i_codedBits, n_pad] = interleaving (codedBits, M);
% 编码
tx_symbols = mapping (i_codedBits, mod);
% 传输
tx_symbols_u = upsample (tx_symbols, ov);
tx_data = conv (tx_symols_u, g );
% ===== 加入信道噪声 =====
% 加入高斯白噪声
rx_data = awgn (tx_data, SNR(k) - 10*log10(ov), 'measured');
% ===== 接受端解码 ======
% 匹配滤波器滤出信号,滤波器 g_MF(t) = K*g*(T-t)
rx_data_mf = conv ( rx_data, g);
% 下采样
rx_data_d = downsample (rx_data_mf, ov);
rx_data_dd = rx_data_d (2 * delay + 1 : end - 2 * delay);
% 解调
decidedBits = demapping (rx_data_dd, mod);
% 去洗牌
d_codedBits = deinterleaving (decidedBits, M, n_pad);
% 解码
[decodedBits, metric] = viterbiDekoder (d_codedBits);
% ===== 计算误码 =====
n_error = n_error + sum(xor(bitSequences, decodedBits));
end
% ===== 计算误码率 =====
if (n_error > 0)
BER(k) = log10(n_error/(N * packets));
else
BER(k) = - Inf;
end
display(sprintf('当信噪比 = %i 时误码率 = %f', SNR(k), BER(k)));
end
% ===== 打印误码率曲线 =====
plot (SNR, BER);
title ('系统的误码率');
xlabel ('SNR [dB]');
ylabel ('log_{10}(BER)'); |
|