📄 uvlc.cpp
字号:
#include "UVLC.h"
#include "stdlib.h"
#include "stdio.h"
#include "sim_system.h"
#include "init_UVLC.h"
#include "sim_config.h"
#include "conio.h"
#define MAXF 1e10
#define PI 3.1415926
#define DBG 0
void UVLCGen1()
{
int comp, mask;
int L,INFO;
int l=1,code_number;
int temp=2;
sys_UVLC.code[0][0]=1; //VLC code table code_number = 0,1,2
sys_UVLC.code[0][1]=1;
sys_UVLC.code[1][0]=3;
sys_UVLC.code[1][1]=0;
sys_UVLC.code[1][2]=0;
sys_UVLC.code[1][3]=1;
sys_UVLC.code[2][0]=3;
sys_UVLC.code[2][1]=0;
sys_UVLC.code[2][2]=1;
sys_UVLC.code[2][3]=1;
for(int i=3;i<sys_UVLC.alphabet_size;i++) // code_number>=3
{
mask=1;
code_number=i;
while(temp<code_number){ //H.26L VLC
l++;
temp+=twotothe(l);
}
L=l+l+1;
printf(" %d",L);
INFO=code_number+1-twotothe(l);
sys_UVLC.code[i][0]=L;
//mask << (l-1);
mask = mask * twotothe(l-1);
for(int j=1;j<=l;j++)
{
sys_UVLC.code[i][2*j-1]=0;
// printf("%d",sys_UVLC.code[i][2*j-1]);
comp=mask & INFO; // pick-up the most significant bit
if(comp>0)
sys_UVLC.code[i][2*j]=1;
else sys_UVLC.code[i][2*j]=0;
// printf("%d",sys_UVLC.code[i][2*j]);
//INFO << 1;
INFO = INFO * 2;
}
sys_UVLC.code[i][L]=1; // output the last 1 bit, and finish the encoding process
// printf("%d\n",sys_UVLC.code[i][L]);
}
}
void UVLCGen2()
{
int i,j,nn;
int len, INFO,suffix_len;
unsigned int temp,mask;
for(i=0;i<sys_UVLC.alphabet_size;i++)
{
nn=(i+1)/2;
for(j=0;j<sys_UVLC.alphabet_size && nn!=0;j++)
{
nn/=2;
}
len=2*j+1;
INFO=i+1-(int)pow(2,j);
suffix_len=len/2;
sys_UVLC.code[i][0]=len; //length
// printf("%d= %d\t",i,sys_UVLC.code[i][0]);
temp=(1<<suffix_len)|(INFO&((1<<suffix_len)-1));
mask = 1 << (len -1);
for(j=0;j<len;j++)
{
if(temp & mask) sys_UVLC.code[i][j+1]=1;
else sys_UVLC.code[i][j+1]=0;
mask >>= 1;
// printf("%d ",sys_UVLC.code[i][j+1]);
}
// printf("\n");
}
}
void FLCGen1()
{
int i,j;
sys_UVLC.code[0][0]=3;
sys_UVLC.code[0][1]=0;
sys_UVLC.code[0][2]=0;
sys_UVLC.code[0][3]=0;
sys_UVLC.code[1][0]=3;
sys_UVLC.code[1][1]=1;
sys_UVLC.code[1][2]=1;
sys_UVLC.code[1][3]=1;
sys_UVLC.code[2][0]=3;
sys_UVLC.code[2][1]=0;
sys_UVLC.code[2][2]=1;
sys_UVLC.code[2][3]=0;
sys_UVLC.code[3][0]=3;
sys_UVLC.code[3][1]=1;
sys_UVLC.code[3][2]=0;
sys_UVLC.code[3][3]=1;
for(i=0;i<sys_UVLC.alphabet_size;i++)
{
printf("%d= %d\t",i,sys_UVLC.code[i][0]);
for(j=0;j<3;j++) printf("%d ",sys_UVLC.code[i][j+1]);
printf("\n");
}
}
void FLCGen2()
{
int i,j;
sys_UVLC.code[0][0]=2;
sys_UVLC.code[0][1]=0;
sys_UVLC.code[0][2]=0;
//sys_UVLC.code[0][3]=0;
sys_UVLC.code[1][0]=2;
sys_UVLC.code[1][1]=1;
sys_UVLC.code[1][2]=1;
//sys_UVLC.code[1][3]=1;
sys_UVLC.code[2][0]=2;
sys_UVLC.code[2][1]=0;
sys_UVLC.code[2][2]=1;
//sys_UVLC.code[2][3]=0;
sys_UVLC.code[3][0]=2;
sys_UVLC.code[3][1]=1;
sys_UVLC.code[3][2]=0;
//sys_UVLC.code[3][3]=1;
for(i=0;i<sys_UVLC.alphabet_size;i++)
{
printf("%d= %d\t",i,sys_UVLC.code[i][0]);
for(j=0;j<2;j++) printf("%d ",sys_UVLC.code[i][j+1]);
printf("\n");
}
}
int UVLCEncoder(FILE *fp,int k,int i,int m)
{
//int sym;
int j;
sys_UVLC.encoded[m]=fgetc(fp);
for(j=0;j<sys_UVLC.code[sys_UVLC.encoded[m]][0];j++)
{
sys_spt.source_bits[k++]=sys_UVLC.code[sys_UVLC.encoded[m]][j+1];
}
sys_UVLC.bpl[i]+=sys_UVLC.code[sys_UVLC.encoded[m]][0];
return k;
}
void UVLCDecoder(FILE *fp,int block_num)
{
int count;
int i,j,rank,m,n,d;
double min,t_cost,f2;
int bits;
int dec,ran;
int decst,ranst;
int flag;
double len_modi,c,sum=0;
// double temp,N0,N1;
int k1;
// int BPSK;
double p=(BSC_P/10);
double *co;
// sys_spt.noisevar = 1/(2*sys_spt.code_rate*pow(10,(sys_spt.EbNo+2)/10.));
// N0=2*sys_spt.noisevar;
// N1=sys_spt.noisevar/2.0;
//printf("test point1 passed successfully!\n"); // test point1
// sys_spt.noisevar = 1/(2*sys_spt.code_rate*pow(10,(sys_spt.EbNo+2)/10.));
/* for(i=0;i<sys_spt.message_bits;i++)
{
sys_UVLC.received[i] = sys_UVLC.received[i]*N1;
}
*/
for(i=0;i<sys_UVLC.bpl[block_num];i++)
{
sys_UVLC.received[i] = sys_spt.received[i];
}
for(i=0;i<sys_UVLC.alphabet_size;i++)
for(j=0;j<sys_UVLC.BESTC;j++)
{
sys_UVLC.cost_o[i][j]=MAXF;
sys_UVLC.used_bits_old[i][j]=0;
}
sys_UVLC.cost_o[0][0]=0.0;
co=dvector(0,sys_UVLC.maxin);
for(i=0;i<sys_UVLC.maxin+1;i++)
if(p==0.)
co[i]=(double)(i)*(-1000.0);
else
co[i]=(double)(i)*log10(p/(1-p));
//printf("test point2 passed successfully!\n"); // test point2
for(count=0;count<256;count++)
{
for (i=0;i<sys_UVLC.alphabet_size;i++)
{
for(m=0;m<sys_UVLC.alphabet_size;m++)
for(n=0;n<sys_UVLC.BESTC;n++)
sys_UVLC.cost_t[m][n]=sys_UVLC.cost_o[m][n];
for(rank=0;rank<sys_UVLC.BESTC;rank++)
{
min = MAXF;
for(k1=0; k1<(rank+1);k1++)
for (j=0;j<sys_UVLC.alphabet_size;j++)
{
if(sys_UVLC.cost_t[j][k1]!=MAXF)
{
/* c=0;
for(bits=0;bits<sys_UVLC.code[i][0];bits++)
{
// sys_UVLC.word[bits]=sys_UVLC.received[sys_UVLC.used_bits_old[j][k1]+bits];
if(sys_UVLC.code[i][bits+1]==0) BPSK=1;
else BPSK=-1;
temp = -((sys_UVLC.received[sys_UVLC.used_bits_old[j][k1]+bits]-BPSK)*(sys_UVLC.received[sys_UVLC.used_bits_old[j][k1]+bits]-BPSK))/N0;
//temp = -((sys_UVLC.word[bits]-BPSK)*(sys_UVLC.word[bits]-BPSK))/N0;
temp = log10((double)1/(sqrt(PI*N0))*exp(temp));
c += temp;
}
*/
d=0;
for(bits=0;bits<sys_UVLC.code[i][0];bits++)
{
sys_UVLC.word[bits]=sys_UVLC.received[sys_UVLC.used_bits_old[j][k1]+bits];
if(sys_UVLC.word[bits]!=sys_UVLC.code[i][bits+1])
d++;
}
len_modi=(double)(sys_UVLC.code[i][0])*log10(2.0);
f2=(double)(sys_UVLC.code[i][0])*log10(1-p);
c=co[d]+f2;
t_cost=sys_UVLC.cost_t[j][k1]+sys_UVLC.hist1[i][j]-c-len_modi;
/* for(bits=0;bits<sys_UVLC.code[i][0];bits++)
{
sys_UVLC.word[bits]=sys_UVLC.received[sys_UVLC.used_bits_old[j][k1]+bits];
d=(sys_UVLC.word[bits]-sys_UVLC.code[i][bits+1]);
sum=sum+d;;
}
t_cost=sys_UVLC.cost_t[j][k1]+sum;
printf("t_cost=%d ",t_cost);
sum=0;
*/
if (t_cost < min )
{
min=t_cost;
dec=j;
ran=k1;
}
}
}
sys_UVLC.cost_t[dec][ran]=MAXF;
sys_UVLC.cost_n[i][rank]=min;
sys_UVLC.history[i][count][rank][0]=dec;
sys_UVLC.history[i][count][rank][1]=ran;
sys_UVLC.used_bits_new[i][rank]=sys_UVLC.used_bits_old[dec][ran]+sys_UVLC.code[i][0];
}
}
for (i=0;i<sys_UVLC.alphabet_size;i++)
for(j=0;j<sys_UVLC.BESTC;j++)
{
sys_UVLC.cost_o[i][j]=sys_UVLC.cost_n[i][j];
sys_UVLC.used_bits_old[i][j]=sys_UVLC.used_bits_new[i][j];
}
}
// printf("test point3 passed successfully!\n"); // test point3
min=MAXF;
flag=0;
for (i=0;i<sys_UVLC.alphabet_size;i++)
for(j=0;j<sys_UVLC.BESTC;j++)
{
if (sys_UVLC.cost_o[i][j]<min && (sys_UVLC.used_bits_new[i][j]==sys_UVLC.bpl[block_num]))
{
min=sys_UVLC.cost_o[i][j];
dec=i;ran=j;flag=1;
}
}
if(flag==0)
{
min=MAXF;
for (i=0;i<sys_UVLC.alphabet_size;i++)
for(j=0;j<sys_UVLC.BESTC;j++)
{
if (sys_UVLC.cost_o[i][j]<min)
{
min=sys_UVLC.cost_o[i][j];
dec=i;ran=j;
}
}
}
sys_UVLC.decoded[255]=dec;
rank=ran;
for(i=255;i>0;i--)
{
decst=sys_UVLC.history[dec][i][ran][0];
ranst=sys_UVLC.history[dec][i][ran][1];
dec=decst;ran=ranst;
sys_UVLC.decoded[i-1]=dec;
}
if(DBG)
{
for(i=0;i<255;i++)
{
printf("%d\t",sys_UVLC.decoded[i]);
//fputc(sys_UVLC.decoded[i],fo);
}
}
for(i=0;i<256;i++)
putc(sys_UVLC.decoded[i],fp);
}
void UVLCDecoderOut(FILE *ft,int i)
{
int remain;
int j,in_cnt=0,out_cnt=0;
int found,len;
int max_num = 1;
sys_UVLC.remain = ivector(0,sys_spt.message_bits*3-1);
remain = sys_UVLC.bpl[i];
// else
{
for(j=0;j<remain;j++)
sys_UVLC.remain[j]=sys_spt.source_bits_out[j];
while(remain>0)
{
for(j=0;j<remain;j++)
sys_UVLC.remain[j]=sys_spt.source_bits_out[j+in_cnt];
found=-1; len=0;
while((found==-1)&(len<remain))
{
len++;
found=SearchTable(sys_UVLC.remain,len);
}
if (found==-1) found = max_num;
sys_UVLC.decoded[out_cnt] = found;
out_cnt++;
remain -= len;
in_cnt += len;
}
}
if(out_cnt<256)
{
for(j=out_cnt;j<256;j++)
sys_UVLC.decoded[j]=1;//sys_UVLC.decoded[out_cnt];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -