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

📄 function.c

📁 利用合众达的C5416开发板上的ACI32B芯片编程的信号分析并进行FFT变换。
💻 C
字号:
/* filename:function.c */
#include "var.h"
#include "codec.h"
#include "dma54xx.h"
#include "tms5416.h"
#include "mcbsp54.h"
volatile struct compx {float real,imag;};
volatile int row,size;
/*声明外部变量*/
//extern  int row,size;   
volatile struct compx a[8192];

/*-----延时程序-----*/
/*
void delay(int time)
{
 int i,j;
 for(i=0;i<time;i++)
   for( j=10000; j--;)	
  		asm("	nop");	
}
*/
    
/*-----DSP系统初始化-----*/
/*void init_board(void)
{
 *ST0=0x1800;
 *ST1=0x691f;
		
//调节PLL倍频数 14倍频:114.7M
 *CLKMD=0x9004;
 asm("  nop");
 asm("  nop");
 *CLKMD=CLKMD_VAL;
 asm("  nop");
 asm("  nop");
 *CLKMD=(CLKMD_VAL|7);
 asm("  nop");
 asm("  nop");
 asm("  nop");
 asm("  nop");
 
 *ST0=0x1800;
 *ST1=0x691f;
	
 *PMST=PMST_VAL;
 *SWWSR=SWWSR_VAL;
 *SWCR=SWCR_VAL;
 *BSCR=BSCR_VAL;	
	
 *IFR=0xffff;	
 *IMR=0x0000;
 	
 asm("  rsbx frct");
 asm("  SSBX SXM");
 asm("  SSBX INTM");
}
 
void startfre(void)
{  
 row=0;
 *IFR|=0x0001;
 *IMR|=0x0001;
 *TCR&=0xffef;
}
      
void stopfre(void)  
{
 *IMR&=0xFFFE; 
 *TCR|=0x10;  
}
*/
/*--------开始采样,设置采样参数--------------*/
/*void setfrequency(int f)			
{	
 *TCR=0x0010; 
 *PRD=0x1dff;//0xEFF;	
 *TCR=0x03ff; 																					
}*/

/*---------------timer ISR---------------------*/
interrupt void intc_INT0(void)
{int temp;
 *IFR|=0xFFFF;
 if(row<size)  
 {temp=port0001<<2;
  *(sam+row)=temp;
  row++;	     	
 }			
}   

/*-----数字下变频-----*/
/*void tran_freq(struct compx *xin,int N)
{int n,i;float sum=0.0;
 asm("  rsbx frct");
 asm("  SSBX SXM");
 n=N-2;
 for(i=0;i<n;i++)
   sum=sum+xin[i].real+xin[i].imag;
 sum=sum*0.50/n;
 n=N;
 for(i=0;i<n;i++)
  {xin[i].real=xin[i].real-sum;
   xin[i].imag=xin[i].imag-sum;
  }   
 sum=0.0; 
 for(i=0;i<n;i++)
  {xin[i].real=xin[i].real*xin[i].real;
   xin[i].imag=xin[i].imag*xin[i].imag;
   sum=sum+xin[i].real+xin[i].imag;
  }
 sum=0.5*sum/n;//0.4992*sum/n;
 for(i=0;i<n;i++)
  {xin[i].real=xin[i].real-sum;
   xin[i].imag=xin[i].imag-sum;
  }   
}*/

/*-----复数乘法-----*/
struct compx EE(struct compx b1,struct compx b2)
{struct compx b3;
 b3.real=b1.real*b2.real-b1.imag*b2.imag;
 b3.imag=b1.real*b2.imag+b1.imag*b2.real;
 return(b3);
}

