[STM32F0]

STM32F0 FFT 请求老友的帮助,不胜感谢!!!

[复制链接]
2640|23
手机看帖
扫描二维码
随时随地手机跟帖
@lee|  楼主 | 2019-8-19 10:13 | 显示全部楼层 |阅读模式

请教:我这样计算出来的值是不是对的?为什么每个频率上都有值啊?
fft2.png
程序是这样子:
用ADC采集值填入fft输入buff
void ADC_proc(void)
{
    uint16_t ai,cnt;
        
    if(adc_conv_done)
    {
       adc_conv_done = 0;


            for(ai=0;ai<NPT;ai++)
                {
                      lbufin[ai*2] = (float)(adc_buf[ai*2]-2048);
                          lbufin[ai*2+1] = (float)0;
                }
          FFT_proc();      
         HAL_ADC_Start_DMA(&hadc,(uint32_t*)adc_buf,sizeof(adc_buf)/2);
    }
}



FFT处理



float  lbufin[NPT*2];                                                           /* Complex input vector */
float  lbufout[NPT];                                                          /* Complex output vector */
float  lbufmag;                                                                  /* Magnitude vector */
uint16_t fftSize = 64;


uint8_t ifftFlag = 0;
uint8_t doBitReverse = 1;
uint16_t audio_mag;
extern  uint8_t  audio_intf_flag;
//uint32_t refIndex = 213,
uint32_t testIndex = 0;
__IO uint8_t  new_mag_flag;


void FFT_proc()
{                     
    arm_cfft_f32(&arm_cfft_sR_f32_len64, lbufin, ifftFlag, doBitReverse);
        arm_cmplx_mag_f32(lbufin,lbufout,fftSize);
    arm_max_f32(lbufout, NPT, &lbufmag, &testIndex);
}

使用特权

评论回复
airwill| | 2019-8-19 23:11 | 显示全部楼层
给的是什么信号做 FFT, 不会是白噪声?

使用特权

评论回复
@lee|  楼主 | 2019-8-20 09:43 | 显示全部楼层
本帖最后由 @lee 于 2019-8-20 09:44 编辑
airwill 发表于 2019-8-19 23:11
给的是什么信号做 FFT, 不会是白噪声?


ADC2.png
用跳线直接从C11接到R14,然后采集AD值,然后FFT

使用特权

评论回复
WoodData| | 2019-8-20 13:53 | 显示全部楼层
lbufin[ai*2] = (float)(adc_buf[ai*2]-2048);
是不是这里数据范围不对,要正负数的。。。

使用特权

评论回复
@lee|  楼主 | 2019-8-20 14:08 | 显示全部楼层
WoodData 发表于 2019-8-20 13:53
lbufin[ai*2] = (float)(adc_buf[ai*2]-2048);
是不是这里数据范围不对,要正负数的。。。 ...

for(ai=0;ai<NPT;ai++)
           {
              lbufin[ai*2] = (float)(((short int)adc_buf[ai*2+1]-2048)/32);
                  lbufin[ai*2+1] = (float)0;
           }

这里调整过来还是那样子

使用特权

评论回复
WoodData| | 2019-8-20 14:35 | 显示全部楼层
如果你的ADC是12位的,按下面试一下。还有你要确定ADC采样数据达到的指定的NPT个数.
if(adc_buf[ai*2] > 2048)
    lbufin[ai*2] = (float)((int)adc_buf[ai*2]-2048);//实部
else
    lbufin[ai*2] = (float)(2048-(int)adc_buf[ai*2]);//实部
lbufin[ai*2+1] = (float)0;//虚部

使用特权

