次に生成したsine波のFFT実行を行います。
■FFTの実行
scilabでのFFTの実行は以下にて行います。
-->fft_out = fft(sine)
fft_out =
column 1 to 7
- 3.216D-16 - 4.189D-16 + 1.064D-16i
- 1.034D-15 - 4.i 5.591D-16 - 5.965D-16i
1.225D-16 - 3.142D-16 - 3.515D-16i 4.098D-16
fft関数の出力値は、複素数となります。
これらを周波数のレベルとするには
各要素の絶対値を取る必要があります。
各要素の絶対値取得にはabs関数を利用します。
-->fft_abs = abs(fft_out)
fft_abs =
column 1 to 11
3.216D-16 4.322D-16 4. 8.176D-16
1.225D-16 4.715D-16 4.098D-16 6.782D-16
5.666D-16 6.782D-16 9.371D-16
■FFTの表示
FFT結果の表示を行います。
-->plot(fft_abs)
imageプラグインエラー : ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (fft_result_raw.png)
■FFT結果の補正
FFT結果を見ますとx=3,x=15が4.0となっています。
実際にはx=3, y =4の値が信号(周波数1250H、波高値0.5)
を表していまして、その結果を得るには補正が必要です。
○FFTの解析周波数分解能
FFTの解析周波数分解能は
FFTを実行するサンプリング数に比例します。
FS : サンプリング周波数
N : FFT実行のサンプル数
今回の例では
FS = 10kHz, N = 16ですから
FFT周波数分解能 = 10k/16 = 625 [Hz]
となります。
よって、信号は
0[Hz], 625[Hz], 1250[Hz], 1875[Hz] ・・ 9375[Hz]
の周波数成分としてFFT解析されます。
また、scilabはベクトル変数は"1"から始まるため
"x=3"のところが"周波数1250[Hz]"を表します。
○FFTレベルの補正
FFTの結果を見ますと
1250[Hz]のレベルが4.0、
また、8750[Hz]のレベルも4.0となってます。
入力信号の1250[Hz]レベルは0.5で生成しましたから
結果が実際の値と一致していませんね。
これに対応するには以下の補正をすることが必要です。
- FFTポイント数(FFTサンプル数)に依存する補正
- 折り返し歪み対応による補正
①FFTポイント数(FFTサンプル数)に依存する補正
FFT結果のレベルはFFTポイント数"N"だった場合"1/N"します。
今回の例では、N = 16ですのでFFTポイント数の補正値は
1/N = 1/16 = 0.25となります。
②折り返し歪み対応による補正
解析信号がACの場合、
そのエネルギーが折り返し歪みの信号に分散してしまい
波高値が1/2となりますので
折り返し歪みの補正値は"2"となります。
この補正値はFFTポイント数に依存しません。
ちなみに、
折り返し歪みの周波数はサンプリング周波数から信号周波数を
引くことで求められ、今回の例では
10,000[Hz] - 1,250[Hz] = 8,750[Hz]
から、8750[Hz]の信号が折り返し歪みとなります。
グラフからも、折り返し歪みのレベルが信号と同じであることが
分かります。
最後にFFTの結果に①②の補正をかけグラフ表示をします。
期待通りのFFT結果が得られます。
-->fft_correction = fft_abs * 2/16
fft_correction =
column 1 to 11
4.020D-17 5.403D-17 0.5 1.022D-16
1.531D-17 5.894D-17 5.122D-17 8.477D-17
7.082D-17 8.477D-17 1.171D-16
-->xplot = 0 : 625 : 9375
xplot =
column 1 to 15
0. 625. 1250. 1875. 2500.
3125. 3750. 4375. 5000. 5625. 6250.
6875. 7500. 8125. 8750.
-->plot(xplot, fft_correction)
imageプラグインエラー : ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (fft_result_correction.png)
最終更新:2009年07月26日 18:32