联系方式

  • QQ:99515681
  • 邮箱:99515681@qq.com
  • 工作时间:8:00-21:00
  • 微信:codinghelp

您当前位置:首页 >> C/C++编程C/C++编程

日期:2018-06-21 02:57


#include <iostream>

#include <fstream>

#include <string>

#include <cmath>

#include <time.h>

using namespace std;

const int n=7,k=4,r=3;

class HMCoding{

private:

int H[r][n],**G;

string H_Column[n+1];

int source_num;

string binary_data,coded_data;

char*received_data,**check_code;


void Show_H(int , int);

void Get_G();

void Show_G(int,int);

void Get_H_Column();//获取汉明码监督矩阵的每一列


public:

HMCoding( int num, string str)

{

source_num= num;

binary_data=str;

};

~HMCoding()

{

delete[]G;

delete[]received_data;

delete[]check_code;

};

void Initializing();

void Encoding();//汉明码编码

void BSC();

void Checking();//汉明码校码

void Decoding();//汉明码译码

};





//汉明码算法初始化模块




void HMCoding::Initializing()

{

int h[r][n]={

1,1,1,0,1,0,0,

1,1,0,1,0,1,0,

1,0,1,1,0,0,1};

for(int i=0;i<r;i++)

for(int j=0;j<n;j++)

H[i][j]=h[i][j];


cout<<"监督矩阵 H["<<n-k<<"]["<<n<<"]为:"<<endl;

Show_H(n-k,n);

cout<<"该监督矩阵对应的生成矩阵 G["<<k<<"]["<<n<<"]为:"<<endl;

Show_G(k,n);


Get_H_Column();//获取监督矩阵的每一列

}


//获取监督矩阵的每一列,用于汉明码校码

void HMCoding::Get_H_Column()

{

int i,j;

string temp;

for(i=0;i<n;i++)

{

temp="";

for(j=0;j<r;j++)

{

if(!H[j][i])

temp +=(char)0;

else

temp +=(char)1;

}

H_Column[i]=temp;

}

temp="";

for(j=0;j<r;j++)

temp +=(char)0;

H_Column[n]=temp;

}

void HMCoding::Show_H(int x,int y)

{

for(int i=0;i<x;i++)

{

for(int j=0;j<y;j++)

cout<<H[i][j]<<" ";

cout<<endl;

}

}

void HMCoding::Get_G()

{

G=new int *[k];

for(int i=0;i<k;i++)

G[i]= new int[n];

for(int i=0;i<k;i++)

for(int j=0;j<k;j++)

{

if(i==j)

G[i][j]=1;

else

G[i][j]=0;

}

for(int i=0;i<r;i++)

for(int j=0;j<k;j++)

G[j][i+k]=H[i][j];

}

void HMCoding::Show_G(int x,int y)

{

Get_G();

for(int i=0;i<x;i++)

{

for(int j=0;j<y;j++)

cout<<G[i][j]<<"";

cout<<endl;

}

}



//汉明码模块




void HMCoding::Encoding()

{

cout<<"进行("<<n<<","<<k<<")汉明码编码前的二进制序列为:"<<endl;

for(int i=0;i<source_num*k;i++)

cout<<(int)binary_data[i];

cout<<endl;

int*X;

X=new int[n+1];

for(int j=0;j<n+1;j++)

X[j]=0;


coded_data="";

for(int i=0;i<source_num*k;i=i+k)

{

for(int j=0;j<k;j++)   //获取k位信息元

{

if(binary_data[i+j]==0)    //‘0’

X[j]=0;

else

X[j]=1;

}

int temp;

string partial_str="";

for(int t=0;t<n;t++)

{//用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组

temp=0;

for(int j=0;j<k;j++)

temp +=X[j]*G[j][t];

if(temp%2==0)

partial_str +=(char)0;//'0'

else

partial_str +=(char)1;//'1'

}

coded_data +=partial_str;

}

delete []X;


cout<<"进行("<<n<<","<<k<<")汉明码编码后的二进制序列为:"<<endl;

for(int i=0;i<source_num*n;i++)

cout<<(int)coded_data[i];

cout<<endl;

}




//利用汉明码校码



