AD9833でファンクションジェネレータを作る6 周波数スイープ

published_with_changes 更新日: event_note 公開日:

labelAD9833 labelESP32 labelファンクションジェネレータ

 6 周波数スイープにかかる時間について

前ブログの5.3項で説明したスイープの周波数を設定する方法は、AD9833_test_suite.inoの方法に倣っています。スケッチの検証のため短時間でスイープが終わるように時間設定しても、実際にはそのようにならず、不思議な気はしながら放っておいたのですが、この際、ちょっと調べてみることにします。

スイープ周波数は次の計算で得られる時間(numMsecPerStep)を使って、次の周波数に移る仕組です。しかし、設定した開始から終了までのスイープ間隔(sweepTimeSec)と実際が合いません。スイープ間隔よりも長時間かかります。

// Calculate the delay between each increment.
uint16_t numMsecPerStep = (sweepTimeSec * 1000.0 ) / ((uint16_t)((stopHz - startHz) / incHz) + 1);
if ( numMsecPerStep == 0 ) numMsecPerStep = 1;
<省略>
delay(numMsecPerStep);

delayを使っているので、パラメータの単位はmsになります。このとき、値は符号なし16bit整数型で指定するので、下記のケースではdelayの待ち時間がdelay関数の扱えない数値となっていることが原因でした。

// スイープ周波数[Hz]と時間[sec]の設定(勢いで、10メガHzまでスイープと書いていました。)
long startHz = 10, stopHz = 10,000,000, incHz = 1, sweepTimeSec = 10.0;

このケースを詳しく見てみます。
        numMsecPerStep =( (10 *1000)/(10,000,000 - 10 )/1)+1 = 0.001 (msec)

検証のため0.001 (msec)を使って、この式から、スイープ間隔sweepTimeSecを逆算してみます。
        sweepTimeSec * 1000.0 = numMsecPerStep * ((uint16_t)((stopHz - startHz) / incHz) + 1)
        = 0.001 * ((10,000,000 - 10 )/1)+1)
        = 9.999991 (sec)

計算されたnumMsecPerStepと、指定したスイープ間隔sweepTimeSecは問題ないようです。問題なのは、知識と活用が一致していない私の脳みそです。

ここで、uint16_t numMsecPerStep (符号なし16bit整数型)ですので、numMsecPerStepの値は最小でも「1」です。

// Calculate the delay between each increment.
uint16_t numMsecPerStep = (sweepTimeSec * 1000.0 ) / ((uint16_t)((stopHz - startHz) / incHz) + 1);
// 小数なら、小数点以下は切り捨てられる
if ( numMsecPerStep == 0 ) numMsecPerStep = 1;
// 1以下の小数なら、小数点以下は切り捨てられ、numMsecPerStep = 0 ---> 1 ms

numMsecPerStepが1 msでスケッチが動いていたので、スイープ間隔の設定値の10sec(sweepTimeSec)と実際が合いませんでした。


【補足(蛇足)】

周波数解析をするために必要な刻み時間numMsecPerStepを求めてみます。
考え方は、WaveSpectraを用いた周波数特性の測定についてで紹介されている方法で考えます。FFT解析をするか否かの点はあるのですが、とりあえずそれは置いといて...


// スイープ周波数[Hz]と時間[sec]の設定
long startHz = 10, stopHz = 10000000, incHz = 1, sweepTimeSec = 10.0;
/*
スイープ時間 = スイープ周波数幅*N*N/Fs/Fs
N:  FFTサンプルデータ数  N=4,096
Fs: サンプリング周波数   Fs=48,000Hz

sweepTimeSec = (10,000,000 -10 )*(4,096/48,000)^2 = 72,817.70496 sec
  

この時の刻み時間numMsecPerStepは、

numMsecPerStep = ( (72,818*1000)/(10,000,000 - 10 )/1)+1 = 7.28 (msec)
  

切り上げして、8msとすると80,000sec = 29.5Hrかかる。10メガHzですから。


オーディオ帯域の周波数スイープ(10 - 50kHz)ならば、
        sweepTimeSec 364.0 sec

        numMsecPerStep 7.28 ms  ---->  8ms とすると、                
        sweepTimeSec    400 sec

という計算になります。7分なら待てないことはないですね。

Powered by Blogger | Designed by QooQ

keyboard_double_arrow_down

keyboard_double_arrow_down