turbo码matlab仿真程序
时间: 2023-07-27 16:05:55 浏览: 147
以下是一个简单的turbo码matlab仿真程序:
```
% 定义turbo码参数
K = 4; % 交织器深度
N = 2; % 交织器数量
R = 1/3; % 码率
numBits = 10000; % 发送比特数
% 生成随机发送比特序列
txBits = randi([0 1], numBits, 1);
% 编码器1参数
trellis1 = poly2trellis(4, [13 15]); % 第一个卷积码的状态转移矩阵
interleaver1 = randperm(numBits); % 第一个交织器
% 编码器2参数
trellis2 = poly2trellis(4, [11 14]); % 第二个卷积码的状态转移矩阵
interleaver2 = randperm(numBits); % 第二个交织器
% 编码器1编码
encBits1 = convenc(txBits, trellis1);
encBits1Inter = encBits1(interleaver1);
% 编码器2编码
encBits2 = convenc(txBits, trellis2);
encBits2Inter = encBits2(interleaver2);
% turbo码交织
turboBitsInter = [encBits1Inter zeros(numBits, K-1)];
for i = 1:N
turboBitsInter(:, i:K:end) = [turboBitsInter(:, i:K:end) encBits2Inter(:, i:K:end)];
end
turboBits = turboBitsInter(:, randperm(numBits));
% AWGN信道传输
EbNo = 0:2:10; % 信噪比范围
ber = zeros(1, length(EbNo));
for i = 1:length(EbNo)
snr = EbNo(i) + 10*log10(R);
rxBits = awgn(turboBits, snr, 'measured');
% 解交织器2
rxBitsDeinter = rxBits(:, interleaver2);
rxBitsDeinter1 = rxBitsDeinter(:, 1:K:end);
rxBitsDeinter2 = rxBitsDeinter(:, 2:K:end);
% 卷积码译码器2
decBits2 = vitdec(rxBitsDeinter2, trellis2, 20, 'trunc', 'hard');
% 反交织器1
decBits2Inter = decBits2(interleaver1);
% 求出迭代的输出信息
extrinsic1 = zeros(numBits, 1);
for j = 1:N
extrinsic1(:, i) = sum([rxBits(:, j:K:end) decBits2Inter(:, j:K:end)], 2);
end
% 卷积码译码器1
decBits1 = vitdec([extrinsic1 encBits1Inter], trellis1, 20, 'trunc', 'hard');
% 比较译码后的比特和原始比特
ber(i) = sum(xor(decBits1, txBits))/numBits;
end
% 绘制BER曲线
semilogy(EbNo, ber);
xlabel('Eb/No (dB)');
ylabel('BER');
title('Turbo码AWGN信道性能');
```
这个程序实现了一个简单的turbo码的仿真,并通过AWGN信道进行传输,最后绘制BER曲线。
阅读全文