小试256点fft,望圈圈、lut1lut、香版主指教

wgmdsf   2009-3-31 22:08 楼主
我使用MDK3.22,首先已按照lut1lut的帖子修改了汇编代码。数据源参考了圈圈的“FFT结果的物理意义”中的数据,我把圈圈的256个数据*1024然后作的四舍五入取整。结果与圈圈文章中分析的基本一致,第0点、50点、75点数据比较大,此三点数据为(模值15.96878、11.99178、6.007833)其余数据基本等于0(<0.06),最终的模值我已作了除以NPT或NPT/2的处理(NPT为点数),但没有做前面放大的那个1024倍处理,因为无所谓,咱们要的只是一个相对值。有如下问题:
1、按照圈圈的文章我在直流点做了模值除以NPT,其余点做了模值除以NPT/2的处理,但大家看最后的结果,直流点处的值为15.96878,如果这个值再除以2,那么这三点的结果恰好是7.98439:11.99178:6.007833=8:12:6与圈圈文章中的结果2:3:1.5完全一致,此处的直流出了什么问题?怎么解释?
2、附件代码中的那几个数组只能定义成全局变量,如果定义成局部变量,不是编译有警告(变量定义但没有使用)就是运行结果不对,或者是在仿真运行过程中报错。这又是什么原因?怎么解决?我想可能是以下原因,首先是不是调汇编代码只能使用全局变量?(猜的)第二,附件代码中是一个纯粹的软仿真256点的fft,我没有作任何对硬件部分的初始化,但我把代码移植到一个带有初始化代码的项目中,这个全局变量的问题依然没有解决。公司一个搞软件的分析说还有可能是汇编中还有bug没完全找到,他说堆栈可能有覆盖。
其实分析到这里我觉得这个fft的库已经非常不错了,可以用了,直流需要再除以一个2,那咱就再除以一个2就是了,并且一般情况下直流对咱们也没什么用;只能定义成全局变量,那咱就定义成全局变量得了呗。
附件中是我做试验的代码以及圈圈的文章。
请圈圈、lut1lut、香版主以及其他高手不吝赐教,对stm32我是初学,连开发板还没买呢。
相关链接:https://bbs.eeworld.com.cn/upfiles/img/20093/200933122611368.rar

回复评论 (10)

谢谢圈圈

                                 圈圈回帖真及时。这个库的效率非常高,pdf上的测试数据1024点的在ram中只要1.768ms,flash中也才2.138ms(IAR环境),这个速度有很强的实用价值了。不少网友说64点的没有问题,256和1024点的代码不能用,lut1lut朋友给出了汇编代码的修改的办法。今天测试了一下,感觉基本能用,但有上面的问题。望大家指教
点赞  2009-3-31 22:48

是吧?放弃C2K转投STM32阵型啦!

都是搞算法,ARM公司比TI更慷慨!
TI老忽悠我们。
点赞  2009-4-1 10:45

我用LZ的数据跑了一下

第一:按照LZ附件代码中的
u32 lBUFIN[NPT]={
         4708, 2910 ,...... -1773 , 2978 };  这样的形式

得到0频,50Hz,75Hz的三个频点的分别模值为2044,1534,729。然后对直流分量/2处理,得到1022,1534,769,符合圈圈例子中2:3:1.5的比例

第二:理论上说,这里的数据处理形式有点问题,虽然对最后的数据结果影响不大。

因为LZ验证的时域数据有负数,是一个虚部为0,实部为负数的值;如果按照u32直接处理,比如-294,就成了0xffff,feda。这实际上代表的是一个虚部为-1,实部为-294的时域数据;这个-264,应该表示为0x0000,feda。所以,应该把以上256个时域数据先(s16) --> (u16) --> (u32)。
点赞  2009-4-1 12:01

感谢lut1lut

这两点完全接受,我自己查了半天才发现是代码写错了,在计算完了0点的模值之后
Vol[0]=sqrt(outimag[0]*outimag[0]+outreal[0]*outreal[0])/NPT;
下面那个循环
for(i=0;i<NPT/2;i++)
{
Vol=2*(sqrt(outimag*outimag+outreal*outreal))/NPT;
}
竟然又写成了从0开始。错误就是在这里。lut1lut肯定看出来了,就是不告诉俺,考俺呢。
那个全局变量的问题lut1lut测试了吗?再次感谢
点赞  2009-4-1 13:15

无聊到极~

                                  
点赞  2009-4-1 13:46

要lutlut来帮你找自己范的错误,

                                  
点赞  2009-4-1 13:50

怎么世上什么人都有

                                 我要是知道是我自己犯的错误我会故意往上放去耽误别人的时间吗?我承认我很菜,您自己就没有在网上给您人找过错误或者被别人找过错误吗?关于stm32的256点的fft这些东西是我做了一下午的结果,放到网上我觉得是对大家有益的。我如果把代码直接一放,别的什么都不说,肯定会赢来一片喝彩之声。什么“顶,支持,感谢”之类的话,跟帖的肯定会比现在多。 Netjob您不觉得您这两帖有浪费网络流量,浪费21ic服务器硬盘之嫌吗?
点赞  2009-4-1 15:30

等有空,我把ARM7的FFT与CM3的FFT PK一下!

都是汇编写的,一个是ARM7,一个是CORTEX-M3

如果是64点, ARM7的CODE=748 [注释1], CORTEX-M3(STM32)CODE=718 [注释1]

代码量差不多,就看CPU CYCLES 是多少了,STM32的是 5661个cycles
0.078 ms;

[注释1]:
1. FFT code size was computed with FFT coefficients table stored in Flash memory. If the FFT coefficients
are stored in SRAM, the code size of the three FFT functions is equal to 480 bytes.

点赞  2009-4-2 09:24

如果在S3C2440 下,肯定比STM32快好多,哈哈!

                                  
点赞  2009-4-2 09:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复