必备基础知识: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);