赞
踩
几种方案测试
=============
使用C2C MEASURE
===============================
FFT-DFT :309us
FFT-DFT :345us
FFT-DFT :320us
FFT-DFT :349us
FFT-DFT :319us
FFT-DFT :320us
FFT-DFT :321us
FFT-DFT :324us
FFT-DFT :320us
FFT-DFT :319us
FFT-DFT :757919us
幅值:9.465116 相位:-169.040115
real 0m2.064s
user 0m2.044s
sys 0m0.020s
===============================
===============================
使用R2C
FFT-DFT :208us
FFT-DFT :195us
FFT-DFT :198us
FFT-DFT :214us
FFT-DFT :212us
FFT-DFT :212us
FFT-DFT :221us
FFT-DFT :215us
FFT-DFT :214us
FFT-DFT :216us
FFT-DFT :564592us
幅值:9.465116 相位:-169.040115
real 0m0.584s
user 0m0.552s
sys 0m0.032
================================
================================
使用C2C 次最优方案
FFT-DFT :213us
FFT-DFT :204us
FFT-DFT :195us
FFT-DFT :195us
FFT-DFT :195us
FFT-DFT :196us
FFT-DFT :197us
FFT-DFT :196us
FFT-DFT :198us
FFT-DFT :197us
FFT-DFT :554788us
幅值:9.465116 相位:-169.040115
real 0m0.571s
user 0m0.544s
sys 0m0.028s
================================
采样点数为24000,进行1维复数/实数变化,参数选择有FFTW_MEASURE/FFTW_ESTIMATE
1.经测试,发现使用MEASURE方案时,在第一构造plan时花费约1.5秒,而一次DFT变化在300us-,构造的时间能做普通(FFTW_ESTIMATE)5000次左右,故在一般场合FFTW_ESTIMATE完全满足需求。
2.实数FFTW_ESTIMATE,时间上并没有优于复数DFT变化,只是内存开辟只有复数DFT的一半。实数DFT在构造plan时间上比复数慢,但变换比复数快,所以整体持平
3.最终选择复数和实数 ESTIMATE方案
FFTW_WISDOM
============
关于WISDOM,翻译自FFTW官网
FFTW -wisdom是一种实用工具来生成wisdom文件,其中包含有关如何以最佳方式计算(傅立叶)变换不同大小的保存的信息。
wisdom 的大体思路就是把生成好的策略相关的配置信息存储在磁盘里,然后在下次重新运行程序的时候,把策略相关的配置信息重新载入到内存中,这样在重新生成 plan 的时候就可以节约大量的时间。
FFTW 提供了多种方式来生成wisdom文件,使用时不必关心其中具体格式是怎么样,可以导入/出到文件/字符串等
322 FFTW_EXTERN int X(export_wisdom_to_filename)(const char *filename); \
323 FFTW_EXTERN void X(export_wisdom_to_file)(FILE *output_file); \
324 FFTW_EXTERN char *X(export_wisdom_to_string)(void); \
325 FFTW_EXTERN void X(export_wisdom)(X(write_char_func) write_char, \
326 void *data); \
327 FFTW_EXTERN int X(import_system_wisdom)(void); \
328 FFTW_EXTERN int X(import_wisdom_from_filename)(const char *filename); \
329 FFTW_EXTERN int X(import_wisdom_from_file)(FILE *input_file); \
330 FFTW_EXTERN int X(import_wisdom_from_string)(const char *input_string); \
331 FFTW_EXTERN int X(import_wisdom)(X(read_char_func) read_char, void *data);
wisdom 存储起来的不是 plan 本身,而是和 plan 相关的配置信息,例如内存、寄存器等。故在导入wisdom后还是需要执行plan初始化。
example:
fftw_export_wisdom_to_filename("wisdom.conf");
p_str = fftw_export_wisdom_to_string();
fftw_export_wisdom_from_filename("wisdom.conf");
fftw_export_wisdom_from_string(p_str);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。