В этом примере показано, как производить вызовы определенной установленной библиотеки FFTW при создании автономного кода (статической библиотеки, динамически связанной библиотеки или исполняемой программы). Дополнительные сведения о FFTW см. в разделе www.fftw.org.
При создании функции MEX из кода MATLAB ®, включающей функции быстрого преобразования Фурье (FFT), генератор кода использует библиотеку, используемую MATLAB для алгоритмов FFT. Если создается автономный код C/C + +, по умолчанию генератор кода создает код для алгоритмов БПФ вместо создания вызовов библиотеки БПФ. Чтобы увеличить скорость быстрых преобразований Фурье в сгенерированном автономном коде, укажите, что генератор кода вызывает определенную установленную библиотеку FFTW.
Генератор кода производит вызовы библиотеки FFTW при выполнении всех следующих условий:
Код MATLAB вызывает одну из следующих функций:fft, fft2, fftn, ifft, ifft2, или ifftn.
Создается автономный код C/C + +.
У вас есть доступ к установке библиотеки FFTW версии 3.2 или более поздней.
Установка библиотеки FFTW задается в классе обратного вызова библиотеки FFT, производном от coder.fftw.StandaloneFFTW3Interface.
Вы устанавливаете CustomFFTCallback параметр конфигурации для имени класса обратного вызова. В приложении MATLAB Coder™ используйте параметр обратного вызова пользовательской библиотеки FFT.
Если у вас нет доступа к установленной библиотеке FFTW версии 3.2 или более поздней, необходимо установить библиотеку. Для платформы Linux ® или Mac рекомендуется использовать диспетчер пакетов для установки библиотеки FFTW. Для платформы Windows ®, в дополнение к.dll файлы, вы должны иметь .lib импорт библиотек, как описано в примечаниях по установке Windows на веб-сайте FFTW.
См. инструкции по установке платформы на веб-сайте FFTW.
Чтобы указать установку библиотеки FFTW, напишите класс обратного вызова FFT. Поделитесь классом обратного вызова с другими пользователями, которые хотят использовать эту библиотеку FFTW для вызовов FFTW в автономном коде.
Класс обратного вызова должен быть производным от абстрактного класса coder.fftw.StandaloneFFTW3Interface. Используйте этот пример класса обратного вызова в качестве шаблона.
% copyright 2017 The MathWorks, Inc. classdef useMyFFTW < coder.fftw.StandaloneFFTW3Interface methods (Static) function th = getNumThreads coder.inline('always'); th = int32(coder.const(1)); end function updateBuildInfo(buildInfo, ctx) fftwLocation = '/usr/lib/fftw'; includePath = fullfile(fftwLocation, 'include'); buildInfo.addIncludePaths(includePath); libPath = fullfile(fftwLocation, 'lib'); %Double libName1 = 'libfftw3-3'; [~, libExt] = ctx.getStdLibInfo(); libName1 = [libName1 libExt]; addLinkObjects(buildInfo, libName1, libPath, 1000, true, true); %Single libName2 = 'libfftw3f-3'; [~, libExt] = ctx.getStdLibInfo(); libName2 = [libName2 libExt]; addLinkObjects(buildInfo, libName2, libPath, 1000, true, true); end end end
Реализация updateBuildInfo и getNumThreads методы. В updateBuildInfo метод, установка fftwLocation к полному пути для установки библиотеки. Набор includePath к полному пути к папке, содержащей fftw3.h. Набор libPath в полный путь к папке, содержащей файлы библиотеки. Если установка FFTW использует несколько потоков, измените getNumThreads для возврата количества потоков, которые требуется использовать.
Дополнительно можно реализовать следующие методы:
getPlanMethod для определения метода планирования FFTW. Посмотрите coder.fftw.StandaloneFFTW3Interface.
lock и unlock для синхронизации многопоточного доступа к процессу планирования FFTW. См. раздел Синхронизация многопоточного доступа к планированию FFTW в сгенерированном автономном коде.
Для создания вызовов библиотеки FFTW в автономном коде C:
Запишите функцию MATLAB, которая вызывает функцию быстрого преобразования Фурье MATLAB. Например, записать функцию myfft который вызывает функцию MATLAB fft.
function y = myfft() %#codegen t = 0:1/50:10-1/50; x = sin(2*pi*15*t) + sin(2*pi*20*t); y = fft(x); end
Определите объект конфигурации создания кода для статической библиотеки, динамически связанной библиотеки или исполняемой программы. Например, определите объект конфигурации для динамически связанной библиотеки.
cfg = coder.config('dll');Укажите класс обратного вызова FFTW useMyFFTW.
cfg.CustomFFTCallback = 'useMyFFTW';Класс обратного вызова должен находиться в пути MATLAB.
Создать код.
codegen myfft -config cfg -report
Библиотека FFTW должна быть доступна в среде выполнения. Если библиотека FFTW является общей, используйте переменные среды или параметры компоновщика, чтобы указать расположение библиотеки.
На платформе Windows измените переменную среды PATH.
На платформе Linux измените переменную среды LD_LIBRARY_PATH или используйте rpath вариант компоновщика.
На платформе macOS измените переменную среды DYLD_LIBRARY_PATH или используйте rpath вариант компоновщика.
Чтобы указать rpath linker, можно использовать информацию о построении addLinkFlags метод в updateBuildInfo метод вашего coder.fftw.StandaloneFFTW3Interface класс. Например, для компилятора GCC:
buildInfo.addLinkFlags(sprintf('-Wl,-rpath,"%s"',libPath));
coder.fftw.StandaloneFFTW3Interface