Ускорение быстрых преобразований Фурье в коде, сгенерированном из блока MATLAB Function

В этом примере показано, как сгенерировать вызовы в определенную установленную библиотеку 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

Если у вас нет доступа к установленной библиотеке 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 метод, чтобы вернуть количество потоков, которые вы хотите использовать.

Опционально можно реализовать следующие методы:

Сгенерируйте вызовы FFTW путем определения класса коллбэка БПФ

  1. Создайте Simulink® модель.

  2. Добавьте блок MATLAB Function к модели.

  3. В блоке 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

  4. Соедините блоки.

  5. Указывает, что генератор кода производит вызовы в библиотеку FFTW, заданную в классе коллбэка библиотеки FFT useMyFFTW. В диалоговом окне Параметров конфигурации установите Custom FFT library callback равным useMyFFTW.

    Класс коллбэка должен находиться в пути MATLAB.

  6. Создайте модель.

Поиск библиотеки FFTW в среде выполнения

Библиотека 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));

См. также

Похожие темы

Внешние веб-сайты