最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

高速化されたポリフェーズ合成フィルター バンク

この例では、マルチスレッド MEX ファイルを生成して、ポリフェーズ合成 FFT フィルター バンクのシミュレーションを高速化するために dspunfold を使用する方法を説明します。この例では MATLAB Coder が必要です。

ポリフェーズ合成フィルター バンク

dspdemo.PolyphaseFFTMuxer は、ポリフェーズ合成フィルター バンクを実装します。合成バンク、いわゆる muxer は複数の狭帯域チャネルを取り、隣り合わせに並ぶ狭帯域チャネルによって単一の広帯域チャネルを形成します。

実装は、各ポリフェーズの位相について一定数の係数 (PolyphaseLength) をもつポリフェーズ FIR フィルターとなります。このフィルターは PolyphaseLength と等しいステート長をもっています。フィルターの前には、フィルターをさまざまな周波数サブ帯域に変調するために使用する逆 FFT があります。

MATLAB ベースの実装

この例では、PolyphaseLength が 48 のフィルターを使用します。ファイル HelperPolyphaseSynthesisFilterBank がフィルター処理を実行します。例として 64 チャネルを使用し、各チャネルのフレーム サイズは 256 に設定されています。

FrameLength = 256;
Nchan       = 64;

フィルター処理は MATLAB コードを記述して実装されています。入力フレームに対するループが必要なため、実装は生成コードよりも時間がかかる傾向にあります。ifft はコンパイル済みコードを使って実装されるため、この部分の計算速度に対して高速化による大きな影響はありません。ベースラインとして、250 フレームの処理にかかる時間を測定します。

Nframes = 250;
tic
for n = 1:Nframes
    x = complex(randn(FrameLength,Nchan),randn(FrameLength,Nchan));
    y = HelperPolyphaseSynthesisFilterBank(x);
end
toc
Elapsed time is 22.839157 seconds.

高速化したシングルスレッド MEX ファイルとマルチスレッド MEX ファイルの生成

dspunfold を使用してシングルスレッド MEX ファイルとマルチスレッド MEX ファイルの両方を生成できます。入力信号はフレームとし、ステート長は PolyphaseLength で指定し、反復回数を 10 に設定します。使用するスレッド数を 2 に強制することにより、2 コア以上のマシン上で向上が見られるようになります。レイテンシは大きくなりますが、コア数の大きいマシン上でこの値を大きくすることができます。

dspunfold HelperPolyphaseSynthesisFilterBank -args {x} -f true -s 48 -r 10 -t 2
State length: 48 samples, Repetition: 10, Output latency: 40 frames, Threads: 2
Analyzing: HelperPolyphaseSynthesisFilterBank.m
Creating single-threaded MEX file: HelperPolyphaseSynthesisFilterBank_st.mexmaci64
Creating multi-threaded MEX file: HelperPolyphaseSynthesisFilterBank_mt.mexmaci64
Creating analyzer file: HelperPolyphaseSynthesisFilterBank_analyzer.p

シングルスレッド MEX ファイルのベンチマーキング

最初に、生成したシングルスレッド ファイルをベンチマークします。この MEX ファイルは関数 codegen を使って生成される MEX ファイルと等価です。

tic
for n = 1:Nframes
    x   = complex(randn(FrameLength,Nchan),randn(FrameLength,Nchan));
    yst = HelperPolyphaseSynthesisFilterBank_st(x);
end
toc
Elapsed time is 1.255142 seconds.

マルチスレッド MEX ファイルのベンチマーキング

次に、生成したマルチスレッド ファイルをベンチマークします。加速は主としてフィルター処理に影響を与え、その逆 FFT に対しては影響しないため、デスクトップのコア数に正比例した向上とはなりません。しかしながら、多くの場合、少なくとも 60% の向上が見られます。比較を適正に行うため、展開によってレイテンシが発生するマルチスレッドの場合には 40 フレームを追加することに注意します。

tic
for n = 1:Nframes+40
    x   = complex(randn(FrameLength,Nchan),randn(FrameLength,Nchan));
    ymt = HelperPolyphaseSynthesisFilterBank_mt(x);
end
toc
Elapsed time is 0.709653 seconds.