シーケンス / 関数top

シーケンス / 関数に関するFAQ

QFFT()関数で計算したFFT結果を複素数計算したい。

A

Rect()関数でMP(Magnitude-Phase)形式からRI(Real-Imaginary)形式に変換した後、実部、虚部に対して計算して下さい。

製品詳細はこちら

回答を閉じる

Qフィルター関数の特性を確認したい。

A

フィルター関数の特性はインパルス波形をフィルターしてFFTすることで確認できます。

例)
サンプルシーケンスをFAMOSで実行して下さい。
FiltLP_特性確認.seq

製品詳細はこちら

回答を閉じる

Q時間軸が不等間隔なXY波形をフィルターやFFT解析したい。

A

XYdt()関数でXY波形を希望のサンプリング時間でリサンプリングをして標準波形に変換してから適用して下さい。

例)
data2 = XYdt(data.X, data.Y, 0.001) ; XY波形dataを0.001s(=1kHz)でリサンプリング
filt = FiltLP(data2, 0, 0, 4, 100) ; 100Hzのローパスを適用

製品詳細はこちら

回答を閉じる

Q計測データをサイン波形で近似したい。

A

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関数ヘルプの文字のサイズを変更したい。

A

Ver. 7.1以降から[ヘルプ]タブにフォーカスがある状態でCTRL+[+]またはCTRL+[マウスホイールアップ]で文字サイズの拡大、CTRL+[-]またはCTRL+[マウスホイールダウン]で文字サイズの縮小ができます。

製品詳細はこちら

回答を閉じる

Qシーケンスエディターの文字のサイズを変更したい。

A

Ver. 7.3以降から[シーケンスエディター]タブにフォーカスがある状態でCTRL+[+]またはCTRL+[マウスホイールアップ]で文字サイズの拡大、CTRL+[-]またはCTRL+[マウスホイールダウン]で文字サイズの縮小ができます。Ver. 7.2までは[エクストラ]>[オプション]>[エディタ]の[フォント]の[変更]ボタンからフォントサイズを変更して下さい。

製品詳細はこちら

回答を閉じる

Qシーケンスエディターに行番号を表示したい。

A

Ver. 7.3以降から[エクストラ]>[オプション]>[エディタ]の[Show line number in sequences]にチェックを入れることでシーケンスエディターに行番号を表示することができます。

製品詳細はこちら

回答を閉じる

Q読み込んだデータファイルの数値桁数が少ないために時間軸が不等間隔のXY波形として読み込まれた。一定間隔の波形にするにはどうすればよいか?

A

下記の例のようにリサンプリングして下さい。

例)
_dt = (_data[Leng?(_data.X)].X - _data[1].X) / (Leng?(_data.X) - 1)
DataStd = XYdt(_data.X, _data.Y, _dt)

製品詳細はこちら

回答を閉じる

Q最小二乗法により波形を近似するには?

A

Poly()関数を使用して下さい。詳細は関数ヘルプ(関数名の上でCTRL+F1)を参照して下さい。

製品詳細はこちら

回答を閉じる

Qシーケンスの引数に*を使用できない

FAQ ID:s072

Q

シーケンスの引数として5*4などのように*が含まれた場合、シーケンスが動作しない。

A

初期のFAMOSでは*をワイルドカードとして使用できました。このため、引数に*が含まれた場合、動作しません。

製品詳細はこちら

回答を閉じる

Q等間隔データをパルス信号で外部サンプリングしたい

FAQ ID:s069

Q

サンプリング間隔が等間隔のデータを測定しました。そのデータには信号波形とパルス信号を含みます。このパルス信号でデータをリサンプリングしたいのですが、可能ですか?

A

以下のシーケンスで対応可能です。

関数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

Q

サンプリング間隔が等間隔のデータを測定しました。そのデータには信号波形とパルス信号を含みます。このパルス信号でデータをリサンプリングしたいです。
但し、パルスデータは60[deg]毎にしか出力されません。1[deg]毎に細かくデータをリサンプリングしたいのですが、可能ですか?

A

以下のシーケンスで対応可能です。

関数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 _*

製品詳細はこちら

回答を閉じる

Q0を中心に±に振れる信号があります。正側を5倍、負側を3倍にしたい

FAQ ID:s068

A

以下のサンプルファイルを例にします。

