コード置換ライブラリ​非対応関数をコード置​換する方法

2 ビュー (過去 30 日間)
Shoumei
Shoumei 2018 年 2 月 22 日
編集済み: Atsushi Matsumoto 2018 年 3 月 23 日
Cortex-M4向けにコード置換ライブラリを使用してターゲットプロセッサ向けに最適化されたCコードを生成したいのですが、MATLABファイル内で使用しているfiltfilt関数が対応していないようです。filtfilt関数の処理は普通の畳み込み演算+アルファの処理を行っているので、コード置換で最適化できそうなものですが、何か良い方法はありませんか?

採用された回答

Atsushi Matsumoto
Atsushi Matsumoto 2018 年 3 月 23 日
編集済み: Atsushi Matsumoto 2018 年 3 月 23 日
コード置換に対応していない関数は、内部処理をコード置換に対応した関数で書き換えることで対応させることができる場合があります。 filtfiltやsgolayfiltなどのIIR/FIRフィルタベースの処理関数はソースコードをカスタマイズすることでコード置換に対応させることができます。
&nbsp
filtfiltのソースコードをIIRフィルタのSystem Object: dsp.BiquadFilterを使って書き換えた例を添付します。
この例では2次のIIRフィルタを使ってフィルタリングする例となっていますので、異なるフィルタを使用している場合は、一部の修正が必要になると思います。
function y = filtfiltSysO(x, sos, g)
%FILTFILT Zero-phase forward and reverse digital IIR filtering.
% filter, reverse data, filter again, and reverse data again
persistent Hd1 Hd2
if isempty(Hd1)
Hd1 = dsp.BiquadFilter('Structure','Direct form II transposed', ...
'SOSMatrix',sos,'ScaleValues',g);
Hd2 = dsp.BiquadFilter('Structure','Direct form II transposed', ...
'SOSMatrix',sos,'ScaleValues',g);
end
nfact = single(6);
y = [2*x(1)-x(nfact+1:-1:2); x; 2*x(end)-x(end-1:-1:end-nfact)];
% y = filter(b(:,ii),a(:,ii),y,zi(:,ii)*y(1));
y = step(Hd1, y);
y = y(end:-1:1);
% y = filter(b(:,ii),a(:,ii),y,zi(:,ii)*y(1));
y = step(Hd2, y);
% retain reversed central section of y
y = y(end-nfact:-1:nfact+1);
添付ファイルは
filtfiltSysO.m: filtfiltのコード置換に対応したSystem Objectバージョン
filtfilt_tb.m: 上記コードのテスト用ファイル
filtfiltSysO_script.m: Cコード生成用スクリプト。フィルタ係数は定数(coder.Constant)で与える必要がある点に注意。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchangeモデル コンフィギュレーション についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!