void HMCoding::Checking()

{

int i,j;

check_code=new char*[source_num];

for(i=0;i<source_num;i++)

check_code[i]=new char[n];

for(i=0;i<source_num;i++)

{//每次取n个码元进行校正

for(j=0;j<n;j++)

{

check_code[i][j]=received_data[i*n+j];

}

}


int temp;

int flag;

string partial_str;

cout<<"("<<n<<","<<k<<")汉明码校码结果如下:"<<endl;

cout<<"接受码组            状态                      校正后"<<endl;

for(int t=0;t<source_num;t++)

{

flag=0;

partial_str="";

for(i=0;i<r;i++)

{

temp=0;

for(j=0;j<n;j++)

temp +=H[i][j]*check_code[t][j];

if(temp%2==0)

partial_str +=(char)0;

else

partial_str +=(char)1;

}

//对partial_str进行判断

for(i=0;i<n+1;i++)

{

if(H_Column[i]==partial_str)

{

flag=1;

break;

}

}

if(flag&&i<n)//表示第i个码元出错,将其改正

{

for(j=0;j<n;j++)

cout<<(int)check_code[t][j];

cout<<"         第"<<i+1<<"位错,可纠正              ";

check_code[t][i]=(check_code[t][i]+1)%2;//1变0,0变1

for(j=0;j<n;j++)

cout<<(int)check_code[t][j];

}

if(flag&&i==n)//表示全对

{

for(j=0;j<n;j++)

cout<<(int)check_code[t][j];

cout<<"             全对                     ";

for(j=0;j<n;j++)

cout<<(int)check_code[t][j];

}

cout<<endl;

}

}

//译码

void HMCoding::Decoding()

{

int i,j;

int *decode_data=new int[source_num];


cout<<"("<<n<<","<<k<<")汉明码译码结果为:"<<endl;

for(i=0;i<source_num;i++)

{

decode_data[i]=0;

for(j=0;j<k;j++)

{

cout<<(int)check_code[i][j];

decode_data[i] += check_code[i][j]<<(k-1-j);

}

}

cout<<endl;


for (i=0;i<source_num;i++)

cout<<hex<<decode_data[i];

cout<<endl;

delete[]decode_data;

}




//模拟信道错误




void HMCoding::BSC()

{

int r_num=source_num*n;

received_data=new char[r_num];


srand((unsigned)time(NULL));

for(int i=0;i<r_num;i++)

if((rand()/(double)RAND_MAX)<0.07)                    //误码率为7%

received_data[i]=(~coded_data[i])&0x01;           //若有错,则0变1,1变0

else

received_data[i]=coded_data[i];

}





int main()

{

int count=0;

string s="";


char filename[80];

cout<<"请输入要传输的源文件:";

cin>>filename;

int x;

char c;

ifstream ifile(filename,ios::binary);

while(ifile>>c)

{//简单的信源编码,从文件中读取字符,把ASCII码转化为数。

if(c>='0'&&c<='9')

x=c-0x30;

else if(c>='A'&&c<='F')

x=c-0x41+10;

else if(c>='a'&&c<='f')

x=c-0x61+10;

else

{

x=-1;

cout<<"跳过非法字符";

}


if(x>=0)

{

cout<<hex<<x;

count ++;

for(int i=0;i<k;i++)

{//每一位0~a的数用4bit表示,构造一个二进制序列。

int n=x;

n=n>>(k-1-i);

s +=n&0x01;

}

}

}

cout<<endl;

if(count<=0)

{

cout<<"输入文件不正确,没有读取到合法字符"<<endl;

return 0;

}


HMCoding hm74(count,s);

hm74.Initializing();


cout<<endl<<"使用汉明码的情况:对文件中的内容进行编码->模拟信道(可能有错误)->对接收到的内容进行纠码、译码"<<endl<<endl;

hm74.Encoding();

hm74.BSC();

hm74.Checking();

hm74.Decoding();

system ("pause");

return 0;

}





版权所有:编程辅导网 2021 All Rights Reserved 联系方式:QQ:99515681 微信:codinghelp 电子信箱:99515681@qq.com
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。 站长地图

python代写
微信客服:codinghelp