发新帖我要提问
12
返回列表
打印

stm32f4 用dsp库做fft卡死

[复制链接]
楼主: KC_CEC
手机看帖
扫描二维码
随时随地手机跟帖
21
KC_CEC|  楼主 | 2014-7-23 11:39 | 只看该作者 回帖奖励 |倒序浏览
tangqilin324 发表于 2014-7-23 10:38
请问下你把后面 的数据赋值一次 是把后262个数据清零么?还有做fft的时候,你有没有分虚部和实部的方式放 ...

赋值就是把整个缓存都清零了,做FFT之前只是在实部放数据,虚部依然是0

使用特权

评论回复
22
tangqilin324| | 2014-7-23 12:31 | 只看该作者
KC_CEC 发表于 2014-7-23 11:39
赋值就是把整个缓存都清零了,做FFT之前只是在实部放数据,虚部依然是0

是不是意思是 假如采了256个点的实数数据,输入进fft的数组要扩到512个,实部还是原来的,虚部的话就是0?如果是这样的话,用rfft会不会更好点呢?

使用特权

评论回复
23
KC_CEC|  楼主 | 2014-7-23 14:19 | 只看该作者
tangqilin324 发表于 2014-7-23 12:31
是不是意思是 假如采了256个点的实数数据,输入进fft的数组要扩到512个,实部还是原来的,虚部的话就是0 ...

应该可以,我没有试过  你试试看吧

使用特权

评论回复
24
Rain_King| | 2014-7-23 14:31 | 只看该作者
学习了..............

使用特权

评论回复
25
icekoor| | 2014-8-8 15:35 | 只看该作者
FFT的库一般为2^N个点,如果输入达不到2^N,系统会自动补零,但是补零的话,会影响到FFT的频谱,不知道楼主有没有注意。

使用特权

评论回复
26
myst| | 2014-9-25 17:07 | 只看该作者
tangqilin324 发表于 2014-7-23 10:38
请问下你把后面 的数据赋值一次 是把后262个数据清零么?还有做fft的时候,你有没有分虚部和实部的方式放 ...

请问,对于一个正弦信号,要怎么设置实部和虚部哦。。。这样吗?
        for(index=0;index<2048;index++)
         {  

     if(index%2==0)
                  testInput_f32_10khz[index]= 100*sin(3.14*index/512);
            else
                          testInput_f32_10khz[index]= 100*cos(3.14*index/512);
                  
                }

我按上面方式设置的话,的出来 index1022 =102399            其他都很小。。。
如果我直接:
        for(index=0;index<2048;index++)
         {  
        testInput_f32_10khz[index]= 100*sin(3.14*index/512);
        }
的出来:index2 =72203 ;index1022 =72647 两个分量都很大。。。请问怎样理解哦。。。

使用特权

评论回复
27
myst| | 2014-9-25 17:31 | 只看该作者
huangzj121 发表于 2013-11-6 14:33
FFT又称快速傅里叶 一般有基2 基4 方法
基2的 适用与log2(n)为整数的长度
基4的 适用与log4(n)为整数的长度 ...


本帖最后由 myst 于 2014-9-25 17:17 编辑


我直接拿官方的FFT测试实例。
修改了初始值。。。

代码如下;

int32_t main(void)
{
for(index=0;index<2048;index++)
         {  
                  testInput_f32_10khz[index]= 100*sin(3.14*index/512);
        }

  arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);

  arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);  

  arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);

   for(index=0;index<1024;index++)
         {
           printf("index%d =%d\r\n",index,(u32)testOutput[index]);
         
         }

  while(1);                             /* main function does not return */
}


1. 如果2048个点,我直接取正弦波的值,那么打印出来是

index2 =72203
index1022 =72647
貌似是对称的。。。
for(index=0;index<2048;index++)
         {  
                  testInput_f32_10khz[index]= 100*sin(3.14*index/512);
        }



2.但是如果2048个点,我按照下面方式
        for(index=0;index<2048;index++)
         {  

        if(index%2==0)
                  testInput_f32_10khz[index]= 100*sin(3.14*index/512);
            else
             testInput_f32_10khz[index]= 100*cos(3.14*index/512);
        }
那么测试出来是
index1022 =102399
不对称。。。

3.如果我虚部为0,实部位正弦值:
        for(index=0;index<2048;index++)
         {  

        if(index%2==0)
                  testInput_f32_10khz[index]= 100*sin(3.14*index/512);
            else
             testInput_f32_10khz[index]= 0;
        }

出来是
index2 =51212
index1022 =51212
是对称的。。


请问这怎么理解呢???
如果我ADC采集一个信号,我应该怎样设置这个初始值呢?请教高手

使用特权

评论回复
28
jinjing999| | 2015-6-12 21:22 | 只看该作者
受启发了。是不是奇数项填0

使用特权

评论回复
29
FireRiver9| | 2015-6-12 21:29 | 只看该作者
学习了

使用特权

评论回复
30
556FTX| | 2022-11-16 20:11 | 只看该作者
楼主,我现在使用下面这两个函数也出现了卡死的情况,是这样的,单独使用第一个函数,可能过很久串口才卡死不发数据,但是使用第二个函数,几乎一复位串口就卡死,请问您有遇到过这总情况嘛?

arm_cfft_f32(&arm_cfft_sR_f32_len2048, mul_ifft, ifftFlag, doBitReverse);       
arm_max_f32(mul_ifft, 4096, &maxValue, &testIndex);

使用特权

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

本版积分规则