この信号に対して0より大きい値を5倍、0より小さい値を3倍にします。
最初に必要なのでは、0より大きい信号を見つけることです。ある条件を設定し、値を抽出するためには関数SearchLevelを利用すると便利です。

resp = SearchLevel( Data, 2, 0, 0, 0, 0, 0, 0)

この関数を実行すると、0より大きい値を抽出します。

この信号を5倍して、元のデータに戻すことで目的を達成します。信号を5倍にするためには単純に5を掛ければよいです。元のデータに値を戻すには関数”Set”を利用します。
SearchLevelの結果はXY波形です。Set関数の第2引数にXデータ、第3引数にYデータを指定します。

Data = Set( Data, resp.X, resp.Y*5)

以上で結果は正側のみ5倍になります。

この後、負側も同様に行います。

以上です。

シーケンスは以下の通りです。

;***********************************************
;
; 正側を5倍、負側を3倍にします
;
;***********************************************
; 後でデータを比較するためにコピーします。
  Data = sintest1
; 正側のデータを抽出します
  resp = SearchLevel(Data, 2, 0, 0, 0, 0, 0, 0)
; 負側のデータを抽出します
  resm = SearchLevel(Data, 1, 0, 0, 0, 0, 0, 0)
; 元のデータに演算結果を戻します
  Data = Set(Data,resp.X, resp.Y*5)
  Data = Set(Data,resm.X, resm.Y*3)

回答を閉じる

Qパルス信号を回転数に変換したい

FAQ ID:s067

Q

パルス信号を回転数データに変換することはできますか?

A

可能です。
以下のデータを対象とします。"pulse"はパルス信号、"signal"は加速度信号です。

以下の図はパルス信号の拡大図です。

最初にこのパルス信号の各パルスの立ち上がりポイントを取得します。
この位置を取得するためには関数"SearchLevel"を利用します。

res = SearchLevel( pulse, 2, 1, 0, 2, 0, 0, 1)

関数のパラメータを簡単に設定するためにはSearchLevelと記述した後で、関数の上にカーソルを置いてSHIFT+F1を押してください。以下のダイアログが表示され、パラメータを簡単に設定できます。

上の設定は1V以上の立ち上がりの変化ポイントを検出します。
この結果は変数リストに以下のように表示されます。

注意:
下図のように表示されない場合、変数リストの上で右クリックして、”コンポーネント表示”を選択してください。

結果は以下のように条件が成立した点だけ取得しますので、等間隔データではなく、XY波形となります。

この"res.X"変数はパルスの立ち上がりポイントのX座標を示します。

この結果を利用して回転数を求めます。
各ポイントのX座標の間隔は前後のデータのX座標の差分です。データ数を合わせるために1つずらしたデータを作成します。

res1 = CutIndex( res.X, 1, leng?(res.X)-1)
res2 = CutIndex( res.X, 2, leng?(res.X))

これらの差分が各パルスの時間間隔です。

DiffTime = Res2-Res1

回転数(RPM)に変換するためには以下のようにします。

RPM = 1/DiffTime*60

以上よりRPM信号を取得できます。
例えば、この結果を利用して、加速度波形のRMSを求めてXYグラフを作成すると以下のようになります。

Acc = MvRMS(Signal,0.04,0.04)
Result = XYof(RPM,ACC)

シーケンスは以下の通りです。

;***********************************************
;
; パルス信号をRPMに変換
;
;   pulseという変数にパルス信号を入力してください
;***********************************************
;パルスの立ち上がりを検出します。
res = SearchLevel(pulse, 2, 1, 0, 2, 0, 0, 1)
;パルスの立ち上がり時間間隔からRPMを算出します
res1 = CutIndex( res.X, 1, leng?(res.X)-1)
res2 = CutIndex( res.X, 2, leng?(res.X))
DiffTime = Res2-Res1
RPM = 1/DiffTime*60
;この部分はおまけです。XY波形を作成します
Acc = MvRMS(Signal,0.04,0.04)
Result = XYof(RPM,ACC)

製品詳細はこちら

回答を閉じる

Q間欠的な振動波形を波形毎に切り出してFFTしたい

FAQ ID:s039

Q

下図のように間欠的に振動が発生します。このデータをFFTすると、振動の途中でウィンドウを切り出してしまい上手くデータ処理されません。 各振動波形を切り出してからFFTできますか?

A

以下のシーケンスでは各振動波形を切り出して、最後にFFT処理を行っています。

