В этом примере показано, как произвести вызовы определенной установленной библиотеки 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. Для платформы Windows®, в дополнение к .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 измените переменную окружения 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));
coder.fftw.StandaloneFFTW3Interface