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

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

Accepted Answer

Atsushi Matsumoto
Atsushi Matsumoto on 23 Mar 2018
Edited: Atsushi Matsumoto on 23 Mar 2018
コード置換に対応していない関数は、内部処理をコード置換に対応した関数で書き換えることで対応させることができる場合があります。 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)で与える必要がある点に注意。

More Answers (0)

Categories

Find more on モデル コンフィギュレーション in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!