📄 modified_ebcot1.c
字号:
n = 6;
}
}
else
{
n = 7;
}
}
else
{
n = 8;
}
break;
case 3:
hv = h + v;
if (!d)
{
if (!hv)
{
n = 0;
}
else if (hv == 1)
{
n = 1;
}
else
{
n = 2;
}
}
else if (d == 1)
{
if (!hv)
{
n = 3;
}
else if (hv == 1)
{
n = 4;
}
else
{
n = 5;
}
}
else if (d == 2)
{
if (!hv)
{
n = 6;
}
else
{
n = 7;
}
}
else
{
n = 8;
}
break;
}
return n;//1+n
}
void init_environment(unsigned int f[BLOCKLENGTH][BLOCKWIDTH],unsigned char
c[BLOCKLENGTH][BLOCKWIDTH],unsigned char state_data_x[BLOCKLENGTH][BLOCKWIDTH])
{
struct entironment_data
{
unsigned a12:1;
unsigned a11:1;
unsigned a10:1;
unsigned a9:1;
unsigned a8:1;
unsigned a7:1;
unsigned a6:1;
unsigned a5:1;
unsigned a4:1;
unsigned a3:1;
unsigned a2:1;
unsigned a1:1;
}state[BLOCKLENGTH][BLOCKWIDTH];
int i,j;
/******************************************************************************
//环境状态变量 d0 v0 d1 a1 a5 a2 a9
h0 x h1 a7 x a8 a11 x a12
d2 v1 d3 a3 a6 a4 a10
******************************************************************************/
state[0][0].a12 = state_data_x[0][1] & 1;
state[0][0].a11 = 0;
state[0][0].a10 = state_data_x[1][0] & 1;
state[0][0].a9 = 0;
state[0][0].a8 = c[0][1] & 1;
state[0][0].a7 = 0;
state[0][0].a6 = c[1][0] & 1;
state[0][0].a5 = 0;
state[0][0].a4 = c[1][1] & 1;
state[0][0].a3 = 0;
state[0][0].a2 = 0;
state[0][0].a1 = 0;
state[0][BLOCKWIDTH-1].a12 = 0;
state[0][BLOCKWIDTH-1].a11 = state_data_x[0][BLOCKWIDTH-1-1] & 1;
state[0][BLOCKWIDTH-1].a10 = state_data_x[1][BLOCKWIDTH-1] & 1;
state[0][BLOCKWIDTH-1].a9 = 0;
state[0][BLOCKWIDTH-1].a8 = 0;
state[0][BLOCKWIDTH-1].a7 = c[0][BLOCKWIDTH-1-1] & 1;
state[0][BLOCKWIDTH-1].a6 = c[1][BLOCKWIDTH-1] & 1;
state[0][BLOCKWIDTH-1].a5 = 0;
state[0][BLOCKWIDTH-1].a4 = 0;
state[0][BLOCKWIDTH-1].a3 = c[1][BLOCKWIDTH-1-1] & 1;
state[0][BLOCKWIDTH-1].a2 = 0;
state[0][BLOCKWIDTH-1].a1 = 0;
state[BLOCKLENGTH-1][0].a12 = state_data_x[BLOCKLENGTH-1][1] & 1;
state[BLOCKLENGTH-1][0].a11 = 0;
state[BLOCKLENGTH-1][0].a10 = 0;
state[BLOCKLENGTH-1][0].a9 = state_data_x[BLOCKLENGTH-1-1][0] & 1;
state[BLOCKLENGTH-1][0].a8 = c[BLOCKLENGTH-1][1] & 1;
state[BLOCKLENGTH-1][0].a7 = 0;
state[BLOCKLENGTH-1][0].a6 = 0;
state[BLOCKLENGTH-1][0].a5 = c[BLOCKLENGTH-1-1][0] & 1;
state[BLOCKLENGTH-1][0].a4 = 0;
state[BLOCKLENGTH-1][0].a3 = 0;
state[BLOCKLENGTH-1][0].a2 = c[BLOCKLENGTH-1-1][1] & 1;
state[BLOCKLENGTH-1][0].a1 = 0;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a12 = 0;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a11 = state_data_x[BLOCKLENGTH-1][BLOCKWIDTH-1-1] & 1;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a10 = 0;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a9 = state_data_x[BLOCKLENGTH-1-1][BLOCKWIDTH-1] & 1;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a8 = 0;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a7 = c[BLOCKLENGTH-1][BLOCKWIDTH-1-1] & 1;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a6 = 0;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a5 = c[BLOCKLENGTH-1-1][BLOCKWIDTH-1] & 1;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a4 = 0;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a3 = 0;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a2 = 0;
state[BLOCKLENGTH-1][BLOCKWIDTH-1].a1 = c[BLOCKLENGTH-1-1][BLOCKWIDTH-1-1] & 1;
for(j=1;j<BLOCKWIDTH-1;j++)
{
state[0][j].a12 = state_data_x[0][j+1] & 1;
state[0][j].a11 = state_data_x[0][j-1] & 1;
state[0][j].a10 = state_data_x[1][j] & 1;
state[0][j].a9 = 0;
state[0][j].a8 = c[0][j+1] & 1;
state[0][j].a7 = c[0][j-1] & 1;
state[0][j].a6 = c[1][j] & 1;
state[0][j].a5 = 0;
state[0][j].a4 = c[1][j+1] & 1;
state[0][j].a3 = c[1][j-1] & 1;
state[0][j].a2 = 0;
state[0][j].a1 = 0;
}
for(j=1;j<BLOCKWIDTH-1;j++)
{
state[BLOCKLENGTH-1][j].a12 = state_data_x[BLOCKLENGTH-1][j+1] & 1;
state[BLOCKLENGTH-1][j].a11 = state_data_x[BLOCKLENGTH-1][j-1] & 1;
state[BLOCKLENGTH-1][j].a10 = 0;
state[BLOCKLENGTH-1][j].a9 = state_data_x[BLOCKLENGTH-1-1][j] & 1;
state[BLOCKLENGTH-1][j].a8 = c[BLOCKLENGTH-1][j+1] & 1;
state[BLOCKLENGTH-1][j].a7 = c[BLOCKLENGTH-1][j-1] & 1;
state[BLOCKLENGTH-1][j].a6 = 0;
state[BLOCKLENGTH-1][j].a5 = c[BLOCKLENGTH-1-1][j] & 1;
state[BLOCKLENGTH-1][j].a4 = 0;
state[BLOCKLENGTH-1][j].a3 = 0;
state[BLOCKLENGTH-1][j].a2 = c[BLOCKLENGTH-1-1][j+1] & 1;
state[BLOCKLENGTH-1][j].a1 = c[BLOCKLENGTH-1-1][j-1] & 1;
}
for(i=1;i<BLOCKLENGTH-1;i++)
{
state[i][0].a12 = state_data_x[i][1] & 1;
state[i][0].a11 = 0;
state[i][0].a10 = state_data_x[i+1][0] & 1;
state[i][0].a9 = state_data_x[i-1][0] & 1;
state[i][0].a8 = c[i][1] & 1;
state[i][0].a7 = 0;
state[i][0].a6 = c[i+1][0] & 1;
state[i][0].a5 = c[i-1][0] & 1;
state[i][0].a4 = c[i+1][1] & 1;
state[i][0].a3 = 0;
state[i][0].a2 = c[i-1][1] & 1;
state[i][0].a1 = 0;
}
for(i=1;i<BLOCKLENGTH-1;i++)
{
state[i][BLOCKWIDTH-1].a12 = 0;
state[i][BLOCKWIDTH-1].a11 = state_data_x[i][BLOCKWIDTH-1-1] & 1;
state[i][BLOCKWIDTH-1].a10 = state_data_x[i+1][BLOCKWIDTH-1] & 1;
state[i][BLOCKWIDTH-1].a9 = state_data_x[i-1][BLOCKWIDTH-1] & 1;
state[i][BLOCKWIDTH-1].a8 = 0;
state[i][BLOCKWIDTH-1].a7 = c[i][BLOCKWIDTH-1-1] & 1;
state[i][BLOCKWIDTH-1].a6 = c[i+1][BLOCKWIDTH-1] & 1;
state[i][BLOCKWIDTH-1].a5 = c[i-1][BLOCKWIDTH-1] & 1;
state[i][BLOCKWIDTH-1].a4 = 0;
state[i][BLOCKWIDTH-1].a3 = c[i+1][BLOCKWIDTH-1-1] & 1;
state[i][BLOCKWIDTH-1].a2 = 0;
state[i][BLOCKWIDTH-1].a1 = c[i-1][BLOCKWIDTH-1-1] & 1;
}
for(i=1;i<BLOCKLENGTH-1;i++)
{
for(j=1;j<BLOCKWIDTH-1;j++)
{
state[i][j].a12 = state_data_x[i][j+1] & 1;
state[i][j].a11 = state_data_x[i][j-1] & 1;
state[i][j].a10 = state_data_x[i+1][j] & 1;
state[i][j].a9 = state_data_x[i-1][j] & 1;
state[i][j].a8 = c[i][j+1] & 1;
state[i][j].a7 = c[i][j-1] & 1;
state[i][j].a6 = c[i+1][j] & 1;
state[i][j].a5 = c[i-1][j] & 1;
state[i][j].a4 = c[i+1][j+1] & 1;
state[i][j].a3 = c[i+1][j-1] & 1;
state[i][j].a2 = c[i-1][j+1] & 1;
state[i][j].a1 = c[i-1][j-1] & 1;
}
}
for(i=0;i<BLOCKLENGTH;i++)
{
for(j=0;j<BLOCKWIDTH;j++)
{
f[i][j] |= state[i][j].a12<<11;
f[i][j] |= state[i][j].a11<<10;
f[i][j] |= state[i][j].a10<<9;
f[i][j] |= state[i][j].a9<<8;
f[i][j] |= state[i][j].a8<<7;
f[i][j] |= state[i][j].a7<<6;
f[i][j] |= state[i][j].a6<<5;
f[i][j] |= state[i][j].a5<<4;
f[i][j] |= state[i][j].a4<<3;
f[i][j] |= state[i][j].a3<<2;
f[i][j] |= state[i][j].a2<<1;
f[i][j] |= state[i][j].a1<<0;
}
}
}
/******************************************************************************
环境状态变量
输入是orient代表LL LH HL HH四个子带中的一个子带的数据,c代表的是重要性状态标志位
函数返回0---9之间的变量
//环境状态变量 d0 v0 d1 a1 a5 a2
h0 x h1 a7 x a8
d2 v1 d3 a3 a6 a4
******************************************************************************/
unsigned char init_sign(unsigned int f, unsigned char sign)
{
int hc;
int vc;
int n;
int v0,v1,h0,h1;
unsigned char sign_v0,sign_v1,sign_h0,sign_h1;
/* Avoid compiler warning. */
n = 0;
h0 = ((f & 0x40) != 0); //7
h1 =((f & 0x80) != 0);//8
v0 = ((f & 0x10) != 0); //5
v1 = ((f & 0x20) != 0);//6
sign_h0 = ((f & 0x400) != 0);//11
sign_h1 =((f & 0x800) != 0); //12
sign_v0 = ((f & 0x100) != 0);//9
sign_v1 = ((f & 0x200) != 0);//10
if(sign_h0 == 1)//符号位是负
{
h0 = -h0;
}
if(sign_h1 == 1)//符号位是负
{
h1 = -h1;
}
if(sign_v0 == 1)//符号位是负
{
v0 = -v0;
}
if(sign_v1 == 1)//符号位是负
{
v1 = -v1;
}
assert(h0>=-1 && h0<=1 && h1>=-1 && h1<=1 && v0>=-1 && v0<=1 && v1>=-1 && v1<=1);
//垂直
if((v0==0 && v1==0) || (v0==1 && v1==-1) || (v0==-1 && v1==1))
{
vc = 0;
}
if((v0==1 && v1==1) || (v0==0 && v1==1) || (v0==1 && v1==0))
{
vc = 1;
}
if((v0==-1 && v1==-1) || (v0==0 && v1==-1) || (v0==-1 && v1==0))
{
vc = -1;
}
// 水平
if((h0==0 && h1==0) || (h0==1 && h1==-1) || (h0==-1 && h1==1))
{
hc = 0;
}
if((h0==1 && h1==1) || (h0==0 && h1==1) || (h0==1 && h1==0))
{
hc = 1;
}
if((h0==-1 && h1==-1) || (h0==0 && h1==-1) || (h0==-1 && h1==0))
{
hc = -1;
}
//完成极性编码的水平垂直领域指标
if (hc == 1)
{
if(vc == 1)
n = 13;
if(vc == 0)
n = 12;
if(vc == -1)
n= 11;
}
if (hc == 0)
{
if(vc == 1)
n = 10;
if(vc == 0)
n = 9;
if(vc == -1)
n= 10;
}
if (hc == -1)
{
if(vc == 1)
n = 11;
if(vc == 0)
n = 12;
if(vc == -1)
n= 13;
}
assert(n < 14);
return n;
}
/******************************************************************************
幅值细化扫描环境状态字
函数返回14---16之间的变量
//环境状态变量 d0 v0 d1 a1 a5 a2
h0 x h1 a7 x a8
d2 v1 d3 a3 a6 a4
******************************************************************************/
unsigned char init_magnitude(unsigned int f,unsigned char sign)
{
char h;
char d;
char v;
char n;
char hv;
// Avoid compiler warning.
n = 0;
h = ((f & 0x40) != 0) + ((f & 0x80) != 0);//7 8
v = ((f & 0x10) != 0) + ((f & 0x20) != 0);//5 6
d = ((f & 0x01) != 0) + ((f & 0x02) != 0) + ((f & 0x04) != 0) + ((f & 0x08) != 0);
//
hv = h + v + d;
if(sign)
n=16;
else
{
if(hv == 0)
n = 14;
if(hv >= 1)
n = 15;
}
return n;//1+n
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -