📄 16point_bindct.cpp
字号:
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#define RESET 64
#define MAXVAL 65535
#define RANGE 65536
#define qbpp 16
#define bpp 16
#define LIMIT 64
#define NEAR 0
unsigned long output;
static int cnt=0,code=0,pp=0;
int Ac,Count;
long int counter=0;
FILE *fp;
FILE *out;
int X=512,Y=512;
int Row=16,Col=16;
int array_a[512][512];
int array[16][16];
int array_r[16];
int array_c[16];
void DCT_1D_r(int x[16],int RowX);
void DCT_1D_c(int x[16],int ColY);
void DCT_2D();
int LG(int C,int A);
void GR(int x);
void DCT_1D_r(int x[16],int RowX)
{
int X[16];
int j;
double p1=0.4375,p2=0.09375,p3=0.09375,p4=0.3125,p5=0.25,p6=0.4375,p7=0.4375,p8=0.90625,p9=0.90625,p10=0.15625,p11=0.15625,p12=0.59375,p13=0.59375,p14=0.34375,p15=0.34375;
double u1=0.375,u2=0.1875,u3=0.5625,u4=0.375,u5=0.375,u6=1,u7=0.3125,u8=0.875,u9=0.625;
x[15]=x[0]-x[15];
x[0]=x[0]-floor(0.5*x[15]);
x[14]=x[1]-x[14];
x[1]=x[1]-floor(0.5*x[14]);
x[13]=x[2]-x[13];
x[2]=x[2]-floor(0.5*x[13]);
x[12]=x[3]-x[12];
x[3]=x[3]-floor(0.5*x[12]);
x[11]=x[4]-x[11];
x[4]=x[4]-floor(0.5*x[11]);
x[10]=x[5]-x[10];
x[5]=x[5]-floor(0.5*x[10]);
x[9]=x[6]-x[9];
x[6]=x[6]-floor(0.5*x[9]);
x[8]=x[7]-x[8];
x[7]=x[7]-floor(0.5*x[8]);
x[7]=x[0]-x[7];
x[0]=x[0]-floor(0.5*x[7]);
x[6]=x[1]-x[6];
x[1]=x[1]-floor(0.5*x[6]);
x[5]=x[2]-x[5];
x[2]=x[2]-floor(0.5*x[5]);
x[4]=x[3]-x[4];
x[3]=x[3]-floor(0.5*x[4]);
x[3]=x[0]-x[3];
x[0]=x[0]-floor(0.5*x[3]);
x[2]=x[1]-x[2];
x[1]=x[1]-floor(0.5*x[2]);
// x[0]=x[1]+x[0];
// x[1]=floor(0.5*x[0])-x[1];
x[1]=x[0]-x[1];
x[0]=x[0]-floor(0.5*x[1]);
x[2]=floor(p1*x[3])-x[2];
x[3]=x[3]-floor(u1*x[2]);
x[7]=x[7]-floor(p4*x[4]);
x[4]=x[4]+floor(u3*x[7]);
x[7]=x[7]-floor(p5*x[4]);
x[6]=x[6]-floor(p2*x[5]);
x[5]=x[5]+floor(u2*x[6]);
x[6]=x[6]-floor(p3*x[5]);
x[6]=x[4]-x[6];
x[4]=x[4]-floor(0.5*x[6]);
x[5]=x[7]-x[5];
x[7]=x[7]-floor(0.5*x[5]);
// x[7]=x[4]+x[7];
// x[4]=floor(0.5*x[7])-x[4];
x[4]=x[7]-x[4];
x[7]=x[7]-floor(0.5*x[4]);
x[15]=x[15]-floor(p14*x[8]);
x[8]=x[8]+floor(u9*x[15]);
x[15]=x[15]-floor(p15*x[8]);
x[9]=x[9]-floor(p12*x[14]);
x[14]=x[14]+floor(u8*x[9]);
x[9]=x[9]-floor(p13*x[14]);
x[13]=x[13]-floor(p10*x[10]);
x[10]=x[10]+floor(u7*x[13]);
x[13]=x[13]-floor(p11*x[10]);
x[11]=x[11]-floor(p8*x[12]);
x[12]=x[12]+floor(u6*x[11]);
x[11]=x[11]-floor(p9*x[12]);
x[11]=x[8]-x[11];
x[8]=x[8]-floor(0.5*x[11]);
x[10]=x[9]-x[10];
x[9]=x[9]-floor(0.5*x[10]);
x[15]=x[12]-x[15];
x[12]=x[12]-floor(0.5*x[15]);
x[14]=x[13]-x[14];
x[13]=x[13]-floor(0.5*x[14]);
x[14]=x[8]-x[14];
x[8]=x[8]-floor(0.5*x[14]);
x[15]=x[9]-x[15];
x[9]=x[9]-floor(0.5*x[15]);
x[11]=x[10]-x[11];
x[10]=x[10]-floor(0.5*x[11]);
x[13]=x[12]-x[13];
x[12]=x[12]-floor(0.5*x[13]);
x[8]=x[8]+floor(p6*x[9]);
x[9]=floor(u4*x[8])-x[9];
x[11]=x[11]+x[12];
x[12]=x[12]-floor(0.5*x[11]);
x[14]=x[14]+floor(p7*x[15]);
x[15]=x[15]-floor(u5*x[14]);
X[0]=x[0];
X[1]=x[12];
X[2]=x[7];
X[3]=x[9];
X[4]=x[3];
X[5]=x[14];
X[6]=x[5];
X[7]=x[13];
X[8]=x[1];
X[9]=x[10];
X[10]=x[6];
X[11]=x[15];
X[12]=x[2];
X[13]=x[8];
X[14]=x[4];
X[15]=x[11];
for(j=0;j<Col;j++)
array[RowX][j]=X[j];
}
void DCT_1D_c(int x[16],int ColY)
{
int X[16];
int i;
double p1=0.4375,p2=0.09375,p3=0.09375,p4=0.3125,p5=0.25,p6=0.4375,p7=0.4375,p8=0.90625,p9=0.90625,p10=0.15625,p11=0.15625,p12=0.59375,p13=0.59375,p14=0.34375,p15=0.34375;
double u1=0.375,u2=0.1875,u3=0.5625,u4=0.375,u5=0.375,u6=1,u7=0.3125,u8=0.875,u9=0.625;
x[15]=x[0]-x[15];
x[0]=x[0]-floor(0.5*x[15]);
x[14]=x[1]-x[14];
x[1]=x[1]-floor(0.5*x[14]);
x[13]=x[2]-x[13];
x[2]=x[2]-floor(0.5*x[13]);
x[12]=x[3]-x[12];
x[3]=x[3]-floor(0.5*x[12]);
x[11]=x[4]-x[11];
x[4]=x[4]-floor(0.5*x[11]);
x[10]=x[5]-x[10];
x[5]=x[5]-floor(0.5*x[10]);
x[9]=x[6]-x[9];
x[6]=x[6]-floor(0.5*x[9]);
x[8]=x[7]-x[8];
x[7]=x[7]-floor(0.5*x[8]);
x[7]=x[0]-x[7];
x[0]=x[0]-floor(0.5*x[7]);
x[6]=x[1]-x[6];
x[1]=x[1]-floor(0.5*x[6]);
x[5]=x[2]-x[5];
x[2]=x[2]-floor(0.5*x[5]);
x[4]=x[3]-x[4];
x[3]=x[3]-floor(0.5*x[4]);
x[3]=x[0]-x[3];
x[0]=x[0]-floor(0.5*x[3]);
x[2]=x[1]-x[2];
x[1]=x[1]-floor(0.5*x[2]);
// x[0]=x[1]+x[0];
// x[1]=floor(0.5*x[0])-x[1];
x[1]=x[0]-x[1];
x[0]=x[0]-floor(0.5*x[1]);
x[2]=floor(p1*x[3])-x[2];
x[3]=x[3]-floor(u1*x[2]);
x[7]=x[7]-floor(p4*x[4]);
x[4]=x[4]+floor(u3*x[7]);
x[7]=x[7]-floor(p5*x[4]);
x[6]=x[6]-floor(p2*x[5]);
x[5]=x[5]+floor(u2*x[6]);
x[6]=x[6]-floor(p3*x[5]);
x[6]=x[4]-x[6];
x[4]=x[4]-floor(0.5*x[6]);
x[5]=x[7]-x[5];
x[7]=x[7]-floor(0.5*x[5]);
// x[7]=x[4]+x[7];
// x[4]=floor(0.5*x[7])-x[4];
x[4]=x[7]-x[4];
x[7]=x[7]-floor(0.5*x[4]);
x[15]=x[15]-floor(p14*x[8]);
x[8]=x[8]+floor(u9*x[15]);
x[15]=x[15]-floor(p15*x[8]);
x[9]=x[9]-floor(p12*x[14]);
x[14]=x[14]+floor(u8*x[9]);
x[9]=x[9]-floor(p13*x[14]);
x[13]=x[13]-floor(p10*x[10]);
x[10]=x[10]+floor(u7*x[13]);
x[13]=x[13]-floor(p11*x[10]);
x[11]=x[11]-floor(p8*x[12]);
x[12]=x[12]+floor(u6*x[11]);
x[11]=x[11]-floor(p9*x[12]);
x[11]=x[8]-x[11];
x[8]=x[8]-floor(0.5*x[11]);
x[10]=x[9]-x[10];
x[9]=x[9]-floor(0.5*x[10]);
x[15]=x[12]-x[15];
x[12]=x[12]-floor(0.5*x[15]);
x[14]=x[13]-x[14];
x[13]=x[13]-floor(0.5*x[14]);
x[14]=x[8]-x[14];
x[8]=x[8]-floor(0.5*x[14]);
x[15]=x[9]-x[15];
x[9]=x[9]-floor(0.5*x[15]);
x[11]=x[10]-x[11];
x[10]=x[10]-floor(0.5*x[11]);
x[13]=x[12]-x[13];
x[12]=x[12]-floor(0.5*x[13]);
x[8]=x[8]+floor(p6*x[9]);
x[9]=floor(u4*x[8])-x[9];
x[11]=x[11]+x[12];
x[12]=x[12]-floor(0.5*x[11]);
x[14]=x[14]+floor(p7*x[15]);
x[15]=x[15]-floor(u5*x[14]);
X[0]=x[0];
X[1]=x[12];
X[2]=x[7];
X[3]=x[9];
X[4]=x[3];
X[5]=x[14];
X[6]=x[5];
X[7]=x[13];
X[8]=x[1];
X[9]=x[10];
X[10]=x[6];
X[11]=x[15];
X[12]=x[2];
X[13]=x[8];
X[14]=x[4];
X[15]=x[11];
for(i=0;i<Row;i++)
array[i][ColY]=X[i];
}
void DCT_2D()
{
int i,j;
for(i=0;i<Row;i++)
{
for(j=0;j<Col;j++)
array_r[j]=array[i][j];
DCT_1D_r(array_r,i);
}
/* for(i=0;i<Row;i++)
{
for(j=0;j<Col;j++)
printf("%d ",array[i][j]);
printf("\n");
}*/
for(j=0;j<Col;j++)
{
for(i=0;i<Row;i++)
array_c[i]=array[i][j];
DCT_1D_c(array_c,j);
}
}
int LG(int C,int A)
{
int i;
for(i=0;(C<<i)<A;i++);
return(i);
}
void writecode(int *cnt,int *pp,unsigned long *output,int *code)
{
unsigned long c;
if((*cnt)<8)
*code=(*code<<(*cnt-*pp))+(*output);/*以1byte为单位处理。把之前的码流向前推当前码流的长度,加入当前输出的码流*/
else{
while(*cnt>=8)
{
if(*cnt>32)/*以4byte为存储器最大值*/
{
*code=(*code<<(8-*pp));
fwrite(code,1,1,fp);/*把code指向的1×1个字节输出到fp所指的文件中*/
counter++;
*code=0;
*cnt=*cnt-8;
}
else
{
*code=(*code<<(8-*pp))+(255&(*output>>(*cnt-8)));
fwrite(code,1,1,fp);
counter++;
*code=0;
*cnt=*cnt-8;
}
}
c=~(~0<<*cnt);
*code=c&(*output);
}
}
void GR(int Errval)
{
int MErrval;
unsigned b,c;
int i,j,k;
unsigned interim;
output=0;
k=LG(Count,Ac);
if((NEAR==0)&&(k==0))
{
if(Errval>=0)
MErrval=2*Errval+1;
else
MErrval=-2*(Errval+1);
}
else
{
if(Errval>=0)
MErrval=2*Errval;
else
MErrval=-2*Errval-1;
}
interim=MErrval;
interim=interim>>k;/*除最低k位以外的高位*/
if(interim<((unsigned)(LIMIT-qbpp-1)))
{
c=~(~0<<k);
b=c&MErrval;/*截取MErrval的最低k位*/
output=(output<<(interim+1))+1;/*左移interim+1得到interim+1个零,加一后即interim个零接一个1*/
output=output<<k;
output=output+b;
pp=cnt;
cnt=cnt+interim+1+k;
writecode(&cnt,&pp,&output,&code);
}
else
{
unsigned b,c;
output=(output<<(LIMIT-qbpp))+1;/*当前码流为:LIMIT-qbpp-1个零,一个1*/
output=output<<qbpp;/*后接qbpp位的数字*/
c=~(~0<<qbpp);
b=c&(MErrval-1);/*取MErrval-1的后qbpp位*/
output=output+b;
pp=cnt;
cnt=cnt+LIMIT;
writecode(&cnt,&pp,&output,&code);
}
Ac=Ac+abs(Errval);
if(Count==RESET)
{
Ac=Ac>>1;
Count=Count>>1;
}
Count=Count+1;
}
void main()
{
int i,j;
int k,t;
int m,n;
int temp=0;
int min=255,max=0;
int a=0,b=0;
int c=0,d=0;
fp=fopen("e:\\felicia\\RADAR.raw","rb");
for(m=0;m<X;m++)
{
for(n=0;n<Y;n++)
{
fread(&array_a[m][n],1,1,fp);
}
}
fclose(fp);
fp=fopen("e:\\felicia\\RADAR_cofficient.RAW","wb");
for(m=0;m<X;m++)
{
for(n=0;n<Y;n++)
{
fprintf(fp,"%4d",array_a[m][n]);
if(((n+1)%16)==0&&n!=511)
fprintf(fp,"\t");
}
fprintf(fp,"\n");
if(((m+1)%16)==0&&m!=511)
fprintf(fp,"\n");
}
fclose(fp);
fp=fopen("e:\\felicia\\16point_binDCT_RADAR_reduce_zscan.raw","wb");
out=fopen("e:\\felicia\\16point_binDCT_RADAR_reduce.raw","wb");
Ac=__max(2,(RANGE+(1<<5))/(1<<6));
Count=1;
for(m=0;m<X;m+=16)
{
for(n=0;n<Y;n+=16)
{
for(i=0;i<Row;i++)
{
for(j=0;j<Col;j++)
array[i][j]=array_a[m+i][n+j];
}
DCT_2D();
array[0][0]=array[0][0]-temp;
/* for(i=0;i<Row;i++)
for(j=0;j<Col;j++)
{
GR(array[i][j]);
}
*/
for(k=0;k<31;k++)
if(k<16)
{
if(k%2==0)
for(j=0;j<=k;j++)
{
GR(array[k-j][j]);
// printf("%d ",array[k-j][j]);
}
else
for(i=0;i<=k;i++)
{
GR(array[i][k-i]);
// printf("%d ",array[i][k-i]);
}
}
else
{
if(k%2==0)
for(i=15,t=i;i>=k-t;i--)
{
GR(array[i][k-i]);
// printf("%d ",array[i][k-i]);
}
else
for(j=15,t=j;j>=k-t;j--)
{
GR(array[k-j][j]);
// printf("%d ",array[k-j][j]);
}
}
for(i=0;i<Row;i++)
for(j=0;j<Col;j++)
{
fprintf(out,"%d ",array[i][j]);
if(array[i][j]<=min)
{
min=array[i][j];
a=m+i;
b=n+j;
}
if(array[i][j]>=max)
{
max=array[i][j];
c=m+i;
d=n+j;
}
}
temp=temp+array[0][0];
}
}
if(cnt>0)
code=code<<(8-cnt);
fwrite(&code,1,1,fp);
fclose(fp);
printf("max=%d,row=%d,col=%d\nmin=%d,row=%d,col=%d\n",max,a,b,min,c,d);
printf("end");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -