FAMOS
シーケンス / 関数に関するFAQ
QXY波形の移動平均を求めたい。
MvMean()関数はXY波形をサポートしていないため、下記のようなシーケンスで求めて下さい。
例)
LOAD sintest?
Data = XYof(sintest5, sintest2) ; サンプルデータ
; https://www.toyo.co.jp/mecha/faq/detail/id=2885
_Xsort = Sort(Data.X, 1) ;X軸データを単調増加へ
_Ysort = Value(Data.Y, Sort(Data.X, 3)) ;Y軸データを単調増加へ
_dx = 0.5 ; Xの刻み幅
_x0 = Floor(Min(Data.X) / _dx + 1) * _dx ; Xの開始値。最小値をXの刻み幅で丸め
_xend = Floor(Max(Data.X) / _dx) * _dx ; Xの終了値。最大値をXの刻み幅で丸め
_loop = (_xend - _x0) / _dx ; 区間数
Result = ramp(_x0+_dx/2, _dx, _loop) ; 結果を保存する変数(切り出し範囲の中央にプロット)
_index1 = PosiEx2(_Xsort, _x0, 0, 4) ; (最初の)切り出し開始位置
for _iii = 1 to _loop step 1
_x = _dx*_iii + _x0 ; Yを切り出したい範囲のXの終了値
_index2 = PosiEx2(_Xsort, _x, 0, 4) ; 切り出し終了位置
_Ycut = CutIndex(_Ysort, _index1, _index2) ; 切り出し
_Ymean = Mean(_Ycut) ; 平均
Result[_iii] = _Ymean ; 結果を保存
_index1 = _index2 + 1 ; 切り出し開始位置更新
end
SetUnit(Result, Unit?
Q変数名にアルファベットを連番で追加したい。(例. Data_A, Data_B, Data_C, ...)
SvToChar()関数でASCIIコードを文字に変換することによりアルファベットを連番で作成できます。
大文字A~ZはASCIIコードで65~90、小文字a~zは97~122になります。
例)
for _iii = 1 to 5 step 1
_name = "Data_" + SvToChar(64+_iii) ; アルファベットA,B,...を付加した変数名
<_name> = ... ; ファイルから読み込んだデータなどを代入
end
アルファベットではなく数値を文字として追加したい場合は
https://www.toyo.co.jp/mecha/faq/detail/id=13204
https://www.toyo.co.jp/mecha/faq/detail/id=14240
を参照して下さい。
Qシーケンスのパスを取得したい。
Q50Hz, 100Vrms(振幅141V)のサイン波をFFT()関数でFFTした結果が50Hzの所で約70.7Vにしかならない。
Q波形の時間差を求めたい。
SearchLevel()関数により立ち上がり位置を求めて、その差を取ることで求められます。
例)
下図のような波形の立ち上がり位置(2Vになる点)から波形の時間差を求めるサンプルシーケンスを示します。
_data1 = slope1
_data2 = slope2
_th = 2 ; 立ち上がりのしきい値
_sl1 = SearchLevel(_data1, 2, _th, 0, 2, 0, 0, 1)
_sl2 = SearchLevel(_data2, 2, _th, 0, 2, 0, 0, 1)
dt = _sl2.X - _sl1.X ; 波形の時間差(ピーク毎)
dt_mean = Mean(dt) ; 波形の時間差(平均)
QX軸の値が減少していくXY波形を等間隔波形(標準データ形式)にリサンプリングしたい。
Mirror()関数で反転させることによりXYdt()関数で等間隔にリサンプリングできます。
例)
_x = (1 - Ramp(0, 0.1, 11)^2) * 1 'V'
_y = (10 - Ramp(0, 0.1, 11)) * 1 'A'
Data = XYof(_x, _y) ; サンプルデータ
_dt = 0.1 ; リサンプリング時間
Data_ND = XYdt(Mirror(Data.x), Mirror(Data.y), _dt) ; 等間隔にリサンプリングした波形
; カーブウィンドウに表示
CwNewWindow("Cv1", "show")
CwSelectWindow("Cv1")
CwAction("reset")
CwPosition(0,0,640,480)
CwDisplaySet("grid", 1)
CwSelectByIndex("X-axis", 1)
CwAxisSet("ticks.option", 4)
CwAxisSet("ticks.spacing", 0.1)
CwNewChannel("append last axis", Data)
CwLineSet("symbol", 1)
CwNewChannel("append last axis", Data_ND)
CwLineSet("symbol", 8)
Q波形の一部を一定値や別の波形で置換したい
標準波形の場合はRepl()関数とReplIndex()関数、XY波形の場合はReplIndex()関数で波形の置換ができます。
例)
; 標準波形の置換
_t = ramp(0, 0.001, 1000) * PI2
data = sin(_t) ; サンプルデータ
_replace = Cut(data, 0.1, 0.3) ; 置換範囲(時間で指定)
_replace = _replace * 0 + 0.2 ; 置換したい波形
new_data = Repl(data, _replace) ; 置換
; カーブウィンドウで表示
CwNewWindow("Cv1", "show")
CwSelectWindow("Cv1")
CwAction("reset")
CwPosition(0,0,480,480)
CwNewChannel("append last axis", data)
CwNewChannel("append last axis", new_data)
CwLineSet("width.screen", 0.5)
; XY波形の置換
_t = ramp(0, 0.001, 500) * PI2
data_xy = XYof(sin(_t), cos(_t)) ; サンプルデータ。半円
_start_index = 50 ; 置換範囲(インデックスで指定)
_end_index = 100
_replace = CutIndex(data_xy, _start_index, _end_index)
_replace.Y = _replace.Y * 0 + 0.2 ; 置換したい波形
new_data_xy = ReplIndex(data_xy, _replace, _start_index) ; 置換
; カーブウィンドウで表示
CwNewWindow("Cv2", "show")
CwSelectWindow("Cv2")
CwAction("reset")
CwPosition(480,0,480,480)
CwNewChannel("append last axis", data_xy)
CwNewChannel("append last axis", new_data_xy)
CwLineSet("width.screen", 0.5)
Q0以外の最小値を求めたい。
Sort()関数で並べ替えた後、0以外になる最初の数値を調べることで求めることができます。
例)
Data = (ASin(Sin(ramp(0, 0.1, 50) * PI2 * 1 - PI/2)) / PI + 0.5) * 2 ; サンプルデータ。三角波。
_sort = Sort(Data, 1) ; 昇順にソート
MinExcept0 = 0 ; 0以外の最小値。見つからなかった場合は0。
; foreach VALUE列挙タイプはVer7.3以降が必要。7.2まではSAMPLE列挙タイプ, while文などで。
foreach VALUE _v IN _sort
if 0 < _v
MinExcept0 = _v
break
end
end
QFFT()関数で計算したFFT結果を複素数計算したい。
Qフィルター関数の特性を確認したい。
Q時間軸が不等間隔なXY波形をフィルターやFFT解析したい。
Q計測データをサイン波形で近似したい。
ApproNonLin()関数により、三角関数、指数関数、対数関数、多項式、それらを組み合わせた式で近似した波形の係数を取得できます。
ApproNonLin()関数を使用するには、imc FAMOS Ver 7.2以降のProfessional版以上が必要です。
サンプルシーケンスを下記に示します。
例)
LOAD sintest1
Data = sintest1
A = ApproNonLin(Data, "A1*sin(PI2*A2*x)+A3 -y")
; 係数:A1=A[1], A2=A[2], A3=A[3]
x = Ramp(XOff?(Data), XDel?(Data), Leng?(Data))
Approx = A[1]*sin(PI2*A[2]*x)+A[3] ; 近似波形
CwNewWindow("Cv1", "show") ; カーブウィンドウで表示
CwSelectWindow("Cv1")
CwAction("reset")
CwPosition(0,0,640,480)
CwNewChannel("append last axis", Data)
CwNewChannel("append last axis", Approx)
CwLineSet("width.screen", 0.5)
Q関数ヘルプの文字のサイズを変更したい。
Qシーケンスエディターの文字のサイズを変更したい。
Qシーケンスエディターに行番号を表示したい。
Q読み込んだデータファイルの数値桁数が少ないために時間軸が不等間隔のXY波形として読み込まれた。一定間隔の波形にするにはどうすればよいか?
Q最小二乗法により波形を近似するには?
Qシーケンスの引数に*を使用できない
Q等間隔データをパルス信号で外部サンプリングしたい
FAQ ID:s069
サンプリング間隔が等間隔のデータを測定しました。そのデータには信号波形とパルス信号を含みます。このパルス信号でデータをリサンプリングしたいのですが、可能ですか?
以下のシーケンスで対応可能です。
関数SearchLebelでパルス信号のエッジを検出して、その時刻暦で関数Valueを使ってデータをリサンプリングします。
結果はResult1がYデータのみ、ResはXY波形としましたので、リサンプル前のデータと比較して効果を確認してください。
;----------------------------------------
;信号の定義
;----------------------------------------
_pulseorg = PULSEDATA
_data1 = SIGNAL
;----------------------------------------
;データ処理
;----------------------------------------
;パルス信号を検出
_pulseTemp = SearchLevel(_pulseorg, 2, 0, 0, 2, 0, 0, 1)
_pulse = _pulseTemp.X
;データ処理結果
Result1 = Value( _data1, _newPulse)
Res = XYof(_newPulse,Result1)
;----------------------------------------
;終了処理
;----------------------------------------
Del _*
Q等間隔データをパルス信号で外部サンプリングしたい(その2)
FAQ ID:s070
サンプリング間隔が等間隔のデータを測定しました。そのデータには信号波形とパルス信号を含みます。このパルス信号でデータをリサンプリングしたいです。
但し、パルスデータは60[deg]毎にしか出力されません。1[deg]毎に細かくデータをリサンプリングしたいのですが、可能ですか?
以下のシーケンスで対応可能です。
関数SearchLebelでパルス信号のエッジを検出します。
次に、この60[deg]間隔のパルスを関数LIPで1[deg]間隔に変換します。
そして、その時刻暦で関数Valueを使ってデータをリサンプリングします。
結果はResult1がYデータのみ、ResはXY波形としましたので、リサンプル前のデータと比較して効果を確認してください。
;----------------------------------------
;定数の定義
;----------------------------------------
_pdeg = 60 ;パルス間隔を60[deg]で処理
;----------------------------------------
;信号の定義
;----------------------------------------
_pulse60deg = PULSE60
_data1 = SIGANL
;----------------------------------------
;データ処理
;----------------------------------------
;パルス信号を検出
_pulseTemp = SearchLevel(_pulse60deg, 2, 0, 0, 2, 0, 0, 1)
_pulse = _pulseTemp.X
;60degパルスを1degに変換
_newPulse = Lip(_pulse, _pdeg)
;データ処理結果
Result1 = Value( _data1, _newPulse)
Res = XYof(_newPulse,Result1)
;----------------------------------------
;終了処理
;----------------------------------------
del _*