В этом примере показано, как сгенерировать вызовы в определенную установленную библиотеку FFTW. Для получения дополнительной информации о FFTW смотрите www.fftw.org.
Когда вы симулируете модель, которая включает блок MATLAB Function, который вызывает MATLAB® функции быстрого преобразования Фурье (FFT), программное обеспечение симуляции использует библиотеку, которую MATLAB использует для алгоритмов БПФ. Если вы генерируете код C/C + + для этой модели, по умолчанию генератор кода производит код для алгоритмов БПФ вместо того, чтобы производить вызовы библиотеки FFT. Чтобы увеличить скорость быстрых преобразований Фурье в сгенерированном коде, укажите, что генератор кода производит вызовы в определенную установленную библиотеку FFTW.
Генератор кода производит вызовы библиотеки FFTW, когда все эти условия верны:
Блок MATLAB Function вызывает одну из следующих функций MATLAB:fft
, fft2
, fftn
, ifft
, ifft2
, или ifftn
.
Вы генерируете код C/C + + из модели, которая включает в себя блок MATLAB Function.
У вас есть доступ к установке библиотеки FFTW версии 3.2 или более поздней.
Установка библиотеки FFTW задается в классе коллбэка библиотеки FFT, который является производным от coder.fftw.StandaloneFFTW3Interface
.
Вы устанавливаете параметр конфигурации 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 в коде, сгенерированном из блока MATLAB function.
Создайте Simulink® модель.
Добавьте блок MATLAB Function к модели.
В блоке MATLAB Function добавьте код, который вызывает функцию MATLAB FFT. Для примера добавьте функцию myfft
который вызывает функцию MATLAB fft
.
function y = myfft() t = 0:1/50:10-1/50; x = sin(2*pi*15*t) + sin(2*pi*20*t); y = fft(x); end
Соедините блоки.
Указывает, что генератор кода производит вызовы в библиотеку FFTW, заданную в классе коллбэка библиотеки FFT useMyFFTW
. В диалоговом окне Параметров конфигурации установите Custom FFT library callback равным useMyFFTW
.
Класс коллбэка должен находиться в пути MATLAB.
Создайте модель.
Библиотека 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