simulink にmedfilt1 を搭載したい

3 次查看(过去 30 天)
裕利 中尾
裕利 中尾 2023-10-6
Medfilt1 をSimulink に搭載すべく,Matlab function block にcode を作成したが、
例題と同じ波形を得ることができなかった。
(次数は変数"od"で入力

采纳的回答

Atsushi Ueno
Atsushi Ueno 2023-10-7
编辑:Atsushi Ueno 2023-10-10
Simulinkが毎周期の信号を処理するにあたって、そのままでは前後(過去/未来)の信号を取り扱う事が出来ません。Delayブロックの類を使って、過去の信号値をストックしておき、過去数周期分のベクトル信号としてMedfilt1 処理に入力する必要があります。Tapped Delay ブロックを使いましたが、jc_0624: Tapped Delay ブロック/Delay ブロックの使用方法にある様な Unit Delayブロックを多数使った方法でも構いません。もしくは、MATLAB Function ブロックの内部で過去の信号をストックする方法でも良いです。
function y = fcn(u,od)
flt = medfilt1(u,od); % ここで入力信号uは1*10のベクトル信号である事を想定
y = flt(floor(od/2)+1); % 出力も1*10なので、真ん中の値(スカラ値)を出力する
end % 誤記修正↑【誤】fllor(od/2) ⇒【正】floor(od/2)+1
  4 个评论
Atsushi Ueno
Atsushi Ueno 2023-10-10
> という診断メッセージが出ますが、事前に定義されていますか?
⇒ NO: 未定義です。"fllor" は "floor" の誤記でした。
> コメントの”真ん中の値”が配列の平均値を意味していますか?
⇒ NO: ”真ん中の値”ではありますが、配列の中央値です。
中央値は、データを小さい順に並べたときにちょうど真ん中に来る値のことです。
> "floor"でしょうか?
⇒YES!! 正解です。誤記の他、計算式にも誤りがありました。
>「odが奇数のとき、配列順の小さい方を選べ」ですか?
⇒YES!! 正解ですが、その後1加算する必要がありました
「真ん中の値」は「次数が奇数の場合は (N+1)/2 番目の値)、次数が偶数の場合は (N/2)+1 番目の値でした。例えば、N=3 なら 2 番目、N=4 なら 3 番目、N=7 なら 4 番目、N=10 なら 6 番目です。私は次数が偶数の場合 (N/2) 番目になると思い込んでいた為 fllor(od/2) と書きましたが正しくは floor(od/2)+1 です。
  • 次数 n が奇数の場合、y(k) x(k-(n-1)/2:k+(n-1)/2) の中央値。
  • 次数 n が偶数の場合、y(k) x(k-n/2:k+(n/2)-1) の中央値。この場合、関数は数値を並べ替え、並べ替えたリストの中央の 2 つの要素の平均を取ります。
裕利 中尾
裕利 中尾 2023-10-11
ありがとうございました。

请先登录,再进行评论。

更多回答(0 个)

产品


版本

R2023a

Community Treasure Hunt

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

Start Hunting!