评论回复
@lee|  楼主 | 2019-8-20 14:49 | 显示全部楼层
WoodData 发表于 2019-8-20 14:35
如果你的ADC是12位的,按下面试一下。还有你要确定ADC采样数据达到的指定的NPT个数.
if(adc_buf[ai*2] > 20 ...

fft3.png fft4.png fft5.png

NPT = 64 长度符合要求
按照官方提供的例程的数据运行自己写的程序和按官方的例程运行结果是一样的。按照你所写的将运行结果在除以32,可以把幅值限定在一个小值(最后一张图)


是不是STM32F0的FFT结果本身就是这样呢?
fft6.png

使用特权

评论回复
WoodData| | 2019-8-20 15:01 | 显示全部楼层
你找个固定频率信号测试一下FFT的结果频率点在不在啊

使用特权

评论回复
@lee|  楼主 | 2019-8-20 15:15 | 显示全部楼层
WoodData 发表于 2019-8-20 15:01
你找个固定频率信号测试一下FFT的结果频率点在不在啊

试一下吧

使用特权

评论回复
@lee|  楼主 | 2019-8-20 15:31 | 显示全部楼层

用固定点试了一下,需要除以32才是对的。应该是采集电路噪音有干扰。结案,谢谢!!

使用特权

评论回复
WoodData| | 2019-8-20 16:34 | 显示全部楼层
上面写错了,没有正负值了,不能那样写。还有除以32是哪来的,应该是不用除的。。。

lbufin[ai*2] = adc_buf[ai*2];//实部
bufin[ai*2]  -= 2048.0;
lbufin[ai*2+1] = 0.0;//虚部

使用特权

评论回复
@lee|  楼主 | 2019-8-21 08:59 | 显示全部楼层
WoodData 发表于 2019-8-20 16:34
上面写错了,没有正负值了,不能那样写。还有除以32是哪来的,应该是不用除的。。。

lbufin[ai*2] = adc_b ...

果然这样效果更好。
我用固定频率试了一下,计算出来的幅值要除以32才是实际幅值,我把除32移到输出值去似乎更好理解

使用特权

评论回复
憨厚诚实大叔| | 2019-8-21 09:44 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2019-8-21 09:45 编辑

频谱泄漏,每个结果都有值是正常的。但是你的结果显示的频谱分布好像是噪声。

使用特权

评论回复
@lee|  楼主 | 2019-8-21 10:03 | 显示全部楼层
本帖最后由 @lee 于 2019-8-21 10:05 编辑
憨厚诚实大叔 发表于 2019-8-21 09:44
频谱泄漏,每个结果都有值是正常的。但是你的结果显示的频谱分布好像是噪声。 ...

牛比,上传的照片是没接音频的。下图正常吗?采样频率55555.555 采样点数是 64
fft7.png

使用特权

评论回复
憨厚诚实大叔| | 2019-8-21 10:24 | 显示全部楼层
@lee 发表于 2019-8-21 10:03
牛比,上传的照片是没接音频的。下图正常吗?采样频率55555.555 采样点数是 64

...

你应该是刚刚接触才会问这个问题,你先用几个不同频率的正弦波叠加计算结果放进去计算,看看结果跟预期一致否,验证FFT计算是否正确。你做音频的话,应该只是显示而已,对频率分辨率是没什么要求的。

假设采样频率为fs,采样点数为N,那么FFT结果就是一个N点的复数,每一个点就对应着一个频率点,某一点n(n从1开始)表示的频率为:fn=(n-1)*fs/N。

https://www.cnblogs.com/NickQ/p/8540487.html

使用特权

评论回复
评论
@lee 2019-8-21 20:43 回复TA
@憨厚诚实大叔 :非常感谢! 
憨厚诚实大叔 2019-8-21 10:25 回复TA
只能帮你到这里了,看不懂我也没辙了。 
ayb_ice| | 2019-8-21 15:06 | 显示全部楼层
本帖最后由 ayb_ice 于 2019-8-21 15:34 编辑

浮点的FFT,结果是放大了N倍的直流放大了N倍,其它点放大了N/2倍

使用特权

评论回复
@lee|  楼主 | 2019-8-21 20:39 | 显示全部楼层
憨厚诚实大叔 发表于 2019-8-21 10:24
你应该是刚刚接触才会问这个问题,你先用几个不同频率的正弦波叠加计算结果放进去计算,看看结果跟预期一 ...

是啊,刚好要用到FFT,以前也没怎么认真学,受教了,谢谢!

使用特权

评论回复
@lee|  楼主 | 2019-8-21 20:40 | 显示全部楼层
ayb_ice 发表于 2019-8-21 15:06
浮点的FFT,结果是放大了N倍的直流放大了N倍,其它点放大了N/2倍

原来是这样子的,这就顺理成章了,感谢!

使用特权

评论回复
ayb_ice| | 2019-8-22 08:30 | 显示全部楼层
@lee 发表于 2019-8-21 20:40
原来是这样子的,这就顺理成章了,感谢!

整数的FFT没有放大,可以有效避免溢出,
浮点溢出不可能,所以放大了,可以简化中间处理过程

使用特权

评论回复
@lee|  楼主 | 2019-8-22 10:49 | 显示全部楼层
ayb_ice 发表于 2019-8-22 08:30
整数的FFT没有放大,可以有效避免溢出,
浮点溢出不可能,所以放大了,可以简化中间处理过程 ...

这么叼,叹服!

使用特权

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

本版积分规则

1

主题

12

帖子

0

粉丝