Ускорьте быстрые преобразования Фурье в сгенерированном автономном коде при помощи вызовов библиотеки FFTW

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

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

Опционально, можно реализовать эти методы:

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

Сгенерировать вызовы библиотеки FFTW в автономном коде С:

  1. Запишите функцию 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

  2. Задайте объект настройки генерации кода для статической библиотеки, динамически подключаемой библиотеки или исполняемой программы. Например, задайте объект настройки для динамически подключаемой библиотеки.

    cfg = coder.config('dll');

  3. Задайте класс коллбэка FFTW useMyFFTW.

    cfg.CustomFFTCallback = 'useMyFFTW';

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

  4. Сгенерируйте код.

    codegen myfft -config cfg -report

Найдите библиотеку FFTW в среде выполнения

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

Смотрите также

Похожие темы

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