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

📄 fft1.c

📁 适用于TI公司DM642的FFT例程 很好的资料
💻 C
📖 第 1 页 / 共 2 页
字号:
           -16846,-17018,-17189,-17360,
           -17530,-17700,-17869,-18037,
           -18204,-18371,-18537,-18703,
           -18868,-19032,-19195,-19358,
           -19519,-19681,-19841,-20001,
           -20159,-20318,-20475,-20631,
           -20787,-20942,-21097,-21250,
           -21403,-21555,-21706,-21856,
           -22005,-22154,-22301,-22448,
           -22594,-22740,-22884,-23027,
           -23170,-23312,-23453,-23593,
           -23732,-23870,-24007,-24144,
           -24279,-24414,-24547,-24680,
           -24812,-24943,-25073,-25201,
           -25330,-25457,-25583,-25708,
           -25832,-25955,-26077,-26199,
           -26319,-26438,-26557,-26674,
           -26790,-26905,-27020,-27133,
           -27245,-27356,-27466,-27576,
           -27684,-27791,-27897,-28002,
           -28106,-28208,-28310,-28411,
           -28511,-28609,-28707,-28803,
           -28898,-28993,-29086,-29178,
           -29269,-29359,-29447,-29535,
           -29621,-29707,-29791,-29874,
           -29956,-30037,-30117,-30196,
           -30273,-30350,-30425,-30499,
           -30572,-30644,-30714,-30784,
           -30852,-30919,-30985,-31050,
           -31114,-31176,-31237,-31298,
           -31357,-31414,-31471,-31526,
           -31581,-31634,-31685,-31736,
           -31785,-31834,-31881,-31927,
           -31971,-32015,-32057,-32098,
           -32138,-32176,-32214,-32250,
           -32285,-32319,-32351,-32383,
           -32413,-32442,-32469,-32496,
           -32521,-32545,-32568,-32589,
           -32610,-32629,-32647,-32663,
           -32679,-32693,-32706,-32718,
           -32728,-32737,-32745,-32752,
           -32758,-32762,-32765,-32767};
#pragma DATA_SECTION(newbuf,"H263VCBUF");
unsigned char newbuf[512*512];

#pragma DATA_SECTION(tempbuf,"H263VCBUF");
unsigned char tempbuf[512*512];
#pragma DATA_SECTION(fftbuf,"H263VCBUF");
short fftbuf[512][1024];

#define DLP_Q0064 0x80200004
#define PCR1 	*(volatile unsigned int  *)0x01900024
volatile unsigned char *ptr = (unsigned char *)0x80200004;
void initEMIF(void)
{
	#define EMIF_GCTL       0x01800000
	#define EMIF_CE1        0x01800004
	#define EMIF_CE0        0x01800008
	#define EMIF_CE2        0x01800010
	#define EMIF_CE3        0x01800014
	#define EMIF_SDRAMCTL   0x01800018
	#define EMIF_SDRAMTIMING  0x0180001C
  	#define EMIF_SDRAMEXT     0x01800020


  	*(int *)EMIF_GCTL = 0x00003040;/* EMIF global control register         */
  	*(int *)EMIF_CE1 = 0xffffff23; /* CE1 - 32-bit asynch access after boot*/
  	*(int *)EMIF_CE0 = 0xFFFFFF30; /* CE0 - SDRAM                          */
  	*(int *)EMIF_CE2 = 0x21200420; /* CE2 - 32-bit asynch on daughterboard */
  	*(int *)EMIF_CE3 = 0xffffff23; /* CE3 - 32-bit asynch on daughterboard */
  	*(int *)EMIF_SDRAMCTL = 0x57116000; /* SDRAM control register (100 MHz)*/
  	*(int *)EMIF_SDRAMTIMING = 0x00000410; /* SDRAM Timing register        */
}           
///////////////////////////////////////////
// Function name : BitReverse
// Description : 二进制倒序操作
// Return type : int 
// Argument : int src 待倒读的数
// Argument : int size 二进制位数
int BitReverse(int src, int size)
{
	int i;
	int tmp = src;
	int des = 0;
	for (i=size-1; i>=0; i--)
	{
		des = ((tmp & 0x1) << i) | des;
		tmp = tmp >> 1;
	}
	return des;
}

