打印

求教:st官方的FFT算法是不是不对??

[复制链接]
2349|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qianlihu|  楼主 | 2013-6-18 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
float sig1 = 500*sin(50*2*3.1415926*i*3200);//采样频率为3200,256点 分辨率为 3200/256=12.5hz
float sig2 = 250*sin(100*2*3.1415926*i*3200);
bufin[i]   = sig1 +sig2 + 2048;
cr4_fft_256_stm32(bufout,bufin,256);
lX= (bufout[nfill]<<16)>>16;     //简单修改了powermag
lY= (bufout[nfill] >> 16);   
X=  64*((float)lX)/32768;
Y = 64*((float)lY)/32768;
Mag = sqrt(X*X+ Y*Y)/64;  
GUI_DispFloat((u32)(Mag*65536),9);  显示
GUI_DispString("\n");
如上 分辨率为12.5hz 用了 50hz和250hz的信号源和直流分量,但是结果 直流分量计算为2044(应2048);50hz(nfill=4,12.5*4)时结果为261(应为500)250hz时为185346(应为200)并且凡是应为0的分量大部分都等于了185326,这个FFT算法是不是不对啊?
沙发
qianlihu|  楼主 | 2013-6-18 10:20 | 只看该作者
上边写错了 应为 100hz时 结果为185346(应为250);

使用特权

评论回复
板凳
田宏亮| | 2013-6-19 16:08 | 只看该作者
本帖最后由 田宏亮 于 2013-6-19 16:50 编辑

1、sig1和sig2表达式有误,我觉得应为sig1 = 500*sin(50*2*3.1415926*i / 3200),sig2 = 250*sin(100*2*3.1415926*i / 3200)。
2、cr4_fft_256_stm32函数输入、输出数据是Q15格式。sig1 +sig2 + 2048取整后,最大值约2696,只有Q15格式最大值的8.2%,信号放大10倍后结果明显改善。
原信号输入结果为:直流2044,基波252,2次谐波127;放大10倍后结果为:直流20472、基波2502,2次谐波1251。此结果的输入数据是原浮点信号取整后乘10,如果原浮点信号直接放大10倍再取整效果可能会更好。为防止溢出,函数很可能对输入的数据进行了处理,这要仔细看汇编代码才能确定。定点数运算也会有舍入误差的影响。
3、信号FFT后会有一个和采样点数相关的幅度比例(2/N),直流除外。
4、我得到基波、2次谐波的结果和你给出的完全不同。不知道你在定义实部、虚部用的什么数据类型。有没有可能是数据符号在以为时发生了错误?
仅供参考。

使用特权

评论回复
地板
zeluo| | 2013-6-20 07:38 | 只看该作者
不是很了解这一块   楼主   帮你顶一个   看看别人的意见吧  

使用特权

评论回复
5
mmuuss586| | 2013-6-20 08:50 | 只看该作者
看看,M4的函数库吧,通用的。

使用特权

评论回复
6
qianlihu|  楼主 | 2013-6-21 18:47 | 只看该作者
田宏亮 发表于 2013-6-19 16:08
1、sig1和sig2表达式有误,我觉得应为sig1 = 500*sin(50*2*3.1415926*i / 3200),sig2 = 250*sin(100*2*3.1 ...

最近被派有其他任务 谢谢你的指教,看来这个事情得过几天才能解决了

使用特权

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

本版积分规则

7

主题

34

帖子

1

粉丝