📄 fdwt.c
字号:
// fwrite(&buffer[i][j], 1,1,out);
// }
// fclose(out);
#endif
}
//#ifdef fdwt
// for(i = 0;i<LENGTH;i++)
// for(j = 0;j<WIDTH;j++)
// {
// // fwrite(&interleave[i+4][j+4], 4,1,inter);
// fprintf(inter,"%x",&interleave[i+4][j+4]);
// }
//
//#endif
}
/******************************************************************************
以下是逆变换
******************************************************************************/
void ldwt(float buffer[LENGTH+8][WIDTH+8],float interleave[LENGTH+8][WIDTH+8],
float bufferout[LENGTH+8][WIDTH+8])
{
int i,j,level;
float lifting_factors[5];
lifting_factors[0] = (float) -1.586134342;
lifting_factors[1] = (float) -0.052980118;
lifting_factors[2] = (float) 0.882911075;
lifting_factors[3] = (float) 0.443506852;//
lifting_factors[4] = (float) 1.230174105;//k
level = LEVEL-1;
// level = 0;
for(;level>-1;level--)
{
for(i = 0;i<(LENGTH>>(level+1));i++)//行128 0--64
{
for(j = 0;j<(WIDTH>>(level+1));j++)//列512 00--256
{
bufferout[i+4][j+4] = floor(buffer[i+4][j+4]+0.5);
bufferout[i+(LENGTH>>(level+1))+4][j+4] =
floor(interleave[i+(LENGTH>>(level+1))+4][j+4]+0.5); //
bufferout[i+4][j+(WIDTH>>(level+1))+4] =
floor(interleave[i+4][j+(WIDTH>>(level+1))+4]+0.5); //
bufferout[i+(LENGTH>>(level+1))+4][j+(WIDTH>>(level+1))+4] =
floor(interleave[i+(LENGTH>>(level+1))+4][j+(WIDTH>>(level+1))+4]+0.5); //
}
}
/*****************************************************************************
反解交织 buffer[i+4][j+4] = LL //偶数行偶数列
buffer[i+5][j+5] = HL //奇数行偶数列
buffer[i+4][j+5] = LH //偶数行奇数列
buffer[i+5][j+5] = HH //奇数行奇数列
*****************************************************************************/
for(i = 0;i<LENGTH/(1<<(level+1));i++)//行128 0--64
{
for(j = 0;j<WIDTH/(1<<(level+1));j++)//列512 00--256
{
buffer[i*2+5][j*2+5] = bufferout[i+4][j+4]; //偶数行偶数列
buffer[i*2+4][j*2+5] = bufferout[i+4][j+WIDTH/(1<<(level+1))+4]; //奇数行偶数列
buffer[i*2+5][j*2+4] = bufferout[i+LENGTH/(1<<(level+1))+4][j+4]; //偶数行奇数列
buffer[i*2+4][j*2+4] =
bufferout[i+LENGTH/(1<<(level+1))+4][j+WIDTH/(1<<(level+1))+4];// 奇数行奇数列
}
}
/******************************************************************************
反解交织完成。以下是行的逆变换。
******************************************************************************/
for(j = 0;j<WIDTH/(1<<level);j++)
{// 0 1 2 3 4 5 6 7 8
buffer[0][j+4] = buffer[8][j+4];
buffer[1][j+4] = buffer[7][j+4];
buffer[2][j+4] = buffer[6][j+4];
buffer[3][j+4] = buffer[5][j+4];
//134=128 133=129 132=130
buffer[LENGTH/(1<<level)+4][j+4] = buffer[LENGTH/(1<<level)+2][j+4];
buffer[LENGTH/(1<<level)+5][j+4] = buffer[LENGTH/(1<<level)+1][j+4];
buffer[LENGTH/(1<<level)+6][j+4] = buffer[LENGTH/(1<<level)][j+4];
buffer[LENGTH/(1<<level)+7][j+4] = buffer[LENGTH/(1<<level)-1][j+4];
}
for(j = 0;j<WIDTH/(1<<level);j++)//
{
for(i =1;i<LENGTH/(1<<level)+7;i+=2)//第一步行 2 4 6 8 10 12 -- 508 510 512 514 516 518
{//j = 1 3 5 7 9 11 -- 507 509 511 513 515 517
bufferout[i][j+4] = ( lifting_factors[4]*buffer[i][j+4]);
// buffer[i+4][j] = ( lifting_factors[4]*bufferout[i+4][j]);
}
for(i =0;i<LENGTH/(1<<level)+8;i+=2)//第二步行1 3 5 7 9 11 -- 509 511 513 515 517 519
{//j =2 4 6 8 10 -- 508 510 512 514 516
bufferout[i][j+4] = (-buffer[i][j+4]/lifting_factors[4]);
//buffer[i+4][j] = (-bufferout[i+4][j]/lifting_factors[4]);
}
for(i =1;i<LENGTH/(1<<level)+7;i+=2)//第三步行2 4 6 8 10 12 --508 510 512 514 516 518
{//j =1 3 5 7 9 11 --507 509 511 513 515 517
bufferout[i][j+4] = bufferout[i][j+4]-
lifting_factors[3]*(bufferout[i-1][j+4]+bufferout[i+1][j+4]);//sl1偶数
//buffer[i+4][j] = buffer[i+4][j]-
//lifting_factors[3]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//sl1偶数
}
for(i =2;i<LENGTH/(1<<level)+6;i+=2)//第四步行3 5 7 9 11 -- 509 511 513 515 517
{//j = 2 4 6 8 10 -- 508 510 512 514 516
bufferout[i][j+4] = bufferout[i][j+4]-
lifting_factors[2]*(bufferout[i-1][j+4]+bufferout[i+1][j+4]);//dl1奇数
//buffer[i+4][j] = buffer[i+4][j]-
//lifting_factors[2]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//dl1奇数
}
for(i =3;i<LENGTH/(1<<level)+5;i+=2)//第五步行4 6 8 10 -- 510 512 514 516
{//j = 3 5 7 9 --509 511 513 515
bufferout[i][j+4] = bufferout[i][j+4]-
lifting_factors[1]*(bufferout[i-1][j+4]+bufferout[i+1][j+4]);//sl1偶数
//buffer[i+4][j] = buffer[i+4][j]-
//lifting_factors[1]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//sl1偶数
}
for(i =4;i<LENGTH/(1<<level)+4;i+=2)//第六步行 5 7 9 11 13 --511 513 515
{//j = 4 6 8 --510 512 514
bufferout[i][j+4] = bufferout[i][j+4]-
lifting_factors[0]*(bufferout[i-1][j+4]+bufferout[i+1][j+4]);//dl1奇数
//buffer[i+4][j] = buffer[i+4][j]-
//lifting_factors[0]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//dl1奇数
}
}//每一列的数放入4 5 6 7 8 --130 131 132中
//数组中的j = 3 4 5 6 7 - - 129 130 131 ??
/******************************************************************************
以上是行变换的逆变换,以下是列变换的逆变换
******************************************************************************/
for(i = 0;i<LENGTH/(1<<level);i++)
{
bufferout[i+4][0] = bufferout[i+4][8];
bufferout[i+4][1] = bufferout[i+4][7];
bufferout[i+4][2] = bufferout[i+4][6];
bufferout[i+4][3] = bufferout[i+4][5];
bufferout[i+4][WIDTH/(1<<level)+4] = bufferout[i+4][WIDTH/(1<<level)+2];
bufferout[i+4][WIDTH/(1<<level)+5] = bufferout[i+4][WIDTH/(1<<level)+1];
bufferout[i+4][WIDTH/(1<<level)+6] = bufferout[i+4][WIDTH/(1<<level)];
bufferout[i+4][WIDTH/(1<<level)+7] = bufferout[i+4][WIDTH/(1<<level)-1];
}
for(i = 0;i<LENGTH/(1<<level);i++)//行
{
for(j =1;j<WIDTH/(1<<level)+7;j+=2)//第一步列 2 4 6 8 10 12 -- 508 510 512 514 516 518
{//j = 1 3 5 7 9 11 -- 507 509 511 513 515 517
buffer[i+4][j] = ( lifting_factors[4]*bufferout[i+4][j]);
}
for(j =0;j<WIDTH/(1<<level)+8;j+=2)//第二步列3 5 7 9 11 -- 509 511 513 515 517
{//j =2 4 6 8 10 -- 508 510 512 514 516
buffer[i+4][j] = (-bufferout[i+4][j]/lifting_factors[4]);
}
for(j =1;j<WIDTH/(1<<level)+7;j+=2)//第三步列2 4 6 8 10 12 --508 510 512 514 516 518
{//j =1 3 5 7 9 11 --507 509 511 513 515 517
buffer[i+4][j] = buffer[i+4][j]-
lifting_factors[3]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//sl1偶数
}
for(j =2;j<WIDTH/(1<<level)+6;j+=2)//第四步列3 5 7 9 11 -- 509 511 513 515 517
{//j = 2 4 6 8 10 -- 508 510 512 514 516
buffer[i+4][j] = buffer[i+4][j]-
lifting_factors[2]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//dl1奇数
}
for(j =3;j<WIDTH/(1<<level)+5;j+=2)//第五步列4 6 8 10 -- 510 512 514 516
{//j = 3 5 7 9 --509 511 513 515
buffer[i+4][j] = buffer[i+4][j]-
lifting_factors[1]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//sl1偶数
}
for(j =4;j<WIDTH/(1<<level)+4;j+=2)//第六步列 5 7 9 11 13 --511 513 515
{//j = 4 6 8 --510 512 514
buffer[i+4][j] = buffer[i+4][j]-
lifting_factors[0]*(buffer[i+4][j-1]+buffer[i+4][j+1]);//dl1奇数
}
}//每一列的数放入5 6 7 8 --511 512 513 514中
//数组中的j = 4 5 6 7 - - 510 511 512 513
}
}
/******************************************************************************
逆变换完成
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -