![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1504724/image.jpeg)
simulink にmedfilt1 を搭載したい
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Respuesta aceptada
Atsushi Ueno
el 7 de Oct. de 2023
Editada: Atsushi Ueno
el 10 de Oct. de 2023
Simulinkが毎周期の信号を処理するにあたって、そのままでは前後(過去/未来)の信号を取り扱う事が出来ません。Delayブロックの類を使って、過去の信号値をストックしておき、過去数周期分のベクトル信号としてMedfilt1 処理に入力する必要があります。Tapped Delay ブロックを使いましたが、jc_0624: Tapped Delay ブロック/Delay ブロックの使用方法にある様な Unit Delayブロックを多数使った方法でも構いません。もしくは、MATLAB Function ブロックの内部で過去の信号をストックする方法でも良いです。
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1504724/image.jpeg)
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 comentarios
Atsushi Ueno
el 10 de Oct. de 2023
> という診断メッセージが出ますが、事前に定義されていますか?
⇒ 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 つの要素の平均を取ります。
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1507194/image.png)
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!