2008年10月13日星期一

一个正确的DF程序

经过一段时间的修改和调试,最终发现是CRC(循环冗余校验码)编解码程序有问题,在PUDN上面下了另外一个CRC编解码程序,同时增大实验次数,最终的到了理想的误码率曲线,由于程序运行时间比较长(30000s+),还没有和非协作情况进行比较,但可以想象到其性能应该要比非协作情况要好。这样的DF程序经过改造就可以用到各种形式的协作中。下图就是所得到的误码率曲线:
主程序代码为:
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %10/13/2008     zhangsong
 %一个具有差错检测的DF仿真程序
 %用了另外一个CRC编解码程序
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
echo off;clear all;close all;clc;
tic
N=1000;
L=65;    %一帧长度
BerSnrTable=zeros(20,5);
for snr=0:25
    BerSnrTable(snr+1,1) = snr;
    sig=1/sqrt(10^(snr/10));
    temp=0;
    temp1=0;
    for i=1:N
        BitsTx = floor(rand(1,L)*2);
        BitsTxcrc=CrcEncode(BitsTx);
        BitsTxcnv=cnv(BitsTxcrc);
        Mod8Tx=mod_8psk(BitsTxcnv);
        M=length(Mod8Tx);
        %以下为假设信道模型和噪声模型,由于本次仿真重点不在于此,所以做以下简化
        H1d=randn(1,M)+j*randn(1,M);
        H12=randn(1,M)+j*randn(1,M);
        H2d=randn(1,M)+j*randn(1,M);
        Z1d=randn(1,M)+j*randn(1,M);
        Z12=randn(1,M)+j*randn(1,M);
        Z2d=randn(1,M)+j*randn(1,M);
        % d接收
        Y1d=H1d.*Mod8Tx+sig*Z1d;
        %user2接收并解码
        Y12=H12.*Mod8Tx+sig*Z12;
        R12=conj(H12).*Y12;
        BitR12=demod_8psk(R12);
        BitR12viterbi=viterbi(BitR12);
        BitR12viterbi=BitR12viterbi(1:length(BitR12viterbi)-1);
        [BitR12decrc,error]=CrcDecode(BitR12viterbi);
         %error=0,正确解码   error=1,错误解码
         %非协作情况
        if(error==1)
            R1d=conj(H1d).*Y1d; 
            BitR1d=demod_8psk(R1d);
            BitR1dviterbi=viterbi(BitR1d);
            BitR1dviterbi=BitR1dviterbi(1:length(BitR1dviterbi)-1);
            BitR1ddecrc=CrcDecode(BitR1dviterbi);
            [Num,Ber] = symerr(BitR1ddecrc,BitsTx);
            BerSnrTable(snr+1,2)=BerSnrTable(snr+1,2)+Num;
        end
         %协作情况
        if(error==0)
            Bits2d=BitR12decrc;
            Bits2dcrc=CrcEncode(Bits2d);
            Bits2dcnv=cnv(Bits2dcrc);
            Mod8_2d=mod_8psk(Bits2dcnv);
            Y2d=H2d.*Mod8_2d+sig*Z2d;
            %最大合并比在此处的简化形式
            Rd=conj(H2d).*Y2d+conj(H1d).*Y1d;
            BitRd=demod_8psk(Rd);
            BitRdviterbi=viterbi(BitRd);
            BitRdviterbi=BitRdviterbi(1:length(BitRdviterbi)-1);
            BitRddecrc=CrcDecode(BitRdviterbi);
            [Num,Ber] = symerr(BitRddecrc,BitsTx);
            BerSnrTable(snr+1,2)=BerSnrTable(snr+1,2)+Num;
            temp=temp+1;
        end   
    end
    BerSnrTable(snr+1,3)=BerSnrTable(snr+1,2)/(L*N);  %此处将M改成N
    BerSnrTable(snr+1,4)=temp;
end   
semilogy(BerSnrTable(:,1),BerSnrTable(:,3),'r*-');
figure
semilogy(BerSnrTable(:,1),BerSnrTable(:,4),'g*-');
time_of_sim = toc
echo on;
 

其中CrcEncode函数代码为:
% 采用美国16-CRC标准
% 输入msg为要进行编码的码源
% 输出encode为已经完成CRC编码的输出
% 16bit CRC 生成多项式D16+D1+D2+1
function [encode]= CrcEncode( msg )

% generator polynomial

generator = [1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1]; % 16bit CRC 生成多项式D16+D12+D5+1

c = [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]; % x^k

multip = conv(c,msg); % 对序列乘以x^16,表示左移16个0
[divid, remainder]=deconv(multip,generator);    % 对多项式的除,就等于做反卷积
remainder=mod(remainder(end-15:end),2); % 对除法的余数做模二运算
encode=[msg,remainder]; % 只是在原序列后面加上CRC码

CrcDecode函数代码为:
% 采用美国16-CRC标准
% 16bit CRC 生成多项式D16+D1+D2+1
% 输入code为要进行解码的码源
% 返回值sign是指示是否出现错误1为有错,0为无错
% 如果正确 指示0 并解码,decode 为解码后的码
function [decode,sign] =CrcDecode(code)
generator = [1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1]; % 16bit CRC 生成多项式D16+D15+D2+1
[divid, remainder]=deconv(code,generator); % 对多项式的除,就等于做反卷积
 remainder=mod(remainder(end-15:end),2); % 对除法的余数做模二运算
 if isequal(remainder,[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]);
     sign=0;% 如果正确 指示0 并解码
     decode=code(1:end-16);
 %    msgbox(['CRC[',num2str(code(end-16:end)),']校验正确!']);
 else
     sign=1;
     decode=code(1:end-16);
     
  % msgbox(['CRC校验错误:[',num2str(remainder),']']);
 end


2 条评论:

阿宏 说...

你好!在你这里下了你的"一个正确的DF程序"相关的代码,想请教您几个问题:您能解答一下么??谢谢!
1)是不是运行DFadvanced.m就能得到你提供的那两个图啊??但是我就没有结果呢??是不是要要输入说明参数啊??还有你能不能跟我讲讲这个程序的流程啊??(因为刚来学习用Matlab,不是很了解)
2)还有你以下的几个程序不是很明白是做说明用的?能解释以下么??包括:cnv.m、viterbi.m(参数channel_output格式是怎么样的呢?)、metric.m、RayleighCH(好像在这个仿真中没有上对么?)、

谢谢你了。

阿宏 说...

RayleighCH.m根据论文《改进型JAKES模型在OFDM系统中的仿真》编写的信道模型

请问以下这篇文章的作者是不是:夏 站,朱晓明,张海涛啊?还是其他的呢??谢谢