/*-----复数傅里叶变换-----*/
void FFT(struct compx *xin,int N)
{int f,m,nv2,nm1,i,k,j=0,l,le=1,lei,ip;
 float pi=3.141592;
 struct compx v,w,t;
 asm("  rsbx frct");
 asm("  SSBX SXM");
 nv2=N/2;
 f=N;
 for(m=1;(f=f/2)!=1;m++){;}
 nm1=N-1;
/*变址运算*/
 for(i=0;i<nm1;i++)
  {if(i<j) {t=xin[j];xin[j]=xin[i];xin[i]=t;}
   k=nv2;
   while(k<=j) {j=j-k;k>>=1;}
   j=j+k;
  }
/*fft*/
 for(l=1;l<=m;l++)
 {lei=le;
  le=le+le;
  v.real=1.0;v.imag=0.0;
  w.real=cos(pi/lei);w.imag=-sin(pi/lei);
  for(j=0;j<lei;j++)
  {for(i=j;i<N;i=i+le)
   {ip=i+lei;
    t=EE(xin[ip],v);
    xin[ip].real=xin[i].real-t.real;
    xin[ip].imag=xin[i].imag-t.imag;
    xin[i].real=xin[i].real+t.real;
    xin[i].imag=xin[i].imag+t.imag;
   }
   v=EE(v,w);
  }
 }
}

/*---------unpack---------*/
void unpack(struct compx *xin,int N)
{struct compx P,Q,t,v,w; int i;
 float pi=3.141592,max=0.0;
 asm("  rsbx frct");
 asm("  SSBX SXM");
 v.real=1.0;v.imag=0.0;
 w.real=cos(pi/N);w.imag=-sin(pi/N);
 
 for(i=1;i<=480;i++)
 {P.real=0.5*(xin[i].real+xin[N-i].real);
  P.imag=0.5*(xin[i].imag-xin[N-i].imag);
  Q.real=0.5*(xin[i].imag+xin[N-i].imag);
  Q.imag=0.5*(xin[N-i].real-xin[i].real);
  v=EE(w,v);t=EE(Q,v);
  Q.real=P.real+t.real;
  Q.imag=P.imag+t.imag;
  xin[i].real=sqrt(Q.real*Q.real+Q.imag*Q.imag);
 }
 
 for(i=481;i<1628;i++)
  v=EE(w,v);
 for(i=1628;i<=1648;i++)
 {P.real=0.5*(xin[i].real+xin[N-i].real);
  P.imag=0.5*(xin[i].imag-xin[N-i].imag);
  Q.real=0.5*(xin[i].imag+xin[N-i].imag);
  Q.imag=0.5*(xin[N-i].real-xin[i].real);
  v=EE(w,v);t=EE(Q,v);
  Q.real=P.real+t.real;
  Q.imag=P.imag+t.imag;
  xin[i].real=sqrt(Q.real*Q.real+Q.imag*Q.imag);
  if(max<xin[i].real)
    max=xin[i].real;
 }
 xin[0].real=max/250.0;
}

/*-----自动增益控制-----*/
/*void AGC(struct compx *xin)
{int i,x,j,y;float max=0.0,sum=0.0,max2=0.0,temp=0.0;
 asm("  rsbx frct");
 asm("  SSBX SXM");
 for(i=0;i<480;i++)
  {if(max<xin[i].real)
   max=xin[i].real;
   sum=sum+xin[i].real;
  }
 sum=sum/480.0;
 for(i=360;i<=410;i++)
   if(max2<xin[i].real)
     {max2=xin[i].real;
      x=i;  
     }
 x=410-x;x=4*x;
 if(x<13)
  j=3;
 else
  j=x-10;y=x;
 max2=0.0;
 for(i=j;i<x+10;i++)
  if(max2<xin[i].real)
     {max2=xin[i].real;
      y=i;
     }
 temp=max2/xin[0].real;
 temp=temp*temp*100.0/y+0.50;
 max2=max2/sum;
 *sn=(int)max2;
 *credit=(int)(100*max2/(0.5*x+16));
 *x_p=y;
 *credit2=(int)temp;
 for(i=0;i<480;i++)
  {xin[i].real=ampl*xin[i].real/max+0.5;
   *(display+i)=(int)xin[i].real;
  }    
}*/

⌨️ 快捷键说明

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