//////////////////////////////////////////////////
// Function name : Reorder
// Description : 数据二进制整序
// Return type : void 
// Argument :  x[MAX_N] Comp待整序数组
// Argument : int N FFT点数
// Argument : int M 点数的2的幂次
void Reorder(short x[], int N, int M)
{
	int i,j;
	for (i=0; i<N*2; i+=2)
	{
		j = BitReverse(i>>1, M)<<1;
		fftdatan[i] = x[j];
		fftdatan[i+1] = x[j+1];
	}	
	// 重新存入原数据中(已经是二进制整序过了的数据)
	for (i=0; i<N*2; i++)
	x[i] = fftdatan[i];
}

void FFT_1D(short m, short xy[], short cos[],short sin[])                            
{                                                                      
	short n1,n2,ie,ia,i,j,k,l;                                           
        short xt,yt,c,s;                                                     
        short n =1<<m;                                                                      
        n2 = n;                                                              
        ie = 1;                                                              
        for (k=n; k > 1; k = (k >> 1) ) {                                    
        	n1 = n2;                                                           
           	n2 = n2>>1;                                                        
           	ia = 0;                                                            
           	for (j=0; j < n2; j++) {                                           
             		c = -cos[ia*(1024>>m)];                                                     
             		s = -sin[ia*(1024>>m)];                                                   
             		ia = ia + ie;                                                    
             		for (i=j; i < n; i += n1) {                                      
               			l = i + n2;                                                    
               			xt      = xy[2*l] - xy[2*i]>>1;                                   
               			xy[2*i] = xy[2*i] + xy[2*l]>>1;                                   
               			yt      = xy[2*l+1] - xy[2*i+1]>>1;                               
               			xy[2*i+1] = xy[2*i+1] + xy[2*l+1]>>1;                             
               			xy[2*l]   = (short)((c*xt + s*yt)>>15);                                 
               			xy[2*l+1] = (short)((c*yt - s*xt)>>15);                                 
             		}                                                                
           	}                                                                  
           	ie = ie<<1;                                                        
         }         
         Reorder(xy, n, m);                                                           
	return;
}                                                                      
void FFT_2D(short x[512][1024],int M,short cos[],short sin[])
{
	int i,j;
	int N = (1 << M);

	// 先逐行进行 1D-FFT
	for (i=0; i<N; i++)
		FFT_1D(M,x[i],cos,sin); // <--- 计算结果再存入矩阵x中

	// 再逐列进行 1D-FFT
	for (j=0; j<N; j++)
	{
		// 取得第j列的数据
		for (i=0; i<N; i++)
		{
			col[i*2] = x[i][j];
			col[i*2+1] = x[i][j+1];
		}	
		
		// 对第j列数据进行 1D-FFT
		FFT_1D(M,col,cos,sin); // <--- 计算结果在数组col中
		
		// 将结果放回矩阵第j列中
		for(i=0; i<N; i++)
		{
			x[i][j] = col[i*2];
			x[i][j + 1] = col[i*2+1];
		}	
	}

}
void main()
{
  	int   	i;
  	int  row,col;

  	unsigned short j ;
//  	short   w[10]={-32767,0,-23170,-23170,0,-32767,23170,-23170,32767,0};
	initEMIF();
  	for(i=0;i<2048;i++)
    		fftdata[i] = 0;
  	for(i=0;i<4;i++)
    		fftdata[i*2] = 0x4000;
    	FFT_1D(9,fftdata,cosine,sine);
	
    asm("\tnop");
    asm("\tnop");
    asm("\tnop");
    asm("\tnop");
    asm("\tnop");
#if 1    
    for(i=0;i<512*512;i++)
	{
		((unsigned char *)tempbuf)[i] = 0x80;
		((unsigned char *)newbuf)[i] = 0x00;
	}
	for(j=0;j<512;j++)
	for(i=0;i<512;i++)
	{
		fftbuf[j][i*2] = *ptr++;
		fftbuf[j][i*2+1] = 0;
	}	
	FFT_2D(fftbuf,9,  cosine,sine);
#endif	
	for(i = 0,row = 0;row<512;row++)
	{
		for(col = 0; col<512;col++,i++)
		{
			j = fftbuf[row][col*2]	;
			if(j>255) j= 255;
			newbuf[((256+col)&0x1ff) +((256+row)&0x1ff)*512] = (unsigned char) j;		
		}
	}
	
	asm("\tnop");
	asm("\tnop");
	asm("\tnop");
	asm("\tnop");
	asm("\tnop");
	return;
}

⌨️ 快捷键说明

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