社区导航

 

搜索
查看: 12912|回复: 31

[原创] 历时七天终于用28335鼓捣出了FFT和FIR

  [复制链接]

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-7-29 21:55 | 显示全部楼层 |阅读模式
   楼主苦逼大二学生一枚,接触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;


回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-7-30 19:51 | 显示全部楼层
CFFT_f32_mag(&cfft)计算幅值的函数,只与float32 *CurrentInPtr;
float32 *CurrentOutPtr这两个成员有关,主要作用就是计算*CurrentInPtr指向的复数数组中的复数的摩值,将计算出来的摩值保存在*CurrentOutPtr该成员指向的数组中,与其他成员无关。

回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-7-29 22:09 | 显示全部楼层
哎,刚刚写的东西全都没了,还没有完,楼主会陆续更新

回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-7-29 22:23 | 显示全部楼层
第二个成员OutPtr,为指向输出数组的指针,输出数组的大小也为2*FFTSize,存储方式同样的outputdata[0]为第一个点的实部,接着虚部,接着第二个点,第三个点。

回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-7-29 22:45 | 显示全部楼层
stage为傅里叶变换的阶数,FFTSize为FFT变换的长度FFTSize=2^stage

回复

使用道具 举报

181

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-7-30 05:47 | 显示全部楼层
谢谢分享,学习一下啊。

回复

使用道具 举报

346

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-7-30 09:17 | 显示全部楼层
加油楼主,其实高手写东西效率也不一定高,重要的是积累经验

回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-7-30 19:21 | 显示全部楼层
楼主今天白天网断了,网上接着写一下各个函数的用法

回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-7-30 19:47 | 显示全部楼层
转化因子当然保存在*CoefPtr指向的数组中。第二个函数CFFT_f32(&cfft)这个是重头戏,他就是做复数傅里叶变换的函数,将*InPtr指向的数组中的复数进行傅里叶变换,然后将结果保存在*OutPtr指向的数组当中。此函数只与 float32 *InPtr;
float32 *OutPtr;
float32 *CoefPtr;
Uint16 Stages;
Uint16 FFTSize; 这几个成员有关系,与另两个无关

回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-7-30 19:54 | 显示全部楼层
最后一个重头戏ICFFT_f32(&cfft),进行了傅里叶变化当然还不行,还要进行傅里叶反变换,将波形还原,直接调用它就好了,他会将*InPtr指向的数组中的复数进行傅里叶反变换,然后将值保存到输出数组中。

回复

使用道具 举报

70

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-7-30 19:56 | 显示全部楼层
网上有个有关傅里叶变换的教程蛮好的,可以说讲的很直白,容易理解下面是链接
http://blog.jobbole.com/70549/

回复

使用道具 举报

226

TA的帖子

2

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2015-7-30 20:24 | 显示全部楼层

回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-9-7 14:06 | 显示全部楼层

回复

使用道具 举报

23

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2015-9-28 15:53 | 显示全部楼层
FPU库

回复

使用道具 举报

52

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-12-15 22:27 | 显示全部楼层
期待楼主分享,谢谢!

回复

使用道具 举报

46

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-12-16 14:39 | 显示全部楼层
虽然看datasheet都可以,不过lz精神还是可嘉,而且lz好像还漏了内存对齐

回复

使用道具 举报

253

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2016-1-11 10:42 | 显示全部楼层
感谢分享!

回复

使用道具 举报

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

关闭

站长推荐上一条 1/4 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-5 19:51 , Processed in 0.564348 second(s), 43 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表