one_d.c

来自「基于恩智浦dsp芯片的dct变换源码」· C语言 代码 · 共 73 行

C
73
字号
#include <ops/custom_defs.h>

#include "coeffs.h"

int scale = 2;

main(int argc, char **argv)
{
   int i, dataword;
   short data[8] ; 

  if (argc > 2 && !strcmp(argv[1], "-scale"))
    scale = atoi(argv[2]);

   for (i=0; i<8; i++) {
     scanf("%d", &dataword);
     data[i] = dataword ;
   }

   one_d_dct(data, scale);

   for (i= 0; i<8; i++) printf("%d ", data[i]);
   printf("\n");
}	   

#if	defined(__LITTLE_ENDIAN__)
#define PACK16_MSB(a, b)       PACK16MSB(b, a)
#define	READ_NORM(a)		ROLI(16, (a))
#define	READ_REV(a)		(a)
#else
#define PACK16_MSB(a, b)       PACK16MSB(a, b)
#define	READ_NORM(a)		(a)
#define	READ_REV(a)		ROLI(16, (a))
#endif

#define	HROUND(x)	(((x) << scale) + 0x8000)

one_d_dct(long *tab, int scale)
{
	int tmp0, tmp1, tmp2, tmp3, tmp101, tmp132, tmp176, tmp145,
	    tmp201, tmp232; 
	int s0, s1, s2, s3, s4, s5, s6, s7;

	tmp0 =  READ_NORM((tab)[0]);		
	tmp1 =  READ_REV ((tab)[1]);		
	tmp2 =  READ_NORM((tab)[2]);		
	tmp3 =  READ_REV ((tab)[3]);		
		 				
	tmp101 = DSPIDUALADD(tmp0,tmp3);	
	tmp132 = DSPIDUALADD(tmp1,tmp2);	
	tmp176 = DSPIDUALSUB(tmp0,tmp3);	
	tmp145 = DSPIDUALSUB(tmp1,tmp2);	
						
	tmp201 = DSPIDUALADD(tmp101,tmp132);
	tmp232 = DSPIDUALSUB(tmp101,tmp132);
				
	s0 = IFIR16(tmp201,C8);	
	s4 = IFIR16(tmp201,C9);	
	s2 = IFIR16(tmp232,C10);
	s6 = IFIR16(tmp232,C11);			
	s7 = IFIR16(tmp145,C0) + IFIR16(tmp176,C1);

	s3 = IFIR16(tmp145,C2) + IFIR16(tmp176,C3);
	s5 = IFIR16(tmp145,C4) + IFIR16(tmp176,C5);
	s1 = IFIR16(tmp145,C6) + IFIR16(tmp176,C7);

	tab[0] = PACK16_MSB(HROUND(s0), HROUND(s1));
	tab[1] = PACK16_MSB(HROUND(s2), HROUND(s3));
	tab[2] = PACK16_MSB(HROUND(s4), HROUND(s5));
	tab[3] = PACK16_MSB(HROUND(s6), HROUND(s7));
}

⌨️ 快捷键说明

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