exponenta event banner

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

В этом примере показано, как создавать вызовы определенной установленной библиотеки FFTW. Дополнительные сведения о FFTW см. в разделе www.fftw.org.

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

Генератор кода производит вызовы библиотеки FFTW при выполнении всех следующих условий:

  • Функциональный блок MATLAB вызывает одну из следующих функций MATLAB:fft, fft2, fftn, ifft, ifft2, или ifftn.

  • Код C/C + + генерируется из модели, включающей функциональный блок MATLAB.

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

  • Установка библиотеки FFTW задается в классе обратного вызова библиотеки FFT, производном от coder.fftw.StandaloneFFTW3Interface.

  • Для параметра конфигурации Custom FFT library callback устанавливается имя класса обратного вызова.

Установка библиотеки FFTW

Если у вас нет доступа к установленной библиотеке FFTW версии 3.2 или более поздней, необходимо установить библиотеку.

Для платформы Linux ® или Mac рекомендуется использовать диспетчер пакетов для установки библиотеки FFTW.

Для платформы Windows ®, в дополнение к.dll файлы, вы должны иметь .lib импорт библиотек, как описано в примечаниях по установке Windows на веб-сайте FFTW.

См. инструкции по установке платформы на веб-сайте FFTW.

Запись класса обратного вызова FFT

Чтобы указать установку библиотеки FFTW, напишите класс обратного вызова FFT. Предоставление общего доступа к классу обратного вызова другим пользователям, которые хотят использовать эту библиотеку 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 путем указания класса обратного вызова FFT

  1. Создание модели Simulink ®.

  2. Добавьте в модель функциональный блок MATLAB.

  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. В диалоговом окне «Параметры конфигурации» задайте для параметра «Пользовательский обратный вызов библиотеки БПФ» значение useMyFFTW.

    Класс обратного вызова должен находиться в пути MATLAB.

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

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

Библиотека FFTW должна быть доступна в среде выполнения. Если библиотека FFTW является общей, используйте переменные среды или параметры компоновщика, чтобы указать расположение библиотеки.

  • На платформе Windows измените переменную среды PATH.

  • На платформе Linux измените переменную среды LD_LIBRARY_PATH или используйте rpath вариант компоновщика.

  • На платформе macOS измените переменную среды DYLD_LIBRARY_PATH или используйте rpath вариант компоновщика.

Чтобы указать rpath linker, можно использовать информацию о построении addLinkFlags метод в updateBuildInfo метод вашего coder.fftw.StandaloneFFTW3Interface класс. Например, для компилятора GCC:

buildInfo.addLinkFlags(sprintf('-Wl,-rpath,"%s"',libPath));

См. также

Связанные темы

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