FAQ

FAMOS

シーケンス / 関数top

スペクトラムキット&周波数解析関係

ID.p006

Q. FFT解析結果を1/3オクターブで表示

A.


;*********************************************************
;FFT解析結果を1/3オクターブバンドで表示させるサンプル
; FFTした結果は周波数間隔がリニアです。
; 1/3オクターブ表示は対数軸なので、変換が必要になります。
; (高周波では1/3オクターブの1つのバンドに対して
; 複数のFFTした結果が含まれることになります。)
;
;FFT解析結果を変数"_DATA"に予め格納してください
;*********************************************************

;----------------------------
;データ処理する周波数
 _StartFreq = 1
_StopFreq = 250
;----------------------------

;----------------------------------------------
;1/3オクターブデータの作成
;このサンプルでは0.1Hzから8000Hzまでのデータを生成しています。
;
; _Startで開始オクターブインデックスを指定します。
; 例: -1=0.1Hz: 0=1Hz: 1=10Hz
;_Octaveでオクターブバンドを指定します。
; 例:3を指定した場合、1~1000Hz
;----------------------------------------------
_Start = -1 ;開始オクターブインデックス
_Octave = 5 ;オクターブバンド
_OctData = GrNew()

;[上側周波数]
_OctData:High = Leng( 0, 10*_Octave)
_OctData:High = XOff( _OctData:High, _Start*10)

;[下側周波数]
_OctData:Low = Leng( 0, 10*_Octave)
_OctData:Low = XOff( _OctData:Low, _Start*10)

;[中心周波数]
_OctData:Center = Leng( 0, 10*_Octave)
_OctData:Center = XOff( _OctData:Center, _Start*10)

_i=1
While _i<=_Octave

 ;[上側周波数]
 _OctData:High[10*(_i-1)+1] =1.12*10^(_Start)
 _OctData:High[10*(_i-1)+2] =1.40*10^(_Start)
 _OctData:High[10*(_i-1)+3] =1.80*10^(_Start)
 _OctData:High[10*(_i-1)+4] =2.24*10^(_Start)
 _OctData:High[10*(_i-1)+5] =2.80*10^(_Start)
 _OctData:High[10*(_i-1)+6] =3.55*10^(_Start)
 _OctData:High[10*(_i-1)+7] =4.50*10^(_Start)
 _OctData:High[10*(_i-1)+8] =5.60*10^(_Start)
 _OctData:High[10*(_i-1)+9] =7.10*10^(_Start)
 _OctData:High[10*(_i-1)+10] =9.00*10^(_Start)

 ;[下側周波数]
 _OctData:Low[10*(_i-1)+1] =0.90*10^(_Start)
 _OctData:Low[10*(_i-1)+2] =1.12*10^(_Start)
 _OctData:Low[10*(_i-1)+3] =1.40*10^(_Start)
 _OctData:Low[10*(_i-1)+4] =1.80*10^(_Start)
 _OctData:Low[10*(_i-1)+5] =2.24*10^(_Start)
 _OctData:Low[10*(_i-1)+6] =2.80*10^(_Start)
 _OctData:Low[10*(_i-1)+7] =3.55*10^(_Start)
 _OctData:Low[10*(_i-1)+8] =4.50*10^(_Start)
 _OctData:Low[10*(_i-1)+9] =5.60*10^(_Start)
 _OctData:Low[10*(_i-1)+10] =7.10*10^(_Start)

 ;[中心周波数]
 _OctData:Center[10*(_i-1)+1] =1.00*10^(_Start)
 _OctData:Center[10*(_i-1)+2] =1.25*10^(_Start)
 _OctData:Center[10*(_i-1)+3] =1.60*10^(_Start)
 _OctData:Center[10*(_i-1)+4] =2.00*10^(_Start)
 _OctData:Center[10*(_i-1)+5] =2.50*10^(_Start)
 _OctData:Center[10*(_i-1)+6] =3.15*10^(_Start)
 _OctData:Center[10*(_i-1)+7] =4.00*10^(_Start)
 _OctData:Center[10*(_i-1)+8] =5.00*10^(_Start)
 _OctData:Center[10*(_i-1)+9] =6.30*10^(_Start)
 _OctData:Center[10*(_i-1)+10] =8.00*10^(_Start)

 _Start = _Start+1

 _i=_i+1
End

;データ処理する周波数を含むようにインデックスを求めます。

 _StartIndex = Floor( Pos( _OctData:Low, _StartFreq))
 _StopIndex  = Floor( Pos( _OctData:High,
 _StopFreq)-0.001)+1

_OctNum = _StopIndex-_StartIndex+1
_OctRes = Leng( 0, _OctNum)

 _i=1
 While _i<=_OctNum

    ;FFTデータをオクターブバンド毎に切り出し、その合計値を求めます。
    _OctIndex    = _StartIndex +(_i -1)
    _OctLowFreq  = Value(_OctData:Low, _OctIndex)
    _OctHighFreq = Value(_OctData:High, _OctIndex)
    _OctCutData  = Cut( _DATA, _OctLowFreq, _OctHighFreq)

    _OctRes[_i] = RMS( _OctCutData)

    _i=_i+1
 End

;-------------------------------
;他の波形と重ね書きできるようにXY波形にします。

 _OctXAxis = Cut( _OctData:Center, _StartIndex, _StopIndex)
 OctResult = XYof( _OctXAxis, _OctRes)


Delete _*


製品詳細はこちら

<< スペクトラムキット&周波数解析関係に関するFAQ一覧へ戻る