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 ライブラリ呼び出しを作成します。
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
をライブラリのインストールの絶対パスに設定します。includePath
を fftw3.h
を格納するフォルダーの絶対パスに設定します。libPath
をライブラリ ファイルが格納されるフォルダーの絶対パスに設定します。FFTW のインストールで複数のスレッドを使用する場合、使用するスレッド数を返すように getNumThreads
メソッドを変更します。
必要に応じて、次のメソッドを実装することができます。
getPlanMethod
(FFTW プラン メソッドを指定する)。coder.fftw.StandaloneFFTW3Interface
を参照してください。lock
およびunlock
(マルチスレッド アクセスを FFTW 計画プロセスと同期する)。MATLAB Function ブロックからの生成コード内のマルチスレッド FFTW 計画の同期を参照してください。
FFT コールバック クラスの指定による FFTW 呼び出しの生成
Simulink® モデルを作成します。
MATLAB Function ブロックをモデルに追加します。
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
ブロックを結線します。
コード ジェネレーターが、FFT ライブラリ コールバック クラス
useMyFFTW
で指定された FFTW ライブラリの呼び出しを生成することを指定します。[コンフィギュレーション パラメーター] ダイアログ ボックスで、[カスタム FFT ライブラリのコールバック] をuseMyFFTW
に設定します。コールバック クラスは MATLAB パス上になければなりません。
モデルを作成します。
実行環境での 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));
参考
coder.fftw.StandaloneFFTW3Interface