OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14735|回复: 13

STM32F405的FFT,衰减很严重,怎么解决?

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-10-30
在线时间
11 小时
发表于 2014-4-29 17:49:25 | 显示全部楼层 |阅读模式
用STM32F405的DSP库做64点FFT,衰减很大, 是我用错了么,有用过的老师么,指导一下。
另这个信号怎么用F4的FFT,插值的话,误差很大。

#define Fs 14400.0f
#define PI2 PI*2.0f

for(i=0;i<288;i++)
     adcfft=1000.0f+100.0f*arm_sin_f32(PI2*i*50.0f/Fs)+ 10.0f * arm_cos_f32(PI2*i*100.0f/Fs) + 1.0f*arm_sin_f32(PI2*i*150.0f/Fs);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2014-4-29 23:12:29 | 显示全部楼层
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2014-4-30 08:40:09 | 显示全部楼层
什么是衰减很大、
你的插值又是指的神马、
什么又是误差很大、
+_+
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2014-4-30 09:07:06 | 显示全部楼层
我简单说一下你的问题。

你的窗是个64点的窗,采样频率是14400.

所以频率的物理分辨率为 14400/64 = 225Hz.(这是由于原频谱和sa卷积所造成的)

但是信号一个是50Hz, 一个是100Hz,一个是150Hz,在FFT是无法分辨这些频率的。

虽然不知道你的到底表述的是什么,不过根据你的这个信号,用64点做FFT,根本就是有问题的。
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-10-30
在线时间
11 小时
 楼主| 发表于 2014-4-30 13:31:17 | 显示全部楼层
回复【4楼】lsj9383:
---------------------------------
感谢回答,其实是两 个问题,我没写清楚。
一、64点FFT是指的#define Fs 3200.0f 时,50Hz的是基波,100Hz的幅值是10,但FFT出来的只有9.4,150Hz的幅值是1.0,FFT出来的是0.8多,就是频率越高越小,
二、Fs 14400.0f时,一个窗是288点,但这个点数怎么做FFT啊?我所做的是去掉一些点,按线性再加上一些点,变成256个点,做256点FFT。这么做不知道对不对。
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2014-4-30 18:07:38 | 显示全部楼层
1.fs=3200Hz,fft点数为64, 信号是50Hz 100Hz 150Hz的FFT如下图,和理论结果一致。不知道你所指的衰减情况是指的什么?



2.288点的FFT,可以减两个点来做FFT,也可以补零不到512做FFT。建议用补零的方法,因为减两个点会造成物理频率分辨率的轻微降低。
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-10-30
在线时间
11 小时
 楼主| 发表于 2014-5-1 14:07:58 | 显示全部楼层
回复【6楼】lsj9383:
---------------------------------
感谢!

一、在matlab上没有问题,我所说的是用F4的DSP库的基4FFT的时候有衰减。
      我换了个DSP上的基2FFT的程序,做64点的运算也是没有问题,
      ST的库不应该有问题的吧,还是在用的时候有一些设置,我没有做到。
我的F4的工程设置在Target-->C/C++中define STM32F4XX,USE_STDPERIPH_DRIVER,__FPU_PRESENT,__FPU_USED,ARM_MATH_CM4,__CC_ARM
Target-->Target中选上Use FPU
FFT部分程序:
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;
 arm_status status;
arm_cfft_radix4_instance_f32 S;
int i;
float Fs=3200.0f;
for(i=0;i<64;i++)//取128点做FFT时,结果是每隔一个取一个值,其他值约为0,取64点时,数比较乱,过后我把数据发上来。
adcfft=1000.0f+100.0f*arm_sin_f32(PI*2.0f*i*50.0f/Fs)+ 10.0f * arm_cos_f32(PI*2.0f*i*100.0f/Fs) +1.0f*arm_sin_f32(PI*2.0f*i*150.0f/Fs);
__NOP();
 status = ARM_MATH_SUCCESS;
  status = arm_cfft_radix4_init_f32(&S,256,ifftFlag, doBitReverse);
  arm_cfft_radix4_f32(&S,adcfft);
  arm_cmplx_mag_f32(adcfft,testOutput,64);//复数求幅值

二、288点的无论是补0还是去几个点,在用F4的FFT时数据都比较乱,除了直流分量正确,高次的都不对,我再用DSP的程序试下。
三,感觉F4的库不该有问题,但又找不到哪里错了。
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-10-30
在线时间
11 小时
 楼主| 发表于 2014-5-1 14:14:17 | 显示全部楼层
一、程序
    #define FFS 3200.0f
    for(i=0;i<128;i++)
        adcfft=1000.0f+100.0f*arm_sin_f32(PI2*i*50.0f/FFS)+ 10.0f * arm_cos_f32(PI2*i*100.0f/FFS) + 1.0f*arm_sin_f32(PI2*i*150.0f/FFS);
    __NOP();

    __nop();

      status = ARM_MATH_SUCCESS;
      status = arm_cfft_radix4_init_f32(&S,64,ifftFlag, doBitReverse);
      arm_cfft_radix4_f32(&S,adcfft);
    __nop();
      arm_cmplx_mag_f32(adcfft,testOutput,64);
    __nop();
二、用128点做64FFT结果



三,用128点做64FFT幅值
直流分量: 90509.67/1.414/64=1000.15 
基波分量:4297.978/1.414/32=94.980   ........


回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-10-30
在线时间
11 小时
 楼主| 发表于 2014-5-1 14:18:56 | 显示全部楼层
四,64点做64点FFT,结果看上去很乱

回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2014-5-2 17:35:01 | 显示全部楼层
1、我没用过dsp库,也不熟悉基4FFT,所以可能基4FFT的对点数的要求可能与基2FFT有点不一样、、、
2、这样用表格直接看数据很不直观,建议还是在matlab下显示图、、、
回复 支持 反对

使用道具 举报

7

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2013-4-9
在线时间
25 小时
发表于 2014-9-21 21:44:58 | 显示全部楼层
有可能是这样  m4的fft库因为用的是基4,只能做16 64 256 1048点的fft,如果你用的是arm_cfft_radix4_f32复数求的话,要把16点或者64点或者256点或1024点 扩展两倍 就是32点 128点 256点 2048点的数组作为输入,偶数项是你的采样值,奇数项填0。你128点做的了,64点混乱,我觉得是128点的时候按照64点去做fft了。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2015-2-7
在线时间
0 小时
发表于 2015-2-7 15:02:45 | 显示全部楼层
我现在用fft 通过stm32 F103 AD 采集出来了,送到FFT运算,输入分别是 市电三相 电压和三相电流,经过FFT 计算出各相的 电压 电流,基波 和各次谐波。实部 和虚部,。怎么计算电压,电流 的 有功功率 和无功功率 ,和功率因数怎么算啊。能给个例程吗
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-4-30 09:39:56 | 显示全部楼层
回复【12楼】涛涛:
---------------------------------
请问楼主做得怎样了?fft运算前是不是需要进行加窗处理啊?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-6-16
在线时间
0 小时
发表于 2015-6-16 17:33:04 | 显示全部楼层
楼主,这个问题解决了吗?我也发现这种问题,导致计算出数据成循环波动
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 18:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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