FFT-----IP的使用 下载本文

内容发布更新时间 : 2024/5/5 22:06:51星期一 下面是文章的全部内容请认真阅读。

综合电子系统设计实验报告

项目名称:FFT-----IP的使用

一、实验原理:

1、系统设计结果框图:

Mzl_05_12864模拟信号输入C8051F020频谱数据选择输入8位FFT模8位采样输出FIFO_real8位实部8位虚部DataSelFIFO_imagFFT8位数据RAM6位指数转换成8位指数F P G A

2、单片机(C8051F020)模块

(1)采集模拟信号

①模拟信号从单片机引脚(P1.1)输入,基准电压VREF=2.46V,允许输入的模拟信号幅值范围为:0~2.46V,超过这个范围的电压值将不能进行正常的AD转换。

②采用定时器3溢出驱动ADC1将输入信号转换成8位数据,单片机的系统时钟为24MHz,设置定时器3:TMR3RLH=(65535-750)/256,TMR3RLL=(65535-750)%6,即对系统时钟进行750分频,转换频率为32KHz,使采到的64点数据包含1KHz的正弦信号完成的两个周期。

③采样得到的64点8位数据须进行右移一位处理(即数据除以2),这是因为FFT处理的数据类型为有符号型,而单片机AD转换后的数据为无符号型,为了使数据类型匹配,必须使单片机送给FFT的数据为正,即最高位为0。

④将处理后的64点数据存入数组Result1[64],以提供给FPGA进行FFT变换。 ⑤此系统能处理的模拟信号频率范带宽为:0.5KHz~~16KHz。

(2)计算频率模长

①经过FFT处理后的数据是各频率点的8位有符号型实部、虚部以及指数。

②从FPGA的FIFO模块中读出64点频率数据,各点的实部、虚部、指数分别存入

Result2[3]中,并算出各点的真正幅值存入数组Result2[64]中。

③模长的计算公式:Fx=sqrt(data_real^2+data_img^2)*exp(-data_exp)*2。 ④各频率点真正幅值:A0=F0/N,A1=2×F1/N,A2=2×F2/N……

(3)控制液晶显示

①将Result2[64]中的数据用3位十进制数显示在液晶上,每位字符尺寸为8×16。 ②数字的寻址方式: 0~9的字模为

Shuzi[]= {/*0*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00, /*1*/

0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, /*2*/

0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, /*3*/

0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, /*4*/

0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, /*5*/

0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, /*6*/

0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, /*7*/

0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, /*8*/

0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, /*9*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00 };

调用函数为:

/*********写入字符8x16*********/

void LCD_Char(unsigned char row,char colume,uint8 num,uint8 *pword) {

unsigned char page= row;

//确定页地址

unsigned char col_high=colume>>4;

unsigned char col_low =colume&0x0f; //设置列地址 unsigned char i;

Wr_com(LCD_Page+page); Wr_com(LCD_High+col_high); Wr_com(LCD_Low+col_low);

for(i=0;i<8;i++)

}

//显示字符的上半部分

//num为需要显示的数据,则地址便从该数据开始

{ Wr_dat(*(pword+16*num+i));

Wr_com(LCD_Page+page+1); Wr_com(LCD_High+col_high); Wr_com(LCD_Low+col_low); for(i=0;i<8;i++) } }

/***********写入数字函数**************/

void LCD_Shuzi(unsigned char row,char colume,uint8 dat) {LCD_Char(row,colume,dat,Shuzi);}

//显示字符的下半部分

{ Wr_dat(*(pword+16*num+8+i));

3、FPGA模块

(1)FFT处理模块

①FFT处理器模块采用缓冲突发数据流结构的信号,在系统复位信号(rest_n)变为低电平后,数据源将sink_ready信号置高电平,表明有能力接受输入信号,同时sink_sop信号置高电平,表示输入模w块开始,当完全载入输入模块时,sink_eop置高电平,表示FFT不再接受其他输入数据,并开始计算输入数据的变换结果。

②sink_sop和sink_eop信号由sopeop模块提供,由FPGA提供的系统时钟,sopeop能周期性提供间隔64点的sink_sop和sink_eop信号,使得FFT能进行正常的快速傅里叶变换。

③经过FFT处理后的数据为8位实部、8位虚部和6位指数,实部和虚部分别写入FIFO_real和FIFO_imag中,指数直接变换为8位数据。

(2)RAM模块

为了解决单片机采用的时钟和FPGA的快速频率周期不匹配的问题,特在FFT之前假如RAM模块,将单片机采集得到的64点8位数据存入RAM中,然后用系统时钟将RAM中的数据读出,发送给FFT进行傅里叶变换。

(3)FIFO和数据选择模块

由于FFT的计算频率(本实验采用50MHZ系统时钟4分频)远大于单片机计算频率值的(单片机指令周期为2MHz,计算一次模长需要好多条指令),所以先将FFT输出的实部和虚部