Этот пример показывает, как сгенерировать код, который синхронизирует многопоточный доступ к процессу планирования FFTW для вызовов библиотеки FFTW в коде, сгенерированном от блока MATLAB function.
Генератор кода производит вызовы библиотеки FFTW, когда все эти условия верны:
Блок MATLAB function вызывает один из этих functions:fft, fft2, fftn, ifft, ifft2 или ifftn.
Вы генерируете код C/C++ для модели, которая включает блок MATLAB function.
У вас есть доступ к установке библиотеки FFTW, версии 3.2 или позже.
Вы задаете установку библиотеки FFTW в классе коллбэка библиотеки FFT, который выводит от coder.fftw.StandaloneFFTW3Interface.
Вы устанавливаете параметр конфигурации Custom FFT library callback на имя класса коллбэка.
Если вы интегрируете код, который содержит вызовы FFTW с внешним кодом, который работает на нескольких потоках, то необходимо предотвратить параллельный доступ к процессу планирования FFTW. В вашем классе коллбэка библиотеки FFT реализуйте методы unlock и lock. Необходимо также обеспечить код С, который управляет блокировкой или взаимным исключением. Многие библиотеки, такие как OpenMP, pthreads, и библиотека стандарта C++ (C++ 11 и позже), обеспечивают блокировки. Этот пример показывает, как реализовать lock и методы unlock и обеспечить код С поддержки. Чтобы управлять блокировкой, этот пример пользуется библиотекой OpenMP.
Прежде чем вы запустите, для основного рабочего процесса для генерации библиотеки FFTW призывает к быстрым преобразованиям Фурье в блоке MATLAB function, смотрите, Ускоряют Быстрые преобразования Фурье в Коде, Сгенерированном от блока MATLAB function (Simulink Coder).
Вы должны иметь:
Доступ к установленной библиотеке FFTW.
Компилятор, который поддерживает библиотеку OpenMP. Чтобы пользоваться различной библиотекой, такой как pthreads, изменяют код С поддержки соответственно.
Создайте модель Simulink® и добавьте блок MATLAB Functon в него.
Добавьте этот код в блок MATLAB function.
function y = mycustomfft() t = 0:1/50:10-1/50; x = sin(2*pi*15*t) + sin(2*pi*20*t); y = fft(x); for k = 1:100 y = y + ifft(x+k); end
Добавьте блок outport и соедините его с блоком MATLAB function.

Запишите функции C, которые инициализируют, устанавливают и сбрасывают блокировку. Этот пример пользуется библиотекой OpenMP, чтобы управлять блокировкой. Для различной библиотеки измените код соответственно.
Создайте файл mylock.c, который содержит этот код С:
#include "mylock.h"
#include "omp.h"
static omp_nest_lock_t lockVar;
void mylock_initialize(void)
{
omp_init_nest_lock(&lockVar);
}
void mylock(void)
{
omp_set_nest_lock(&lockVar);
}
void myunlock(void)
{
omp_unset_nest_lock(&lockVar);
}
Создайте заголовочный файл mylock.h, который содержит:
#ifndef MYLOCK_H #define MYLOCK_H void mylock_initialize(void); void mylock(void); void myunlock(void); #endif
Запишите классу коллбэка БПФ myfftcb что:
Задает библиотеку FFTW.
lock реализаций и методы unlock, которые вызывают код С поддержки, чтобы управлять доступом к планированию FFTW.
Используйте этот класс в качестве шаблона. Замените fftwLocation на местоположение вашей установки библиотеки FFTW.
classdef myfftcb < coder.fftw.StandaloneFFTW3Interface methods (Static) function th = getNumThreads coder.inline('always'); th = int32(coder.const(1)); end function lock() coder.cinclude('mylock.h', 'InAllSourceFiles', true); coder.inline('always'); coder.ceval('mylock'); end function unlock() coder.cinclude('mylock.h', 'InAllSourceFiles', true); coder.inline('always'); coder.ceval('myunlock'); 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
Сконфигурируйте генерацию кода, чтобы использовать класс коллбэка FFTW и код С, вызванный методами unlock и lock. Сконфигурируйте генерацию кода, чтобы сгенерировать вызов mylock_initialize в коде инициализации.
В диалоговом окне Configuration Parameters:
Установите Custom FFT library callback на myfftcb.
В Code Generation > Custom Code, под Additional build information, устанавливает Source files на mylock.c.
В Code Generation > Custom Code, под Insert custom C code in generated, устанавливает Initialize function на mylock_initialize();.
Создайте модель.
coder.fftw.StandaloneFFTW3Interface