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

📄 fft.c

📁 合众达SEED-DTK2812 光盘内容 DSP源码 用户指南 实验手册
💻 C
字号:
/******************************************************************************/
/*  Copyright 2004 by SEED Electronic Technology LTD.                         */
/*  All rights reserved. SEED Electronic Technology LTD.                      */
/*  Restricted rights to use, duplicate or disclose this code are             */
/*  granted through contract.                                                 */
/*  FILENAME...... fft.c											          */
/*  PROJECT....... Read and write on-board daram memory of TMS320VC5502	      */
/*  作者: gao		                                                          */
/*  版本:1.0                                                                  */
/*  日期:06.11.10                                                             */
/******************************************************************************/
#include <math.h>
#include "DSP28_Device.h"
#include "comm.h"
#include "fft.h"
#include "ext_inf.h"
/*********************************************************************************/
#define     FFTN512		512 
#define		FFTN256		256
#define		FFTN128		128
#pragma DATA_SECTION(ipcb, "FFTipcb");
long ipcb[FFTN512+2];
RFFT32  fft512=RFFT32_512P_DEFAULTS; 
RFFT32  fft256=RFFT32_256P_DEFAULTS; 
RFFT32  fft128=RFFT32_128P_DEFAULTS;  
/////////////////
unsigned int SampleLong;
#define SAMPLELONG   2
////////////////////
unsigned int Ad_data[1536]={0};
unsigned int Ad_data1[1536]={0};
unsigned int convcount = 0;
volatile unsigned int adconvover =0;
////////////////
unsigned int mod[512]; 
int  m=0;
double  n;
double p,q;
//////////////////////
unsigned int i,j;
/*********************************************************************************/
interrupt void ISRTimer2(void);
interrupt void ad(void);
/*********************************************************************************/

void main(void)
{
	/*初始化系统*/
	InitSysCtrl();

	#if SAMPLELONG==1
		SampleLong =256;
	#endif
	#if SAMPLELONG==2
		SampleLong =512;
	#endif
	#if SAMPLELONG==3
		SampleLong =1024;
	#endif

	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;

	/*初始化PIE中断*/
	InitPieCtrl();

	/*初始化PIE中断矢量表*/
	InitPieVectTable();	
	
    //初始化cputimer
    InitCpuTimers();
    
	/*设置中断服务程序入口地址*/
	EALLOW;	// This is needed to write to EALLOW protected registers
	PieVectTable.TINT2 = &ISRTimer2;
	PieVectTable.ADCINT = &ad;
	EDIS;   // This is needed to disable write to EALLOW protected registers
	
	/*开中断*/
	IER |= M_INT1;//ADC中断
	
	EINT;   // Enable Global interrupt INTM
	ERTM;	// Enable Global realtime interrupt DBGM
	
	adconvover=0;
	DINT;
	/*设置CPU*/
	ConfigCpuTimer(&CpuTimer2, 150, 22);	
 	StartCpuTimer2();
 	
  	/*开中断*/
	IER |= M_INT14;
	EINT;
	
	InitAdc();
	
	for(;;){					
		if (adconvover==1){				
			for(i=0;i<SampleLong+SampleLong/2;i++){
				Ad_data1[i]=Ad_data[i+SampleLong/2];
			}			
			/*AD采样结束 fft转换开始*/	
			switch(SampleLong/2){
				case	128:
					fft128.ipcbptr=ipcb;
					fft128.init(&fft128);
					for(i=0;i<SampleLong/2;i++)	{
						ipcb[i] = Ad_data1[i];
					}
					RFFT32_brev(ipcb,ipcb,FFTN128);
					fft128.calc(&fft128);
					fft128.split(&fft128);
				break;
				case	256:
					fft256.ipcbptr=ipcb;
					fft256.init(&fft256);
					for(i=0;i<SampleLong/2;i++)	{
						ipcb[i] = Ad_data1[i];
					}
					RFFT32_brev(ipcb,ipcb,FFTN256);
					fft256.calc(&fft256);
					fft256.split(&fft256);
				break;
				case	512:
					fft512.ipcbptr=ipcb;
					fft512.init(&fft512);
					for(i=0;i<SampleLong/2;i++)	{
					ipcb[i] = (long)Ad_data1[i];
					}
					RFFT32_brev(ipcb,ipcb,FFTN512);
					fft512.calc(&fft512);
					fft512.split(&fft512);
				break;
				default:
				break;
			}
			/*求模*/   
       		m=0;
        	for(i=0;i<SampleLong/2;i+=2) {
           		p=ipcb[i];
          	    q=ipcb[i+1];                      
          	    n=p*p+q*q; 
	            n=sqrt(n); 
       		    mod[m]=n;	
           	    m++;                           
       		}
       		adconvover=0;				
		}		
			
	}
} 	

interrupt void ad(void)
{
	IFR=0x0000;
	PieCtrl.PIEACK.all=0xffff;
	if(adconvover==0){
		Ad_data[convcount] = AdcRegs.RESULT0;
    	convcount++;
    }
	if (convcount==(SampleLong+SampleLong/2))
	{
		convcount=0;
 		adconvover=1;//接满标志	
	}	
}

interrupt void ISRTimer2(void)
{
//	AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
	AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
	AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;	
	
}
void sys_reset(void)
{	
	EALLOW;   
	SysCtrlRegs.WDCR= 0;
	EDIS;
	for(;;){};
} 


//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

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