Main Content

MATLAB Function ブロックからの生成コード内の高速フーリエ変換の高速化

シミュレーションするモデルに含まれる MATLAB Function ブロックが、MATLAB® 高速フーリエ変換 (FFT) 関数を呼び出す場合、シミュレーション ソフトウェアは、MATLAB が FFT アルゴリズムに使うライブラリを使用します。このモデルの C/C++ コードを生成すると、既定では、コード ジェネレーターが FFTW ライブラリ呼び出しを生成するのではなく、FFT アルゴリズムのコードを作成します。生成コードでの高速フーリエ変換の速度を高めるには、FFTW ライブラリの呼び出しをコード ジェネレーターで作成するように指定します。FFTW の詳細については、www.fftw.org を参照してください。

FFT アルゴリズムの代わりに FFTW ライブラリの呼び出しを作成するために、[コンフィギュレーション パラメーター][コード生成][詳細設定パラメーター] で以下のコンフィギュレーション パラメーターから選択できます。

  • [組み込み FFTW ライブラリ コールバック] を選択して、MATLAB に含まれる FFTW ライブラリを使用する。これにより、生成コード内の FFTW ライブラリの呼び出しに組み込みコールバックを使用するように、コード ジェネレーターに指示されます。

  • [カスタム FFT ライブラリのコールバック] を選択して、特定のインストール済み FFTW ライブラリを使用する。

以下の場合に、コード ジェネレーターは FFTW ライブラリ呼び出しを作成します。

  • MATLAB Function ブロックが fftfft2fftnifftifft2、または ifftn のいずれかの MATLAB 関数を呼び出す。

  • MATLAB Function ブロックを含むモデルから C/C++ コードを生成する。

FFTW ライブラリ用に組み込み FFTW ライブラリ コールバックを使用

[組み込み FFTW ライブラリ コールバック] を選択すると、コード ジェネレーターは MATLAB に含まれる FFTW ライブラリ version 3.3.8 を使用して FFTW ライブラリの呼び出しを作成します。

コード生成時に [カスタム FFT ライブラリのコールバック] を選択する場合、このパラメーターに必須の追加手順を実行する必要はありません。

FFTW ライブラリ用にカスタム FFT ライブラリ コールバックを使用

[カスタム FFT ライブラリのコールバック] を選択すると、次の条件がすべて満たされている場合にコード ジェネレーターは FFTW ライブラリ呼び出しを作成します。

  • FFTW ライブラリのインストール (Version 3.2 以上) にアクセスできる。

  • coder.fftw.StandaloneFFTW3Interface から派生する FFT ライブラリ コールバック クラスで FFTW ライブラリ インストールを指定している。

  • [カスタム FFT ライブラリのコールバック] コンフィギュレーション パラメーターをコールバック クラスの名前に設定している。

FFTW ライブラリのインストール

Version 3.2 以上の FFTW ライブラリにアクセスできない場合はインストールしなければなりません。

Linux® プラットフォームまたは Mac プラットフォームの場合、パッケージ マネージャーを使用した FFTW ライブラリのインストールを検討してください。

Windows® プラットフォームの場合、FFTW Web サイトの Windows インストール メモで説明されているように .dll ファイルに加えて .lib インポート ライブラリが必要です。

FFTW Web サイトでプラットフォームのインストール手順を参照してください。

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 をライブラリのインストールの絶対パスに設定します。includePathfftw3.h を格納するフォルダーの絶対パスに設定します。libPath をライブラリ ファイルが格納されるフォルダーの絶対パスに設定します。FFTW のインストールで複数のスレッドを使用する場合、使用するスレッド数を返すように getNumThreads メソッドを変更します。

必要に応じて、次のメソッドを実装することができます。

FFT コールバック クラスの指定による FFTW 呼び出しの生成

  1. Simulink® モデルを作成します。

  2. MATLAB Function ブロックをモデルに追加します。

  3. MATLAB Function ブロックに、MATLAB 関数を呼び出すコードを追加します。たとえば、MATLAB 関数 fft を呼び出す関数 myfft を追加します。

    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. コード ジェネレーターが、FFT ライブラリ コールバック クラス useMyFFTW で指定された FFTW ライブラリの呼び出しを生成することを指定します。[コンフィギュレーション パラメーター] ダイアログ ボックスで、[カスタム FFT ライブラリのコールバック]useMyFFTW に設定します。

    コールバック クラスは MATLAB パス上になければなりません。

  6. モデルを作成します。

実行環境での FFTW ライブラリの検索.  実行環境で FFTW ライブラリを利用できなければなりません。FFTW ライブラリが共有されている場合、環境変数またはリンカー オプションを使用して FFTW ライブラリの場所を指定します。

  • Windows プラットフォームでは、PATH 環境変数を編集します。

  • Linux プラットフォームでは、LD_LIBRARY_PATH 環境変数を修正するか、rpath リンカー オプションを使用します。

  • macOS プラットフォームでは、DYLD_LIBRARY_PATH 環境変数を修正するか、rpath リンカー オプションを使用します。

rpath リンカー オプションを指定するには、coder.fftw.StandaloneFFTW3Interface クラスの updateBuildInfo メソッド内のビルド情報 addLinkFlags メソッドを使用します。たとえば、GCC コンパイラの場合、次のようになります。

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

参考

関連するトピック

外部の Web サイト