打印
[应用相关]

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

[复制链接]
3885|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mxinfa|  楼主 | 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.21ic.com/upfiles/img/20093/200933122611368.rar
沙发
computer00| | 2009-3-31 22:22 | 只看该作者
板凳
mxinfa|  楼主 | 2009-3-31 22:48 | 只看该作者

谢谢圈圈

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

使用特权

评论回复
地板
lut1lut| | 2009-4-1 12:01 | 只看该作者

我用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)。

使用特权

评论回复
5
mxinfa|  楼主 | 2009-4-1 13:15 | 只看该作者

感谢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测试了吗?再次感谢

使用特权

评论回复
6
mxinfa|  楼主 | 2009-4-1 15:30 | 只看该作者

怎么世上什么人都有

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

使用特权

评论回复
7
selina1983| | 2012-5-23 23:17 | 只看该作者
mark:D^_^:D

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

198

帖子

1

粉丝