FFTコマンド
fftコマンドは、データの計測とFFTを行うコマンドです。FFTはZYNQのPS(CPU)で行われます。スペクトラムを生成することができるほか、ピークの検索を行うことができます。
ヒストグラムコマンドの書式は以下のとおりです。
$ /cosmoz.elf fft サンプリング長 [オプション]
です。
オプションには
- findpeak・・・ピークの検索
- ch=CHMASK・・・計測チャネルの指定
- trig=TRIGMODE・・・トリガモードの指定
- timeout=TIMEOUT・・・タイムアウトの設定
- windowfunc=数値・・・窓関数の設定
があります。
計測チャネルの指定、およびトリガモードの指定、タイムアウトの設定方法はキャプチャコマンドと同じなので、波形キャプチャの節をご覧ください。
実行例を示します。
root@cosmoz:~# /cosmoz.elf fft 256 ch=xf capture success. FFT capture start length=256. #Cosmo-Z FFT Text Format 0.7 #min_x=0 #max_x=127 #max_freq=39.687500 #min_y=-160 #max_y=0 #div_y=8 #xtitle=[MHz] #xmult=0.312500 #width=640 #height=480 #sampling_rate=80.000000 #fft #chmask=f #step ------------ 0 -23.26 -21.59 -23.14 -21.53 1 -85.10 -81.04 -91.74 -100.20 2 -107.22 -98.37 -82.20 -85.71 3 -90.23 -99.28 -89.84 -82.80 4 -86.40 -87.66 -98.38 -94.04 5 -84.52 -90.72 -83.79 -92.56 6 -91.43 -87.00 -96.22 -102.43 7 -84.45 -97.70 -87.83 -89.87 8 -90.41 -82.56 -102.38 -93.95 9 -87.39 -95.63 -94.13 -84.84 10 -93.40 -96.61 -98.46 -95.56 11 -89.10 -93.31 -87.93 -97.80 12 -92.89 -95.80 -88.69 -99.62 13 -90.99 -87.98 -83.29 -104.75 14 -92.41 -88.25 -84.19 -90.99 15 -91.53 -85.38 -88.49 -102.12 16 -88.90 -85.13 -90.23 -95.97 17 -86.56 -90.76 -89.74 -90.20 18 -98.40 -87.87 -95.69 -104.79 ・・・
このように結果が数字で出てくるので、FFTの使用に関してはWebアプリを推奨します。
コマンドラインから実行したい場合は、Linuxシェルのリダイレクトを利用して、
$ /cosmoz.elf fft 32768 ch=0xff windowfunc=2 > fft.txt
のようにしてファイルに保存し、適当なグラフ化アプリを使って可視化するのがよいでしょう。
サンプリング長
FFTの計算では指定された長さのデータをサンプリングしてメモリに溜めてから解析します。サンプリングするデータの長さが長いほど周波数分解能は細かくなり、一般に次の関係があります。
周波数分解能 = サンプリング周波数 ÷ サンプリング長
これは総計測時間の逆数であるともいえます。
例えば、100MHzサンプリングで65536ポイントのデータを集めた場合、周波数分解能は約1.5kHzとなります。サンプリング長が長いほど計算の時間がかかるようになります。
周波数分解能を上げるには、サンプリング長を長くするか、サンプリング周波数を下げてください。
また、サンプリング長は2^Nの数である必要があり、現時点のソフトウェアで対応している長さは128,256,512,1024,2048,4096,8192,16384,32768,65536です。
窓関数
FFTを行う際に窓関数を用いるとピークの広がりを抑えて正確に計測することができるようになります。
書式は
$ /cosmoz.elf fft 32768 ch=1 windowfunc=4
のように番号で与えます。
現時点のコンソールアプリでサポートしている窓関数と番号は以下のとおりです。
0・・・窓関数なし
w(x) = 1
窓関数を使わないFFTです。理論上の周波数分解能は最も高くなりますが、計測した時系列データの端の値がなめらかに接続されていないとピークの裾が広がります。
1・・・ハニング窓
w(x) = 0.5 - 0.5 * cos(2 * pi * x);
最も簡単な窓関数です。端を強制的に0にするのでサイドローブが抑えられます。
2・・・ハミング窓
w(x) = 0.54 - 0.46 * cos(2 * pi * x);
端が完全にゼロにならないのでハニング窓よりも裾は広がりますが、ピークは鋭くなります。ハニング窓かハミング窓を使っておけばまず問題はありません。
3・・・ブラックマン窓
w(x) = 0.42 - 0.5 * cos(2 * pi * x) + 0.08 * cos(4 * pi * x)
ハニング窓よりもサイドローブ(裾)が抑えられますが、メインローブ(ピークの部分の広がり)が広がります。名前がカッコいいので、たまに使います。
4・・・ナットール窓
w(x) = 0.355768 - 0.487396 * cos(2 * pi * x) + 0.144232 * cos(4 * pi * x) - 0.012604 * cos(6 * pi * x)
名前が好きなので、たまに使いますw
5・・・ブラックマン・ハリス窓
w(x) = 0.35875 - 0.48829 * cos(2 * pi * x) + 0.14128 * cos(4 * pi * x) - 0.01168 * cos(6 * pi * x)
6・・・ブラックマン・ナットール窓
w(x) = 0.3635819 - 0.4891775 * cos(2 * pi * x) + 0.1365995 * cos(4 * pi * x) - 0.0106411 * cos(6 * pi * x)
通常の計測ではハニング窓を使い、ピークを鋭くしたい場合にはナットール窓を使うのがいいでしょう。
ピークの検索
オプション findpeak を使うと、ピークの周波数を検索し、ピークの強度を表示します。
次の例はファンクションジェネレータで5.008MHzの正弦波を生成してCosmo-ZのCH9に入力し、CH9-CH12をFFTした結果です。
root@cosmoz:~# /cosmoz.elf fft 32768 ch=xf00 findpeak capture success. FFT capture start length=32768. #Cosmo-Z FFT Text Format 0.7 #min_x=0 #max_x=16383 #max_freq=39.997559 #min_y=-160 #max_y=0 #div_y=8 #xtitle=[MHz] #xmult=0.002441 #width=640 #height=480 #sampling_rate=80.000000 #fft #chmask=f00 #step ------------ CH 9, peak freq = 5007.32422[kHz], pow= -12.58dB, around sum pow= -11.28dB CH 10, peak freq = 97.65625[kHz], pow= -92.08dB, around sum pow= -68.48dB CH 11, peak freq = 97.65625[kHz], pow= -95.93dB, around sum pow= -68.48dB CH 12, peak freq = 97.65625[kHz], pow= -94.64dB, around sum pow= -68.48dB
fftオプションを使用するとFFT結果が表示されるかわりに、ピークの値と強度が表示されます。pow=と書かれた列がピークが出ている周波数の強度で、around sum pow=と書かれた列は、ピーク周波数の±2本の周波数の強度を足し合わせたものです。
なお、直流に近づくにつれて1/fゆらぎでノイズ強度は大きくなるので、ピークの検索は周波数30番(100Mサンプリングで32768ポイントであれば、100M÷32768×30=91.5kHz)以降を検索するようになっています。