17270|31

61

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

历时七天终于用28335鼓捣出了FFT和FIR [复制链接]

 
   楼主苦逼大二学生一枚,接触dsp已经一年的了,中间有一段时间去玩arm6410了,就把dsp丢了很长一段时间。大一51玩完了就搞了个28335的板子。以前都是用它来玩玩电机,完全当个单片机使。这个暑假想把dsp重拾起来,决定从数字滤波方面下手。自己找了些资料,开始的时候用的是C代码写的,DA输出用的也是一个串行的片子TLV5636,结果和现象是有了,但是频率一致上不去,很是头疼。后来发现TI官方有计算FIR滤波器的库函数,人家高手写的东西,效率会高一些吧,DA输出的片子也换成了并行的TLV5639,。
   有了这个想法第一件事就是上网查资料,可惜楼主找遍各大论坛,各大网站,各种书籍也没发现什么有用的这方面的资料。最终只找到一个ti官方给的文档《C28x-FPU-LIB-UG》,对于英语渣的我来说头疼死了,没办法就只有这个东西将就着看呗。看到这个东西,说实话TI一点都不同情弱者,文档给的毛毛躁躁的,完全就是随手写出来的东西。没办法只能就这文档和楼主的理解一点一点的试验。
   由于自己搞得时候十分头疼,所以决定把自己学到的东西记录下来,并帮助一下后来想要学习该方面知识的同学。
   主要是分析一下dsp28335的C28x_FPU_LIB.lib这个库,这个库十分强大,首先可以计算复数域的CFFT(Complex Fast Fourier Transform
),其中函数为void CFFT_f32 (CFFT_F32_STRUCT *) 。其中CFFT_F32_STRUCT为官方定义的一个结构体成员有
typedef struct
{ float32 *InPtr;
float32 *OutPtr;
float32 *CoefPtr;
float32 *CurrentInPtr;
float32 *CurrentOutPtr;
Uint16 Stages;
Uint16 FFTSize;
} CFFT_F32_STRUCT;

最新回复

计算*CurrentInPtr指向的复数数组中的复数的摩值,将计算出来的摩值保存在*CurrentOutPtr该成员指向的数组中,这个过程没有难度。  详情 回复 发表于 2018-9-22 19:03
 
点赞 关注(5)

回复
举报

61

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
CFFT_f32_mag(&cfft)计算幅值的函数,只与float32 *CurrentInPtr;
float32 *CurrentOutPtr这两个成员有关,主要作用就是计算*CurrentInPtr指向的复数数组中的复数的摩值,将计算出来的摩值保存在*CurrentOutPtr该成员指向的数组中,与其他成员无关。
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
接着第三个成员CoefPtr,为指向转化因子数组的指针,长度为FFTSize,决定傅里叶转化因子的只有傅里叶变换的阶数,换句话说就是样本点的个数,如果又不知道傅里叶转化因子是什么的建议百度一下你就知道。第四个成员CurrentInPtr也是指向输入数组的指针,但是该输入数组不同于上面的输入数组,这个指针的用途是用来计算幅值所用的,如果你想计算某一复数数组的幅值直接把该数组指针指向那个数组就好了。比如你想得出傅里叶变换后结果数组的幅值趋势便可以直接将该指针指向outputdata[2*FFTSize],当然有输入就有输出,CurrentOutPtr来指向幅值输出的数组
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

4
 
哎,刚刚写的东西全都没了,还没有完,楼主会陆续更新
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

5
 
先从结构体的每一个成员介绍起
InPtr为输入数组指针,假设你的CFFT的采样点1024个点,那么你的输入数组为inputdata[2*FFTSize]因为你是复数的FFT吗,所以实部和虚部都是需要进行存储的,所以输入数组的长度为2*FFTSize.其中实部和虚部的存储方式为inputdata[0]存储你第一点的实部,inputdata[1]存储第一点的虚部,接着依次向下inputdata[2]存储第二个点的实部,inputdata[3]第二个点的虚部。。。。。。。。。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

6
 
第二个成员OutPtr,为指向输出数组的指针,输出数组的大小也为2*FFTSize,存储方式同样的outputdata[0]为第一个点的实部,接着虚部,接着第二个点,第三个点。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

7
 
stage为傅里叶变换的阶数,FFTSize为FFT变换的长度FFTSize=2^stage
 
 
 

回复

165

帖子

0

TA的资源

一粒金砂(中级)

8
 
谢谢分享,学习一下啊。
 
 
 

回复

478

帖子

0

TA的资源

纯净的硅(初级)

9
 
加油楼主,其实高手写东西效率也不一定高,重要的是积累经验
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

10
 
楼主今天白天网断了,网上接着写一下各个函数的用法
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

11
 
楼主接着更新,前面主要讲了一个结构体,这个结构体在后面函数的应用是很重要的。下面主要分享一下函数的应用
第一个函数 CFFT_f32_sincostable(&cfft) 其中cfft就是上述的一个结构体,这个函数的作用就是计算傅里叶变换的转化因子。转化因子由公式可知转化因子只与你傅里叶变换的阶数有关,所以只要你在结构体中对stage和FFTSize进行了赋值就可以计算转化因子了,而且转化因子是固定的,如果不需改变傅里叶变换的阶数,只需要计算一次就好了。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

12
 
转化因子当然保存在*CoefPtr指向的数组中。第二个函数CFFT_f32(&cfft)这个是重头戏,他就是做复数傅里叶变换的函数,将*InPtr指向的数组中的复数进行傅里叶变换,然后将结果保存在*OutPtr指向的数组当中。此函数只与 float32 *InPtr;
float32 *OutPtr;
float32 *CoefPtr;
Uint16 Stages;
Uint16 FFTSize; 这几个成员有关系,与另两个无关
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

13
 
最后一个重头戏ICFFT_f32(&cfft),进行了傅里叶变化当然还不行,还要进行傅里叶反变换,将波形还原,直接调用它就好了,他会将*InPtr指向的数组中的复数进行傅里叶反变换,然后将值保存到输出数组中。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

14
 
网上有个有关傅里叶变换的教程蛮好的,可以说讲的很直白,容易理解下面是链接
http://blog.jobbole.com/70549/
 
 
 

回复

227

帖子

2

TA的资源

一粒金砂(高级)

15
 
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

16
 
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(初级)

17
 
FPU库
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

18
 
期待楼主分享,谢谢!
 
 
 

回复

43

帖子

0

TA的资源

一粒金砂(中级)

19
 
虽然看datasheet都可以,不过lz精神还是可嘉,而且lz好像还漏了内存对齐
 
 
 

回复

297

帖子

0

TA的资源

一粒金砂(中级)

20
 
感谢分享!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表