В этом примере показано, как создавать вызовы в определенную установленную библиотеку FFTW при генерации автономного кода (статическая библиотека, динамически связанная библиотека или исполняемая программа). Для получения дополнительной информации о FFTW смотрите www.fftw.org.
Когда вы генерируете MEX-функцию из MATLAB® код, который включает функции быстрого преобразования Фурье (FFT), генератор кода использует библиотеку, которую MATLAB использует для алгоритмов БПФ. Если вы генерируете автономный код C/C + +, по умолчанию генератор кода производит код для алгоритмов БПФ вместо того, чтобы производить вызовы библиотеки FFT. Чтобы увеличить скорость быстрых преобразований Фурье в сгенерированном автономном коде, укажите, что генератор кода производит вызовы в определенную установленную библиотеку FFTW.
Генератор кода производит вызовы библиотеки FFTW, когда все эти условия верны:
Ваш код MATLAB вызывает одну из следующих функций:fft
, fft2
, fftn
, ifft
, ifft2
, или ifftn
.
Вы генерируете автономный код C/C + +.
У вас есть доступ к установке библиотеки FFTW версии 3.2 или более поздней.
Установка библиотеки FFTW задается в классе коллбэка библиотеки FFT, который является производным от coder.fftw.StandaloneFFTW3Interface
.
Вы устанавливаете CustomFFTCallback
параметр конфигурации с именем класса коллбэка. В приложении MATLAB Coder™ используйте настройку Custom FFT library callback.
Если у вас нет доступа к установленной библиотеке FFTW версии 3.2 или более поздней, необходимо установить ее. Для Linux® платформы или платформы Mac, рассмотрите использование диспетчера пакетов для установки библиотеки FFTW. Для окон® платформы, в дополнение к .dll
файлы, вы должны иметь .lib
импортировать библиотеки, как описано в примечаниях к установке Windows на веб-сайте FFTW.
См. инструкции по установке вашей платформы на веб-сайте FFTW.
Чтобы указать установку библиотеки FFTW, напишите класс коллбэка БПФ. Совместное использование класса коллбэка с другими пользователями, которые хотят использовать эту библиотеку 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 в автономном коде С:
Написание функции 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 измените переменный ПУТЬ окружения.
На платформе Linux измените переменную окружения LD_LIBRARY_PATH или используйте rpath
опция linker.
На платформе macOS измените переменную окружения DYLD_LIBRARY_PATH или используйте rpath
опция linker.
Чтобы задать rpath
опция linker, вы можете использовать информацию о сборке addLinkFlags
метод в updateBuildInfo
метод вашего coder.fftw.StandaloneFFTW3Interface
класс. Для примера, для компилятора GCC:
buildInfo.addLinkFlags(sprintf('-Wl,-rpath,"%s"',libPath));
coder.fftw.StandaloneFFTW3Interface