以VC5402DSP实现N(512)点FFT

     必备基础知识:1.数字信号处理 2.DSP硬件 3.CCS编程及应用 4.MATLAB仿真 5.C及汇编混合编程

         一.基2时间抽取FFT算法.

         二.如果不是对时间有严格的要求的相当一部分代码我们是用C语言写的,所以说学习处理器的重点不在于熟练掌握每一条汇编指令该如何谨慎地运用,大概理解就差不多了.处理器的存储空间是务必要理解清楚的,就手上的5402来说它的程序存储空间,数据存储空间和I/O空间都为64K,但这是它的逻辑地址,意思是说有这么大的逻辑寻址能力。芯片内部真正含有的是4K的ROM和16K的DRARM。这4K的ROM也不是用户可编程的,DSP复位后PC默认指向的地址为0xff80,在该处的存在的跳转指令会将DSP带入到自举加载程序的起始地址.说到这里就不得不提一下BootLoader的功能了,它是固化在ROM中的一段程序,负责将用户编写的代码调配到存储器中,说细说明参加空间中的相关文章.反正我在实现上述功能的过程中是将DRAM分成几段,某些段是作为程序存储器运行程序代码,某些段作为数据存储器存储数据(详见CMD文件).

          三.以下两个文件是CCS编程的核心内容.

MEMORY  {
  PAGE 0:
     RESEVE:   org   00h    len = 0x80 
    PAGE 0:
     PROG1:    org = 0x0100    len = 0x1200
   PAGE 0:
       VECT:     org = 0x0080,  len = 0x80
   PAGE 1:
       RESEVE1:   org   00h   len = 0x1300    
   PAGE 1:
      DARAM2:   org = 0x1300   len = 0x400
   PAGE 1:
         DARAM1:   org = 0x1700   len = 0x2900
}                  
                                                  
SECTIONS{
        .text :  >       PROG1   PAGE 0
        .cinit : >       PROG1   PAGE 0
        .switch: >       PROG1   PAGE 0
        .vectors:>       VECT    PAGE 0
        
        .const:  >       DARAM1   PAGE 1
        .bss  :  >       DARAM1   PAGE 1
        
        .stack : >       DARAM2   PAGE 1
        .system: >       DARAM2   PAGE 1
        .data :  >       DARAM2   PAGE 1      
        }

c代码

---------

#include <math.h>
#include<stdlib.h>
#define PI 3.14159265358979323846
#define SAMPLENUMBER 512
#define SAMPLERATE 128
/*分别定义样本点数和采样频率*/
void FFTInputData();
void InitFactorTable();
void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]);
int INPUT[SAMPLENUMBER];
float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER];
float fWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];
void main()
{
 int i;
 InitFactorTable();
 FFTInputData();
 for(i=0; i<SAMPLENUMBER; i++)
{
  fWaveR[i]=INPUT[i];
  fWaveI[i]=0.0f;
  w[i]=0.0f;
}
 FFT(fWaveR,fWaveI);
 
 while(1);
}
/*快速傅里叶算法fft*/
void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER])
{
 int i;
 int b0,b1,b2,b3,b4,b5,b6,b7,b8,bb;
 int j,k,b,p,M;
 float TR,TI,temp;
 /*以下为fft的倒位运算*/
 for(i=0; i<SAMPLENUMBER; i++)
{
  b0=b1=b2=b3=b4=b5=b6=b7=b8=0;
  b0=i&0x01; b1=(i/2)&0x01; b2=(i/4)&0x01;
  b3=(i/8)&0x01; b4=(i/16)&0x01; b5=(i/32)&0x01; 
  b6=(i/64)&0x01; b7=(i/128)&0x01; b8=(i/256)&0x01;
 
  //bb=b0*(2^8)+b1*(2^7)+b2*(2^6)+b3*(2^5)+b4*(2^4)+b5*(2^3)+b6*(2^2)+b7*(2^1)+b8*1;
  bb=b0*256+b1*128+b2*64+b3*32+b4*16+b5*8+b6*4+b7*2+b8*1;
  dataI[bb]=dataR[i];
}
 /*虚部数组在倒位运算中起桥梁作用*/
 for(i=0; i<SAMPLENUMBER; i++)
{
  dataR[i]=dataI[i];
  dataI[i]=0.0;    
}
 /*fft主程序*/
 for(M=1; M<=9; M++)
{
  b=1; i=M-1;
  /*b=2^(M-1)*/
  while(i>0)
{
   b=b*2; i--;
}
  for(j=0; j<=(b-1); j++)
{
   p=1; i=(9-M);
   /*p=2^(9-M)*/
   while(i>0)
   {
    p=p*2; i--;
   }
   p=p*j;
   for(k=j; k<SAMPLENUMBER; k=k+2*b)
   {
    /*
    TR=dataR[k];TI=dataI[k],temp=dataR[k+b];
    dataR[k]=dataR[k]+cos_tab[p]*dataR[k+b]-sin_tab[p]*dataI[k+b];
    dataI[k]=dataI[k]+cos_tab[p]*dataI[k+b]+sin_tab[p]*dataR[k+b]; 
    dataR[k+b]=TR-cos_tab[p]*dataR[k+b]+sin_tab[p]*dataI[k+b];
    dataI[k+b]=TI-sin_tab[p]*temp-cos_tab[p]*dataI[k+b];
    */
    TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];
    dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];
    dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];
    dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];
    dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];
   }
}
}
 for ( i=0;i<SAMPLENUMBER;i++ )
{ 
  w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);
}
}
void FFTInputData()   /*初始化fft输入数据,这里我人为定义一组数据*/
{
 int i=0;
 for(i=0; i<SAMPLENUMBER; i++)
{
  INPUT[i]=512*(sin(2*PI*10*i/SAMPLERATE)+cos(2*PI*50*i/SAMPLERATE));
}
}
void InitFactorTable()  /*初始化正弦余弦系数表*/  
{
 int i;
 for(i=0; i<SAMPLENUMBER; i++)
{
  sin_tab[i]=sin(2*PI*i/SAMPLENUMBER);
  cos_tab[i]=cos(2*PI*i/SAMPLENUMBER);
}
}

4.MATLAB仿真代码

SampleRate=128;
SampleNumber=512;
i=0:1:(SampleNumber-1);
y=512*(sin(2*pi*10*i/SampleRate)+cos(2*pi*50*i/SampleRate));
subplot(2,1,1);
plot(i,y);
Y=fft(y,512);
f=i*128/512;
Am=abs(Y);
subplot(2,1,2);
plot(i,Am);


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值