kylongmu 发表于 2016-11-11 20:22:21

想测试一下fft的执行时间,该用那个函数测时间?

想测试一下fft算法的时间,看了42章有各种算法的单独时间测量,但是我想把自己的一些算法时间也测一下,不知该用那个函数,或者要开启一个timer?
谢谢

eric2013 发表于 2016-11-12 09:10:22

可以在FFT前后加上个IO翻转,用示波器测试。

kylongmu 发表于 2016-11-12 11:03:25

好吧,我承认这是最简单有效的方法。
F767全速206MHz,连续跑3组复数FFT1024,时间3.2ms。
增加了int16到float的转换程序。

eric2013 发表于 2016-11-12 12:35:50

回 kylongmu 的帖子

kylongmu:好吧,我承认这是最简单有效的方法。
F767全速206MHz,连续跑3组复数FFT1024,时间3.2ms。
增加了int16到float的转换程序。 (2016-11-12 11:03) images/back.gif

跑的那个函数

fswyt 发表于 2016-11-12 12:44:13

可以用DWT测试吧

eric2013 发表于 2016-11-12 12:50:14

回 fswyt 的帖子

fswyt:可以用DWT测试吧 (2016-11-12 12:44) images/back.gif

没问题。

kylongmu 发表于 2016-11-12 20:40:12

void Do_FFT(q15_t* ADC_Val){
    for(uint32_t i=0;i<3;i++){
      arm_q15_to_float(ADC_Val+i*ADC_FFT_SIZE*2,testInput_f32_1Mhz+i*ADC_FFT_SIZE*2,ADC_FFT_SIZE*2);
      /* Process the data through the CFFT/CIFFT module */
      arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_1Mhz+i*ADC_FFT_SIZE*2, ifftFlag, doBitReverse);
    }
}
包含了双通道ADC采样转换。

eric2013 发表于 2016-11-13 02:09:49

回 kylongmu 的帖子

kylongmu:void Do_FFT(q15_t* ADC_Val){
    for(uint32_t i=0;i<3;i++){
        arm_q15_to_float(ADC_Val+i*ADC_FFT_SIZE*2,testInput_f32_1Mhz+i*ADC_FFT_SIZE*2,ADC_FFT_SIZE*2);
     &nbs .. (2016-11-12 20:40) images/back.gif

感觉3.5ms时间稍有点长,你可以单独测试下函数 arm_cfft_f32,1024点的时间是多少。

kylongmu 发表于 2016-11-13 10:11:33

FFT输出顺序有影响,bitReversed改为0后总时间是2.74ms,还是等H7才能实现二维FFT计算。

eric2013 发表于 2016-11-13 10:14:35

回 kylongmu 的帖子

kylongmu:
FFT输出顺序有影响,bitReversed改为0后总时间是2.74ms,还是等H7才能实现二维FFT计算。 images/back.gif

F407测试函数 arm_cfft_f321024点是

kylongmu 发表于 2016-11-13 13:59:44

可能是我2组ADC与1组DAC的DMA同时启动连续工作的原因,总线调度上效率降低的。
实际使用中肯定是我这个时间更准,因为ADC后需要转换为浮点,DMA也要开启,单纯测FFT的时间参考价值不大。

eric2013 发表于 2016-11-13 14:09:18

回 kylongmu 的帖子

kylongmu:可能是我2组ADC与1组DAC的DMA同时启动连续工作的原因,总线调度上效率降低的。
实际使用中肯定是我这个时间更准,因为ADC后需要转换为浮点,DMA也要开启,单纯测FFT的时间参考价值不大。
(2016-11-13 13:59) images/back.gif

不需要的,直接代入就行了,可以看我们做的示波器例子。三路ADC1,ADC2和ADC3同时开启,三路DMA同时开启,定时器1的三个通道同时开启。

除非你的项目有特别需要,需要将求出的幅频响应转换成实际数值大小。即使全部转换,速度也相当快的。你可以测试下转换速度。

===================================================
我估计你的这个慢是因为你是用的双精度浮点库。

kylongmu 发表于 2016-11-14 01:14:24

直接代入就行了?FFT函数的输入与输出是同一个存储区,16it的ADC值不转换的话估计得DMA上把目的地址的增加值对齐32bit了。
问题是我的2路ADC是同步采样(IQ),2个通道合并到一个32bit里面的。

eric2013 发表于 2016-11-14 01:35:02

回 kylongmu 的帖子

kylongmu:直接代入就行了?FFT函数的输入与输出是同一个存储区,16it的ADC值不转换的话估计得DMA上把目的地址的增加值对齐32bit了。
问题是我的2路ADC是同步采样(IQ),2个通道合并到一个32bit里面的。 (2016-11-14 01:14) images/back.gif

同步采样使用我们V5板子的方案,两个ADC分别使用同一个定时器的两个通道进行触发,非常方便,简单好用。

kylongmu 发表于 2016-11-14 13:09:17

用ADC分别使用同一个定时器触发是个好办法,不过仍然有问题:
1:16bit定点直接可以当32bit浮点用吗?
2:2个通道的ADC数据组成复数的实部虚部,CFFT要求的数据格式是——实虚实虚实虚实虚……排列的,2个通道的DMA如何直接组织成这样的数据格式?

eric2013 发表于 2016-11-14 13:39:53

回 kylongmu 的帖子

kylongmu:用ADC分别使用同一个定时器触发是个好办法,不过仍然有问题:
1:16bit定点直接可以当32bit浮点用吗?
2:2个通道的ADC数据组成复数的实部虚部,CFFT要求的数据格式是——实虚实虚实虚实虚……排列的,2个通道的DMA如何直接组织成这样的数据格式? (2016-11-14 13:09) images/back.gif

1. 没问题,你想多了
2. 不需要,实部填ADC,虚部填0即可。

kylongmu 发表于 2016-11-14 17:40:08

多谢解惑,不过虚部填不了0的,因为我是IQ采样,一个AD通道是实部,另外一个是虚部。

sean4194304 发表于 2023-10-21 11:04:51

kylongmu 发表于 2016-11-12 11:03
好吧,我承认这是最简单有效的方法。
F767全速206MHz,连续跑3组复数FFT1024,时间3.2ms。
增加了int16到fl ...

SYSTICK   1ms中断一次,计数值加一。计算FFT前后都读取一下计数值, 两次计数相减。就是运行时间。单位ms.   精度基本够用。



页: [1]
查看完整版本: 想测试一下fft的执行时间,该用那个函数测时间?