一、简述
1.通过哈夫曼编码,模拟信源编码
2.通过汉明码编码,模拟信道编码。
3.通过随机产生一位跳变,模拟信道干扰
4.通过汉明码纠错,模拟信道译码
5.哈夫曼译码,完成输出
二、算法思想
详见之前哈夫曼编码,汉明码两篇博客。
三、具体代码
#include<iostream>
#include<math.h>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef unsigned int uint;
uint len(uint n)//返回n位数据的汉明编码长度
{
for(int i=0;i<15;i++)
{
int temp=1;
for(int j=0;j<i;j++)
temp=2*temp;
if(n+i<temp)
return n+i;
}
}
void han(bool *hanming ,int n,int lenn)
{
for(int i=n-1;i>=0;i--)//空出校验位,把数据位向后移动到合适位置
hanming[len(i+1)-1]=hanming[i];//哪怕i取0,也是hanming[2]=hanming[0];
for(uint i=1;i<=lenn;i=i*2)//校验位的得出,是和0001,0010,0100,1000异或后得出的
{
bool jiaoyan=0;
for(uint j=i+1;j<=lenn;j++)//比校验位高一位开始到最高位
{
if(j&i)
jiaoyan^=hanming[j-1];
}
hanming[i-1]=jiaoyan;
}
}
void hanback(bool *hanming,int n,int lenn)
{
bool *temp=new bool[n];
int count=0;int r=0;
for(int i=0;i<lenn;i++)
{
if(i==pow(2,r)-1)
{r=r+1;}
else temp[count++]=hanming[i];
}
for(int i=0;i<n;i++)
hanming[i]=temp[i];
}