simulink にmedfilt1 を搭載したい

조회 수: 3 (최근 30일)
裕利 中尾
裕利 中尾 2023년 10월 6일
댓글: 裕利 中尾 2023년 10월 11일
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개)

카테고리

Help CenterFile Exchange에서 線形予測에 대해 자세히 알아보기

제품


릴리스

R2023a

Community Treasure Hunt

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

Start Hunting!