;ドリフト成分を除去します

_temp1 = FiltHP(data, 0, 0, 8, 1)
_temp2 = ExpoRMS(_temp1, 0.02, 0.02)
_temp3 = SearchLevel(_temp2, 2, 1, 0, 0, 0, 0, 1)

;ここではSearchLevelでどのような処理をするのでしょうか?
;----------------------------------------------------
;各振動波形を分離するための座標を取得しています。
;結果を確認したければ、_temp2を表示させ、その上に_temp3を重ね書きしてください
;その後で_temp3のスタイルを丸などに変更すると結果を確認できます。

_temp4 = Leng(0,1024)
show _temp4

; Leng(0,1024)では波形が”0”になっています。どういう事でしょうか?
;なぜShowにて表示するのでしょうか?
;----------------------------------------------------
;計算途中を表示するために長さ1024の空の波形を作っています。

_temp6 = Leng(0,0)

; Leng(0,0)では波形が”0”になっています。どういう事でしょうか?
;----------------------------------------------------
;後のループで値を代入するために_temp6というダミー波形を作成しました。

_i=1
while _i<Leng?(_temp3)
_temp5 = Cut(_temp1, _temp3[_i].X-0.1, _temp3[_i+1].X-0.1)
_temp4 = Leng(_temp5, 1024)

_temp6 = Join(_temp6, _temp4)

_i=_i+1
end

;これらの行でどのような処理をされているのでしょうか?
;----------------------------------------------------
;SearchLevelで検出した各振動波形毎にデータを切り出し、
;そのデータ長さを1024点に拡張して、再構成しています。

Result = AmpSpectrumRMS_1(_temp6, 1024, 0, 0, 1)

製品詳細はこちら

回答を閉じる

Qデータサイズが大きすぎてExcelに貼り付けられません

FAQ ID:s037

Q

通常、波形エディターに数値データを表示させて、Excelにコピーしています。
今回データサイズが大きすぎてExcelに貼り付けられません。対策はありますか?

A

波形をExcelで処理できるデータ数に分割してから貼り付ける必要があります。
これを自動化したシーケンスを以下に示しますので参考にしてください。

;------------------------------------
;サンプルデータの作成
;------------------------------------
    data = sin(Ramp(0,1,100000))
;------------------------------------
;定義
;------------------------------------
    ;Excelの最大行
    RowMax = 65000
    ;出力したい列番号
    Col    = 1
;------------------------------------
;データ転送
;------------------------------------
    ;区切り文字の指定
    DDESepar( "\r\n")
    ;シート数の算出
    _SheetNum = Floor( Leng?(data)/65000)+1
    _page=1
    while _page<=_SheetNum
        ;転送先アドレス
        _cellAdr = "R1C"+TForm(col,"F00")+":R"+TForm(RowMax,"F00")+
        "C"+TForm(col,"F00")
        ;波形を切り出し
        _temp    = CutIndex(data, (_page-1)*RowMax+1, _page*RowMax)
        ;データ転送
        _err     = DDESet("Excel", "Sheet"+TForm(_page,"F00"), _cellAdr,
       _temp, 1)
       _page=_page+1
    end

製品詳細はこちら

回答を閉じる

Qsmo関数のパラメータ指定方法について

FAQ ID:s036

Q

平滑する幅は奇数ポイントになるように指定しないといけないのでしょうか?
偶数ポイントになるような指定をするとどのような処理になるのでしょうか?

A

平滑化する幅が5点より大きいければ、重み関数は三角形の形状で、奇数ポイントとなります。
選択された間隔が5点ならば、関数"Smo5"と同じです。3点ならば関数"Smo3"と同じです。

偶数ポイントを指定した場合、指定した値に対して最も大きい奇数ポイントで計算します。
以下のサンプルでご確認ください。

a=ramp(0,1,20)
i=1
while i<=20
  if mod(i,2)=1
    a[i]=-a[i]
  end
  i=i+1
end

b1=smo(a,1)
b2=smo(a,2)
b3=smo(a,3)
b4=smo(a,4)
b5=smo(a,5)
b6=smo(a,6)
b7=smo(a,7)
b8=smo(a,8)
b9=smo(a,9)

製品詳細はこちら

回答を閉じる

Qコマンド・関数・キットで同じようなコマンドがありますが、何が違うのですか?

