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