并行fft频谱分析仪设计Word下载.docx

上传人:b****3 文档编号:15741347 上传时间:2022-11-15 格式:DOCX 页数:17 大小:171.20KB
下载 相关 举报
并行fft频谱分析仪设计Word下载.docx_第1页
第1页 / 共17页
并行fft频谱分析仪设计Word下载.docx_第2页
第2页 / 共17页
并行fft频谱分析仪设计Word下载.docx_第3页
第3页 / 共17页
并行fft频谱分析仪设计Word下载.docx_第4页
第4页 / 共17页
并行fft频谱分析仪设计Word下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

并行fft频谱分析仪设计Word下载.docx

《并行fft频谱分析仪设计Word下载.docx》由会员分享,可在线阅读,更多相关《并行fft频谱分析仪设计Word下载.docx(17页珍藏版)》请在冰豆网上搜索。

并行fft频谱分析仪设计Word下载.docx

运算器1

89c52

FFT频谱分析仪系统框图

控制器

Pc

输出电路

ADC

外存储器

6264

运算器4

运算器3

运算器2

 

系统框图如上所示,由五个51单片机最小系统组成,其中四个用于fft的具体运算,一个用于控制。

控制器两个专门输出端接于运算器1的两个中断管脚,运算器1的两个输出端接于运算器2的两个中断管脚,以此类推,最终运算器4的输出端接到控制器的某个输入端,作为反馈信号,当某一动作完成时通知控制器。

四、调试流程

系统运行流程大致如下图所示:

五、遇到的问题及解决方法

1.每一步蝶形所需数据不同,若每一层蝶形运算都重新取值的话则大大浪费时间。

解决:

若使用“先倒序后计算”方法,则前4步蝶形是单独一个片内64点本身的运算,后两步则才需要其他几个片子的运算结果。

所以为解决每一步存取浪费时间的问题,在前4步中,用各自的倒序代替存取,便可以大大节省时间,最后两步则将所有数据集合到扩展存储器中,重新分配给每个运算器。

这样也可以使控制器后期的程序设计更加连贯,控制器在完成了最后一步倒序后,直接组织输出

2.控制器对四个运算器控制的实现。

51单片机外部中断引脚有两个int0和int1,这样,每个运算器中只允许两个中断服务程序,而每个运算器又要完成“读、写、计算”几个动作。

在程序设计的过程中,我们将“读”和“计算”合并,即读数过后直接进算,只在读数结束后输出一个信号,通知下一个片子开始读数。

这样的话,后面的片子还在取值过程中的时候,前面的片子已经开始了计算,一定程度上节省了时间,同时解决了控制的问题。

3.W值的获得

由于c51编程中,允许变量定义的空间并不多。

在程序调试过程中:

autosegmenttoolarge的问题出现了多次。

经过我们粗略计算,发现对于256点fft,每个片中128点的w值是占空间的首要。

所以,我们将w值定义为常量,由扩展存储器中取出,放在每个片子的程序中去,而每个片子放程序的rom又足够大,这样,既节省了计算w值所需要的时间,又节省了空间。

4.几个片子对于一个扩展存储器的共享

实际上,这个问题我们在硬件实现上遇到的麻烦远比软件上麻烦很多,5个片子都要共享同一些地址/数据管脚,会遇到诸如“电流串扰“等等问题,这可能也成为了我们最终结果不尽如人意的原因之一。

在软件方面,考虑到硬件实现中的延迟等问题,同步问题不好解决,对存储器的存取操作采用时分的方式进行,虽然地址指针改变等问题实现起来较为繁琐,但具有很高的可操作性,可实现性。

六、原理图

总体图

单个最小系统图

控制器与扩展存储器

Adc

七、程序流程图和原代码

Fft核心算法流程

结束

写值

T=A(k)+A(k+B)WNp

A(k+B)=A(k)–A(k+B)WNp

A(k)=T

倒序

读入x(n)64点128点w值

开始

源代码:

Ic1:

#include<

reg52.h>

//51芯片管脚定义头文件

intrins.h>

//内部包含延时函数_nop_();

absacc.h>

//绝对地址访问的头文件

#defineucharunsignedchar

#defineuintunsignedint

uintRAMADDR=0x6000;

#defineRAM_6264XBYTE[RAMADDR]//6264地址范围H-7FFFH

sbitst=P3^0;

sbitce=P2^6;

sbitoe=P2^5;

sbitin=P3^1;

ucharn;

/**********************************************************

延时t毫秒

11.0592MHz时钟,延时约ms

**********************************************************/

voiddelayms(uintt)

{

uchark;

while(t--)

for(k=0;

k<

125;

k++)

{;

}

主函数

voidmain()

ucharval;

n=0;

EA=1;

EX0=1;

IT0=1;

val=0;

P0=0xff;

P1=0xff;

P2=0xff;

P3=0xff;

RAMADDR=0x6000;

//6264首地址

oe=0;

ce=0;

st=1;

delayms(100);

st=0;

delayms(500);

val=P1;

RAM_6264=val;

//数据写入

RAMADDR++;

for(n=0;

n<

256;

n++)//写个数据入

delayms(50);

//修改地址

delayms

(1);

while

(1)

n++)

temp=RAM_6264;

//从中读取数据

temp=~temp;

//输出为低电平动作

P1=temp;

//送P0口显示

delayms(200);

delayms(10);

oe=1;

ce=1;

RAM_6264=0x01;

RAM_6264=0x02;

ce=0;

oe=0;

in=0;

while

(1);

voidic1in()interrupt0

n++;

RAM_6264=n;

in=1;

Ic2:

math.h>

//数学函数

structcompx/*定義一個複數結構*/

{charreal;

charimag;

};

structcompxidatadat[65];

//FFT輸入輸出均從是s[1]開始存入

structcompxEE(structcompx,structcompx);

//定義複數相乘結構

voidFFT(structcompxxin[],intN);

/*定義FFT函數*/

structcompxEE(structcompxa1,structcompxb2)//兩複數相乘的程序

{structcompxb3;

//b3保存兩複數間的結果

b3.real=a1.real*b2.real-a1.imag*b2.imag;

//兩複數間的運算

b3.imag=a1.real*b2.imag+a1.imag*b2.real;

return(b3);

/*返回結果*/

sbitrw=P3^5;

sbitfin=P1^0;

sbitenwrite=P1^7;

ucharvol=0;

ucharenread=0;

ucharcalfin=0;

voidwrite();

voidread();

voidcal();

FFT

voidfft(structcompxxin[],intN)/*FFT函數體*/

{intf,m,nv2,nm1,i,k,j=1,l;

/*定義變量*/

structcompxv,w,t;

/*定義結構變量*/

nv2=N/2;

/*最高位值的權值*/

f=N;

/*f為中間變量*/

for(m=1;

(f=f/2)!

=1;

m++){;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1