⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dct.c

📁 DSP实现FDCT算法
💻 C
字号:

#include <math.h>
#define N 8
#define PI 3.1415926
float DCTinput[N]={1.0,2,3,4,5,6,7,8},FDCTinput[N]={1.0,2,3,4,5,6,7,8};
float DCTout[N],IDCTout[N];
float x[N];
float X[N];
float sp[N];
float xp, Xp;
#define  C1 0.9808
#define  C2 0.9239
#define  C3 0.8315
#define  C4 0.7071
#define  C5 0.5556
#define  C6 0.3827
#define  C7 0.1951
float blk[N];
float blk1[N];
float blk2[N];
	

dct(float s[])
{
	int n, k;
	float alpha;
	float pin, sqrtn, sqrt2n;
	
	pin    = 0.5*PI/N;
	sqrtn  = sqrt(1.0/N);
	sqrt2n = sqrt(2.0/N);	

	for(k=0; k<N; k++)
		{
			    if(k==0)
				alpha=sqrtn;
				else
					alpha=sqrt2n;
			for(n=0;n<N;n++){
				x[n]=s[n];
				     }
			xp=0.0;
			for(n=0; n<N; n++){
				xp+=x[n]*cos((2*n+1)*k*pin);
			}
			xp*=alpha;
		DCTout[k]=xp;
		}
	
  
 } 
 idct(float c[])
    {
	int n, k;
	float alpha;
	float pin, sqrtn, sqrt2n;
	
	pin    = 0.5*PI/N;
	sqrtn  = sqrt(1.0/N);
	sqrt2n = sqrt(2.0/N);	
    for(n=0; n<N; n++)
		{
          
		  Xp=0.0;
		  for(k=0;k<N;k++)
		  {
               if(k==0)
				alpha=sqrtn;
			  	else
				alpha=sqrt2n;
				Xp+=alpha*DCTout[k]*cos((2*n+1)*k*pin);
		  }
		  IDCTout[n]=Xp;
		}
		
	}
	



fdct(float *blk)//先做行DCT
  { 
    float S07,S16,S25,S34,S0734,S1625;
    float D07,D16,D25,D34,D0734,D1625;
    S07=blk[0]+blk[7];
    S16=blk[1]+blk[6];
    S25=blk[2]+blk[5];
    S34=blk[3]+blk[4];
    S0734=S07+S34;
    S1625=S16+S25;
    D07=blk[0]-blk[7]; 
    D16=blk[1]-blk[6];
    D25=blk[2]-blk[5];
    D34=blk[3]-blk[4];
    D0734=S07-S34;
    D1625=S16-S25;
    blk1[0]=0.5*(C4*(S0734+S1625));
    blk1[1]=0.5*(C1*D07+C3*D16+C5*D25+C7*D34);
    blk1[2]=0.5*(C2*D0734+C6*D1625);
    blk1[3]=0.5*(C3*D07-C7*D16-C1*D25-C5*D34);
    blk1[4]=0.5*(C4*(S0734-S1625));
    blk1[5]=0.5*(C5*D07-C1*D16+C7*D25+C3*D34);
    blk1[6]=0.5*(C6*D0734-C2*D1625);
    blk1[7]=0.5*(C7*D07-C5*D16+C3*D25-C1*D34);
  }


  
fidct (float *blk)
{ double tmp[16]; 

 tmp[0]=blk1[0]*C4+blk1[2]*C2; 
 tmp[1]=blk1[4]*C4+blk1[6]*C6; 
 tmp[2]=blk1[0]*C4+blk1[2]*C6; 
 tmp[3]=-blk1[4]*C4-blk1[6]*C2; 
 tmp[4]=blk1[0]*C4-blk1[2]*C6; 
 tmp[5]=-blk1[4]*C4+blk1[6]*C2; 
 tmp[6]=blk1[0]*C4-blk1[2]*C2; 
 tmp[7]=blk1[4]*C4-blk1[6]*C6; 
 tmp[8]=blk1[1]*C7-blk1[3]*C5; 
 tmp[9]=blk1[5]*C3-blk1[7]*C1; 
 tmp[10]=blk1[1]*C5-blk1[3]*C1; 
 tmp[11]=blk1[5]*C7+blk1[7]*C3; 
 tmp[12]=blk1[1]*C3-blk1[3]*C7; 
 tmp[13]=-blk1[5]*C1-blk1[7]*C5; 
 tmp[14]=blk1[1]*C1+blk1[3]*C3; 
 tmp[15]=blk1[5]*C5+blk1[7]*C7; 
 //second step 
 tmp[0]=0.5*(tmp[0]+tmp[1]); 
 tmp[1]=0.5*(tmp[2]+tmp[3]); 
 tmp[2]=0.5*(tmp[4]+tmp[5]); 
 tmp[3]=0.5*(tmp[6]+tmp[7]); 
 tmp[4]=0.5*(tmp[8]+tmp[9]); 
 tmp[5]=0.5*(tmp[10]+tmp[11]); 
 tmp[6]=0.5*(tmp[12]+tmp[13]); 
 tmp[7]=0.5*(tmp[14]+tmp[15]); 
 //third step 
 blk2[0]=tmp[0]+tmp[7]; 
 blk2[1]=tmp[1]+tmp[6]; 
 blk2[2]=tmp[2]+tmp[5]; 
 blk2[3]=tmp[3]+tmp[4]; 
 blk2[4]=tmp[3]-tmp[4]; 
 blk2[5]=tmp[2]-tmp[5]; 
 blk2[6]=tmp[1]-tmp[6]; 
 blk2[7]=tmp[0]-tmp[7]; 
 
 }



main()
{
    dct(DCTinput);
    idct(DCTout);
    fdct(FDCTinput);
    fidct(blk1);
    while(1);
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -