主要内容

加快快速傅里叶变换使用FFTW库调用生成的独立的代码

这个例子展示了如何生成调用一个特定的安装FFTW库生成独立的代码时(静态库,动态链接库,或可执行程序)。关于FFTW的更多信息,请参阅www.fftw.org

当你生成一个墨西哥人从MATLAB函数®代码,包括快速傅里叶变换(FFT)功能,代码生成器使用FFT算法的MATLAB使用图书馆。如果你生成独立的C / c++代码,默认情况下,代码生成器生成的代码代替生产FFT库调用FFT算法。增加的速度快速傅里叶变换生成独立的代码,则指定代码生成器生成调用特定的安装FFTW图书馆。

代码生成器产生FFTW库调用当所有这些条件是正确的:

  • MATLAB代码调用一个函数:fft,fft2,fftn,传输线,ifft2,或ifftn

  • 你生成独立的C / c++代码。

  • 你可以访问一个FFTW库安装,版本3.2或更高版本。

  • 您指定FFTW库安装在一个FFT来源于图书馆回调类coder.fftw.StandaloneFFTW3Interface

  • 你设置CustomFFTCallback配置参数回调类的名称。在MATLAB编码器™应用,使用定制FFT库调设置。

FFTW规划考虑

规划方法,coder.fftw.StandaloneFFTW3Interface.getPlanMethod根据您的工作流程,必须设置优化FFTW库的性能。将方法设置为以下值之一,根据您的工作流程:

  • FFTW_ESTIMATE:这是默认设置,并允许FFTW图书馆故意少在计划阶段。这个设置是明智的,当你有多个不同规模和类型的fft算法。这也是明智的,当您的工作流包含一个FFT与多个输入不同的类型和大小。这可以减少所需的时间规划阶段。

  • FFTW_MEASURE:这个设置允许FFTW图书馆积极计划使用FFT算法的工作流。这个设置是明智的您的工作流运行时一个FFT在输入相同的大小和类型。这可能增加规划时间,但可以减少FFT的执行时间。

其他类型的规划方法的更多信息,请参阅https://www.fftw.org/fftw3_doc/Planner-Flags.html

考虑使用先前FFT呼吁输入相同的大小和类型。重用相同的FFT操作输入相同的大小和类型提示规划者使用FFT的缓存版本之前被调用。FFT调用的执行时间也取决于输入的大小。FFT算法的输入大小是2的幂执行速度比FFT调用的输入大小非的两个。看到https://www.fftw.org/fftw2_doc/fftw_3.html

安装FFTW图书馆

如果您没有访问到一个安装FFTW图书馆,版本3.2或更高版本,那么您必须安装一个。对于Linux®平台或Mac平台,考虑使用包管理器安装FFTW图书馆。对于一个窗户®平台,除了. dll文件,你必须有. lib导入库中描述的Windows安装notes FFTW网站。

看到你的平台的安装说明FFTW网站

写一个FFT回调类

指定安装FFTW图书馆,写一个FFT回调类。与人分享的回调类想用这个FFTW库FFTW独立代码中调用。

回调类必须来自抽象类coder.fftw.StandaloneFFTW3Interface。使用这个例子callback类作为一个模板。

% 2017年版权MathWorks公司。classdefuseMyFFTW < coder.fftw.StandaloneFFTW3Interface方法(静态)函数th = getNumThreads coder.inline (“总是”);th = int32 (coder.const (1));结束函数updateBuildInfo (buildInfo ctx) fftwLocation =“/ usr / lib / fftw”;includePath = fullfile (fftwLocation,“包括”);buildInfo.addIncludePaths (includePath);libPath = fullfile (fftwLocation,“自由”);%的两倍libName1 =“libfftw3-3”;[~,libExt] = ctx.getStdLibInfo ();libName1 = [libName1 libExt];addLinkObjects (buildInfo libName1 libPath 1000,真的,真的);%的单libName2 =“libfftw3f-3”;[~,libExt] = ctx.getStdLibInfo ();libName2 = [libName2 libExt];addLinkObjects (buildInfo libName2 libPath 1000,真的,真的);结束结束结束

实现updateBuildInfogetNumThreads方法。在updateBuildInfo方法,设置fftwLocation为你的安装的完整路径的图书馆。集includePath包含文件夹的完整路径fftw3.h。集libPath完整路径的文件夹包含库文件。如果您的FFTW安装使用多个线程,修改getNumThreads方法返回你想使用的线程的数量。

可选地,您可以实现这些方法:

生成FFTW库调用通过指定一个FFT图书馆回调类

在独立的C代码生成FFTW库调用:

  1. 编写一个MATLAB函数调用MATLAB快速傅里叶变换函数。例如,编写一个函数myfft调用MATLAB函数fft

    函数y = myfft ()% # codegent = 0:1/50:10-1/50;x =罪(2 *π* 15 * t) +罪(2 *π* 20 * t);y = fft (x);结束

  2. 定义一个静态库的代码生成配置对象,动态链接库,或可执行程序。例如,定义一个配置对象的一个动态链接库。

    cfg = coder.config (“dll”);

  3. 指定FFTW回调类useMyFFTW

    cfg。CustomFFTCallback =“useMyFFTW”;

    回调类必须在MATLAB的道路。

  4. 生成的代码。

    codegenmyfft配置cfg报告

定位FFTW图书馆执行环境

FFTW图书馆必须执行环境中可用。如果FFTW共享库,使用环境变量或链接器选项来指定库的位置。

  • 在Windows平台上,修改PATH环境变量。

  • 在Linux平台上,修改LD_LIBRARY_PATH环境变量或使用rpath链接器选项。

  • 在一个macOS平台,修改DYLD_LIBRARY_PATH环境变量或使用rpath链接器选项。

指定rpath链接器选项,您可以使用构建信息addLinkFlags方法updateBuildInfo你的方法coder.fftw.StandaloneFFTW3Interface类。例如,对于一个GCC编译器:

buildInfo.addLinkFlags (sprintf (' - wl rpath、“% s”, libPath));

清理内存FFTW所使用的库函数

清理内存,FFTW库函数调用进程仍在运行时使用,您必须将生成的代码合并到自己的项目和手动调用适当的清理函数执行后生成的代码。相比之下,在调用进程终止时,FFTW库函数自动释放内存,您不需要调用这些清理功能。

可用的清理功能:

  • fftw_cleanup

  • fftwf_cleanup

  • fftw_cleanup_threads

  • fftwf_cleanup_threads

遵循这些原则,决定使用哪一个清理函数:

  • 如果你使用单精度浮点数调用FFT功能、使用fftwf前缀清理功能。

  • 如果使用双精度浮点数在FFT函数调用,使用fftw前缀清理功能。

  • 如果你实现的coder.fftw.StandaloneFFTW3Interface.getNumThreads方法返回的值大于1,使用的清理功能线程后缀。

另请参阅

相关的话题

外部网站