FAQ ID:s034

Q

例えば、ファイル関係に対して以下のようにコマンド・関数・キットとさまざまな方法があります。これらはどのように異なり、どのように使い分ければよいのでしょうか?

コマンド B> Load,Save
関数 13> ファイル関数
キット File-kit

A

FAMOSの歴史と関係します。概念として以下のような違いがあります。

コマンド 非常に簡単に使用できますが、細かなことはできません。 コマンドはFAMOSの古いバージョンで使用していた関数です。 以前のバージョンとの互換性を保つために残されています。
関数 信号処理ソフトウェアとして必要な機能を集約しています。通常はこの関数を利用してください。
キット関数 関数でも実現できますが、さらに専門的な処理を実現したものです。 キット関数はアプリケーション使用時のメモリー消費を抑えるために、メニューメニュー”エクストラ/オプション”の”機能拡張/キット関数の登録”で使用するか否か設定可能です。

製品詳細はこちら

回答を閉じる

Qパルス波形を分周するためにはどうすればよいですか?

FAQ ID:s030

A

パルス波形を分周する関数は存在しません。シーケンスで作成します。
下記サンプルを参考にしてください。

;************************************************************
; パルス波形を分周するサンプル
;************************************************************
;------------------------------------------------------------
; サンプルデータを作成します
;------------------------------------------------------------
_xdelta = 0.01
_xpoint = 1000
_temp1 = Ramp( 0, _xdelta, _xpoint)
_temp2 = Ramp( _xdelta, _xdelta*10, _xpoint/10)
Pulse = Set( _temp1*0, _temp2, _temp2*0+1)
Delete _*
Show Pulse
;////////////////////////////////////////////////////////////
; データ処理部
; パルス波形を1/10に分周します
;------------------------------------------------------------
;【引数】
; Pulse = 入力データ
;
;【戻値】
; Result = 結果
;
;【パラメータ】
  _Ratio = 10
;////////////////////////////////////////////////////////////
;各パルスを取得します。
; 本サンプルではパルス形状は台形ではなく、インパルス状ですが
; いずれにも対応します。
  _ckLevel   = SearchLevel(Pulse, 2, 0.5, 0, 2, 0, 0, 1)
  _ckLevel.Y = _ckLevel.Y*0+1
;分周するために各パルスにラベルをつけます
  _Counter  = Int( _ckLevel.Y)
  _Counter  = Leng( _Counter, Leng?(_Counter)-1)
  _Divider  = Mod( _Counter, _Ratio)
  _Divider  = XYof( _ckLevel.X, _Divider)
;指定(分周)されたパルスを取得します。
  _DivLevel = SearchLevel( _Divider, 3, 1, 1, 2, 0, 0, 1)
  Result    = Set( Pulse*0, _DivLevel.X, Leng(0,Leng?(_DivLevel))+1)
;////////////////////////////////////////////////////////////
;結果を表示します
CvYAxis( Pulse, Result, 0,0,0, 400, -2)
CvAttrib(Pulse, 1)

製品詳細はこちら

回答を閉じる

Qヒルベルト変換の関数はありますか?

FAQ ID:s029

A

Ver4.0の時点では存在しません。メーカーに問い合わせたところ、バージョンアップで対応するという回答をもらいました。
バージョンアップでサポートされるまで以下のシーケンスで代用してください。

;---------------------------------------------
; ヒルベルト変換
;---------------------------------------------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; サンプルデータの読み込み

  Famos
  Load C:\imc\dat\slope.dat __data

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 演算

  FftOption 0 0
  _fan = fft( __data )
  _fan.p = _fan.p - 90
  _t1 = ifft ( _fan )
  hilbert = Sqrt(Sqr(__data)+Sqr(_t1))       < 包落線


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 瞬間周波数

  angle = atan2(_t1, __data)
  angle1 = cutIndex(angle, 1, leng?(angle)-1)
  angle2 = cutIndex(angle, 2, leng?(angle))
  angle2=xoff(angle2,0)
  angle = angle2-angle1

  i=1
  while i<=leng?(angle)
    if angle[i]<-pi
      angle[i]=angle[i]+pi2
    end
    if angle[i]>pi
      angle[i]=angle[i]-pi2
    end
    i=i+1
  end 
  Freq = angle/pi2

    delete _t1
    delete _fan

製品詳細はこちら

回答を閉じる