simulink にmedfilt1 を搭載したい
3 次查看(过去 30 天)
显示 更早的评论
0 个评论
采纳的回答
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
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 つの要素の平均を取ります。
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 線形予測 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!