第三章 pro4信道编码Turbo编码与软判决译码

仿真思路:

step1:生成随机bit作为待调制信号sig;

step2:对生成bit stream做信道编码,编码方式:Turbo 1/3编码,可观察经编码后的码率变化;

step3:将信道编码后的bit stream经QPSK调制;

step4:调制信号过awgn信道,改变snr,观察过信道后信号变化;

step5:接收端QPSK软解调,输出LLR;

step6:将LLR结果导入至Turbo译码输入,经Turbo译码还原至1/3码率的bit stream,采用软判决方式译码,取译码后的原数据长度为原始bit 流,即为系统bit。代码中LLR结果取了乘以-1,取决于实现时LLR实现时分子分母的含义。

step6:计算误码率;
————————————————
 

%% Constants
clc;clear;close all;
FRM=2048;
Trellis=poly2trellis(4, [13 15], 13);
Indices=randperm(FRM);
MaxNumErrs=200;MaxNumBits=1e7;
EbNo_vector=0:10;BER_vector=zeros(size(EbNo_vector));
%% Initializations
Modulator      = comm.QPSKModulator('BitInput',true);
AWGN             = comm.AWGNChannel;
DeModulator =  comm.QPSKDemodulator('BitOutput',true,...
    'DecisionMethod','Log-likelihood ratio',...
    'VarianceSource', 'Input port');
BitError           = comm.ErrorRate;
TurboEncoder=comm.TurboEncoder(...
    'TrellisStructure',Trellis,...
    'InterleaverIndices',Indices);
TurboDecoder=comm.TurboDecoder(...
    'TrellisStructure',Trellis,...
    'InterleaverIndices',Indices,...
    'NumIterations',6);
%% Outer Loop computing Bit-error rate as a function of EbNo
% for EbNo = EbNo_vector
%     snr = EbNo + 10*log10(2);
    snr = 20;
    noise_var = 10.^(-snr/10);
    AWGN.EbNo=snr;
    numErrs = 0; numBits = 0;results=zeros(3,1);
    %% Inner loop modeling transmitter, channel model and receiver for each EbNo
%     while ((numErrs < MaxNumErrs) && (numBits < MaxNumBits))  
        % Transmitter
        u             = randi([0 1], FRM,1);                  % Generate random bits
        encoded      = TurboEncoder.step(u);                                   % Turbo Encoder
        mod_sig = step(Modulator,   encoded);                % QPSK Modulator

        scatterplot(mod_sig); 
        % Channel
        rx_sig  = step(AWGN,        mod_sig);        % AWGN channel
%         rx_sig = awgn(mod_sig,20,'measured');
        % Receiver

        scatterplot(rx_sig); 
        demod       =  DeModulator.step(rx_sig, noise_var);          % Soft-decision QPSK Demodulator
        decoded      = TurboDecoder.step(-demod);                         % Turbo Decoder  
        y           = decoded(1:FRM);                                          % Compute output bits
        results = step(BitError,    u, y);                  % Update BER
        numErrs = results(2);
        numBits = results(3);
%     end
    % Compute BER
    ber = results(1); bits= results(3);
    %% Clean up & collect results
    reset(BitError);
    BER_vector(EbNo+1)=ber;
% end

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
信道编码和信道译码是通信系统中的重要概念,而汉明码是一种常用的信道编码技术。 信道编码是指在通信系统中对发送的数据进行编码,以增加数据的可靠性和抗干扰能力。它通过在数据中添加冗余信息,使得接收端可以检测和纠正传输过程中可能出现的错误。其中,汉明码是一种常见的线性块码,它通过在原始数据中添加校验位来实现错误检测和纠正。 信道译码是指在接收端对接收到的编码数据进行解码,以还原原始数据。它通过利用编码时添加的冗余信息,检测和纠正传输过程中可能出现的错误。对于汉明码,译码算法可以根据校验位的状态来判断是否存在错误,并尝试纠正错误。 汉明码的编码过程是将原始数据按照一定规则进行编码,添加校验位,生成编码后的数据。而译码过程是根据接收到的编码数据,利用汉明码的纠错能力来检测和纠正错误,还原原始数据。 下面是一个使用(7,4)汉明码进行信道编码译码的示例: ```python # 信道编码 def hamming_encode(data): # 编码矩阵 G = [[1, 0, 0, 0, 1, 1, 0], [0, 1, 0, 0, 1, 0, 1], [0, 0, 1, 0, 0, 1, 1], [0, 0, 0, 1, 1, 1, 1]] # 原始数据长度 n = len(data) # 编码后的数据长度 k = len(G[0]) # 编码后的数据 encoded_data = [] for i in range(0, n, k): block = data[i:i+k] if len(block) < k: block += [0] * (k - len(block)) encoded_block = [0] * (k + 3) for j in range(k): for l in range(k + 3): encoded_block[l] ^= block[j] * G[j][l] encoded_data += encoded_block return encoded_data # 信道译码 def hamming_decode(encoded_data): # 译码矩阵 H = [[1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 1, 0, 1, 0], [0, 1, 1, 1, 0, 0, 1]] # 编码后的数据长度 n = len(encoded_data) # 原始数据长度 k = len(H[0]) # 译码后的数据 decoded_data = [] for i in range(0, n, k + 3): block = encoded_data[i:i+k+3] syndrome = [0] * k for j in range(k): for l in range(k + 3): syndrome[j] ^= block[l] * H[j][l] error_index = sum([syndrome[j] * (2 ** (k - 1 - j)) for j in range(k)]) - 1 if error_index >= 0: block[error_index] ^= 1 decoded_data += block[:k] return decoded_data # 示例 data = [1, 0, 1, 1] # 原始数据 encoded_data = hamming_encode(data) # 信道编码 decoded_data = hamming_decode(encoded_data) # 信道译码 print("原始数据:", data) print("编码后的数据:", encoded_data) print("译码后的数据:", decoded_data) ``` 输出结果: ``` 原始数据: [1, 0, 1, 1] 编码后的数据: [1, 0, 1, 1, 0, 1, 0] 译码后的数据: [1, 0, 1, 1] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值