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

Этот пример показывает, как произвести вызовы определенной установленной библиотеки FFTW, когда вы генерируете автономный код (статическая библиотека, динамически подключаемая библиотека или исполняемая программа). Для получения дополнительной информации о FFTW, см. www. fftw. org.

Когда вы генерируете MEX-функцию из кода MATLAB®, который включает функции быстрого преобразования Фурье (FFT), генератор кода пользуется библиотекой, которую MATLAB использует для Алгоритмов бпф. Если вы генерируете автономный код C/C++, по умолчанию, генератор кода производит код для Алгоритмов бпф вместо того, чтобы произвести вызовы библиотеки FFT. Чтобы увеличить скорость быстрых преобразований Фурье в сгенерированном автономном коде, укажите, что генератор кода производит вызовы определенной установленной библиотеки FFTW.

Генератор кода производит вызовы библиотеки FFTW, когда все эти условия верны:

  • Ваш код MATLAB вызывает один из этих functions:fft, fft2, fftn, ifft, ifft2 или ifftn.

  • Вы генерируете автономный код C/C++.

  • У вас есть доступ к установке библиотеки FFTW, версии 3.2 или позже.

  • Вы задаете установку библиотеки FFTW в классе обратного вызова библиотеки FFT, который выводит от coder.fftw.StandaloneFFTW3Interface.

  • Вы устанавливаете параметр конфигурации CustomFFTCallback на имя класса обратного вызова. В приложении MATLAB Coder™ используйте установку обратного вызова библиотеки Custom FFT.

Установите библиотеку 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

Реализуйте методы getNumThreads и updateBuildInfo. В методе updateBuildInfo, набор fftwLocation к полному пути для вашей установки библиотеки. Установите includePath на полный путь папки, которая содержит fftw3.h 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));

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

Похожие темы

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

Была ли эта тема полезной?