硬汉嵌入式论坛

 找回密码
 立即注册
查看: 9751|回复: 7
收起左侧

[有问必答] STM32 DSP库 IFFT问题

[复制链接]

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2021-1-12 09:42:56 | 显示全部楼层 |阅读模式
请问,参照例程使用Q15进行FFT和IFFT运算,发现FFT输入数据和IFFT输出数据差距较大,请问有大神做过相关功能吗?

static void arm_rfft_q15_app(void)
{
    uint16_t i,j;
    arm_rfft_instance_q15 S;
    fftSize = 1024;
    ifftFlag = 0;
    doBitReverse = 1;

     arm_rfft_init_q15(&S, fftSize, ifftFlag, doBitReverse);
   
    /*store based on real,real,real....*/
    for(i=0; i<1024; i++)
    {
        /* 51.2Hz???,???1024Hz?
           arm_sin_q15???????[0, 32768), ???20??????????,
           32768 / 20 = 1638.4
        */
        j = i % 20;
         testInput_q15_50hz[i] = arm_sin_q15(1638*j);
         //testInput_q15_50hz[i] = 15 + 10*arm_sin_f32(2*PI*i*100/1024) + 5.5*arm_sin_f32(2*PI*i*150/1024) ;
        //printf("%d\r\n", testInput_q15_50hz[i]);
    }
   
    /*output stored based on real,image,real,image.....*/
    arm_rfft_q15(&S, testInput_q15_50hz, testOutput_q15_50hz);

    for(i=0; i<fftSize; i++)
    {
        printf("%d\r\n", testOutput_q15_50hz[i]);   
    }
   
    for(i = 0; i < fftSize; i++)
    {
        testOutput_f32_10khz[i] = (float32_t)testOutput_q15_50hz[i]/32;    //?????
    }
   
     arm_cmplx_mag_f32(testOutput_f32_10khz, testOutput, fftSize);

    for(i=0; i<fftSize; i++)
    {
        //printf("%f\r\n", testOutput[i]);   //delete for tests
    }
}


static void arm_rifft_q15_app(void)
{
        fftSize = 1024;

        ifftFlag = 1;

        doBitReverse = 1;
   
        uint8_t i;
   
        arm_rfft_instance_q15 S;
   
        arm_rfft_init_q15(&S, fftSize, ifftFlag, doBitReverse);
        
        arm_rfft_q15(&S, testOutput_q15_50hz, testOutput1_q15_50hz);
   
      printf("printf the ifft data.");
        for(i=0; i<fftSize; i++)
    {
        printf("%d\r\n", testOutput1_q15_50hz[i]);
    }

}



int main(void)
{
    //uint8_t ucKeyCode;   
    uint8_t read;
   
    const char buf1[] = "&#189;&#211;&#202;&#213;&#181;&#189;&#180;&#174;&#191;&#218;&#195;ü&#193;&#238;1\r\n";

    bsp_Init();   
   
    PrintfLogo();  
    PrintfHelp();   

    bsp_StartAutoTimer(0, 100);   
   
    while (1)
    {
        /* CPU bsp.c */
        bsp_Idle();   

        if (comGetChar(COM1, &read))
        {
            switch (read)
            {
                case '1':
                    comSendBuf(COM1, (uint8_t *)buf1, strlen(buf1));
                    arm_rfft_q15_app();   
                    break;
               
                case '2':
                    arm_rifft_q15_app();
                    break;
                default:
                    break;
            }
        }
        
    }
}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-1-12 10:26:52 | 显示全部楼层
你这个是用arm_rfft_q15做的FFT,然后将输出数据再用arm_rfft_q15做FFT逆变换?

早期我在示波器上玩过,相位上有些错位,正弦波应该好点,你用我的方法玩下
https://forum.anfulai.cn/forum.php?m ... 2408&extra=page%3D1

上面是正变化,下面是逆变换

回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-1-12 11:40:26 | 显示全部楼层
eric2013 发表于 2021-1-12 10:26
你这个是用arm_rfft_q15做的FFT,然后将输出数据再用arm_rfft_q15做FFT逆变换?

早期我在示波器上玩过, ...

谢谢回复,顺便问一下,Q15和Q31值得是数据存储的格式吗?Q15代表的是需要进行处理的数据是以16位整形数据进行存储,而Q31是以32位浮点型进行存储??
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-1-12 12:22:41 | 显示全部楼层
liwei0225 发表于 2021-1-12 11:40
谢谢回复,顺便问一下,Q15和Q31值得是数据存储的格式吗?Q15代表的是需要进行处理的数据是以16位整形数 ...

Q是定点格式,用整数表示浮点数,Q15即Q1.15,1个符号位,后面15个bit是小数位。

常用的Q7,Q15和Q31都是定点数格式。如果你要用浮点方法要调用xxxx_f32或者f64结尾的API
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-1-12 16:09:51 | 显示全部楼层
eric2013 发表于 2021-1-12 12:22
Q是定点格式,用整数表示浮点数,Q15即Q1.15,1个符号位,后面15个bit是小数位。

常用的Q7,Q15和Q31 ...

请问,如果使用AD采集一些心率信号什么的,您建议使用哪种格式?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-1-12 16:16:27 | 显示全部楼层
liwei0225 发表于 2021-1-12 16:09
请问,如果使用AD采集一些心率信号什么的,您建议使用哪种格式?

用f32比较省事,如果你用的F4系列,因为带硬件FPU,计算浮点比较快。

如果是使用Q15的话,涉及到定标和溢出问题,比如调用函数arm_rfft_q15输入参数是Q15,但输出是Qx.y
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-1-12 16:30:21 | 显示全部楼层
eric2013 发表于 2021-1-12 16:16
用f32比较省事,如果你用的F4系列,因为带硬件FPU,计算浮点比较快。

如果是使用Q15的话,涉及到定标 ...

好的,谢谢了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-1-13 08:05:15 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 13:47 , Processed in 0.043719 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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