コード置換ライブラリ非対応関数をコード置換する方法
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Shoumei
el 22 de Feb. de 2018
Editada: Atsushi Matsumoto
el 23 de Mzo. de 2018
Cortex-M4向けにコード置換ライブラリを使用してターゲットプロセッサ向けに最適化されたCコードを生成したいのですが、MATLABファイル内で使用しているfiltfilt関数が対応していないようです。filtfilt関数の処理は普通の畳み込み演算+アルファの処理を行っているので、コード置換で最適化できそうなものですが、何か良い方法はありませんか?
0 comentarios
Respuesta aceptada
Atsushi Matsumoto
el 23 de Mzo. de 2018
Editada: Atsushi Matsumoto
el 23 de Mzo. de 2018
コード置換に対応していない関数は、内部処理をコード置換に対応した関数で書き換えることで対応させることができる場合があります。 filtfiltやsgolayfiltなどのIIR/FIRフィルタベースの処理関数はソースコードをカスタマイズすることでコード置換に対応させることができます。
 
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 comentarios
Más respuestas (0)
Ver también
Categorías
Más información sobre モデル コンフィギュレーション en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!