硬汉嵌入式论坛

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

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

[复制链接]

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2016-11-11 20:22:21 | 显示全部楼层 |阅读模式
想测试一下fft算法的时间,看了42章有各种算法的单独时间测量,但是我想把自己的一些算法时间也测一下,不知该用那个函数,或者要开启一个timer?
谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2016-11-12 09:10:22 | 显示全部楼层
可以在FFT前后加上个IO翻转,用示波器测试。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-11-12 11:03:25 | 显示全部楼层
好吧,我承认这是最简单有效的方法。
F767全速206MHz,连续跑3组复数FFT1024,时间3.2ms。
增加了int16到float的转换程序。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2016-11-12 12:35:50 | 显示全部楼层

回 kylongmu 的帖子

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

使用道具 举报

14

主题

109

回帖

151

积分

初级会员

积分
151
发表于 2016-11-12 12:44:13 | 显示全部楼层
可以用DWT测试吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2016-11-12 12:50:14 | 显示全部楼层

回 fswyt 的帖子

fswyt:可以用DWT测试吧 (2016-11-12 12:44) 
没问题。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 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采样转换。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 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) 
感觉3.5ms时间稍有点长,你可以单独测试下函数 arm_cfft_f32,1024点的时间是多少。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-11-13 10:11:33 | 显示全部楼层
FFT输出顺序有影响,bitReversed改为0后总时间是2.74ms,还是等H7才能实现二维FFT计算。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2016-11-13 10:14:35 | 显示全部楼层

回 kylongmu 的帖子

kylongmu:
FFT输出顺序有影响,bitReversed改为0后总时间是2.74ms,还是等H7才能实现二维FFT计算。
F407测试函数 arm_cfft_f32  1024点是

66.png
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-11-13 13:59:44 | 显示全部楼层
可能是我2组ADC与1组DAC的DMA同时启动连续工作的原因,总线调度上效率降低的。
实际使用中肯定是我这个时间更准,因为ADC后需要转换为浮点,DMA也要开启,单纯测FFT的时间参考价值不大。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2016-11-13 14:09:18 | 显示全部楼层

回 kylongmu 的帖子

kylongmu:可能是我2组ADC与1组DAC的DMA同时启动连续工作的原因,总线调度上效率降低的。
实际使用中肯定是我这个时间更准,因为ADC后需要转换为浮点,DMA也要开启,单纯测FFT的时间参考价值不大。
(2016-11-13 13:59)
不需要的,直接代入就行了,可以看我们做的示波器例子。三路ADC1,ADC2和ADC3同时开启,三路DMA同时开启,定时器1的三个通道同时开启。

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

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

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-11-14 01:14:24 | 显示全部楼层
直接代入就行了?FFT函数的输入与输出是同一个存储区,16it的ADC值不转换的话估计得DMA上把目的地址的增加值对齐32bit了。
问题是我的2路ADC是同步采样(IQ),2个通道合并到一个32bit里面的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2016-11-14 01:35:02 | 显示全部楼层

回 kylongmu 的帖子

kylongmu:直接代入就行了?FFT函数的输入与输出是同一个存储区,16it的ADC值不转换的话估计得DMA上把目的地址的增加值对齐32bit了。
问题是我的2路ADC是同步采样(IQ),2个通道合并到一个32bit里面的。 (2016-11-14 01:14) 
同步采样使用我们V5板子的方案,两个ADC分别使用同一个定时器的两个通道进行触发,非常方便,简单好用。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-11-14 13:09:17 | 显示全部楼层
用ADC分别使用同一个定时器触发是个好办法,不过仍然有问题:
1:16bit定点直接可以当32bit浮点用吗?
2:2个通道的ADC数据组成复数的实部虚部,CFFT要求的数据格式是——实虚实虚实虚实虚……排列的,2个通道的DMA如何直接组织成这样的数据格式?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2016-11-14 13:39:53 | 显示全部楼层

回 kylongmu 的帖子

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

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-11-14 17:40:08 | 显示全部楼层
多谢解惑,不过虚部填不了0的,因为我是IQ采样,一个AD通道是实部,另外一个是虚部。
回复

使用道具 举报

26

主题

23

回帖

101

积分

初级会员

积分
101
发表于 2023-10-21 11:04:51 | 显示全部楼层
kylongmu 发表于 2016-11-12 11:03
好吧,我承认这是最简单有效的方法。
F767全速206MHz,连续跑3组复数FFT1024,时间3.2ms。
增加了int16到fl ...

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



回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 21:19 , Processed in 0.373123 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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