打印
[STM32F0]

STM32F0 FFT

[复制链接]
472|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llljh|  楼主 | 2022-1-2 09:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我这样计算出来的值是不是对的?为什么每个频率上都有值啊?

使用特权

评论回复
沙发
llljh|  楼主 | 2022-1-2 09:31 | 只看该作者

使用特权

评论回复
板凳
zhenykun| | 2022-1-2 09:38 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
地板
llljh|  楼主 | 2022-1-2 09:40 | 只看该作者
程序是这样子:
用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);
}

使用特权

评论回复
5
stly| | 2022-1-2 09:42 | 只看该作者
给的是什么信号做 FFT, 不会是白噪声?

使用特权

评论回复
6
llljh|  楼主 | 2022-1-2 09:45 | 只看该作者

使用特权

评论回复
7
llljh|  楼主 | 2022-1-2 09:49 | 只看该作者
用跳线直接从C11接到R14,然后采集AD值,然后FFT

使用特权

评论回复
8
jlyuan| | 2022-1-2 09:51 | 只看该作者
lbufin[ai*2] = (float)(adc_buf[ai*2]-2048);
是不是这里数据范围不对,要正负数的。。。

使用特权

评论回复
9
llljh|  楼主 | 2022-1-2 09:53 | 只看该作者
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;
           }

这里调整过来还是那样子

使用特权

评论回复
10
supernan| | 2022-1-2 09:56 | 只看该作者
如果你的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;//虚部

使用特权

评论回复
11
llljh|  楼主 | 2022-1-2 09:58 | 只看该作者

使用特权

评论回复
12
llljh|  楼主 | 2022-1-2 10:01 | 只看该作者

使用特权

评论回复
13
llljh|  楼主 | 2022-1-2 10:06 | 只看该作者
NPT = 64 长度符合要求
按照官方提供的例程的数据运行自己写的程序和按官方的例程运行结果是一样的。按照你所写的将运行结果在除以32,可以把幅值限定在一个小值(最后一张图)

使用特权

评论回复
14
jiahy| | 2022-1-2 10:08 | 只看该作者
是不是STM32F0的FFT结果本身就是这样呢?

使用特权

评论回复
15
huangchui| | 2022-1-2 10:11 | 只看该作者
是不是STM32F0的FFT结果本身就是这样呢?

使用特权

评论回复
16
llljh|  楼主 | 2022-1-2 10:13 | 只看该作者

使用特权

评论回复
17
dingy| | 2022-1-2 10:14 | 只看该作者
你找个固定频率信号测试一下FFT的结果频率点在不在啊

使用特权

评论回复
18
llljh|  楼主 | 2022-1-2 10:17 | 只看该作者
试一下吧

使用特权

评论回复
19
llljh|  楼主 | 2022-1-2 10:19 | 只看该作者
用固定点试了一下,需要除以32才是对的。应该是采集电路噪音有干扰。结案,谢谢!!

使用特权

评论回复
20
chuxh| | 2022-1-2 10:21 | 只看该作者
上面写错了,没有正负值了,不能那样写。还有除以32是哪来的,应该是不用除的。。。

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

使用特权

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

本版积分规则

855

主题

11301

帖子

6

粉丝