「FFTによる直線たたみ込み」の計測、 最終回
1. やっと、安定して、測定できるように、なりました。
timeGetTime() 関数は、windowsXPに於いては、defaultの精度は、15ms位らしいのです。
それで、0ms 、15msと、訳の解らない数値が、計測されたのです....
この timeGetTime()関数の精度を上げるAPIが、存在するのです。
::timeBeginPeriod()関数と言うものです。
1msの精度にしたい時は、
::timeBeginPeriod(1);
::Sleep(1000);
と、します。
sleep(1000)は、timeBeginPeriod(1)の効果を、確定させるためです。
プログラムの最後に、 ::timeEndPeriod(1); も、忘れんようにしましょう。なんせ、windows system全体に影響するらしいですよ。
webで、timeGetTime,timeBeginPeriodついて、教えていただきました皆様に、御礼申し上げます。
確かに、1msの精度になりますが、いつも正確か、といいますと、そうでは、ありません。
そこで、100回測ってみました。
4msが6回、2msが9回ほど...他は3msです。
最大値の4msと、勘定するのが、安全ですね。
その他、FFT pointを、倍の16384pointにすると、最高8ms 、一挙に FFT pointを、131072pointにすると、90ms位ですね。
2. プログラムの改良も、これで、最後です。
大浦様のFFTプログラムの、DLL化と同じように、
必要な、work area等は、DLLを利用する側のプログラムで、用意します。
hファイルも、簡素なものに、なりました。
これで、安定して動作するDLLが、出来上がりました。
機能は、好きなように、後で、追加できます。
最終の、hファイル、cppファイルを、置いておきますね、参考になりましたら、うれしいです。
それから、CFir クラスをDLL化しないで、クラスファイルとして、プログラムに追加する方法も、あります。
これは、上記のhファイルで、クラスをimportしないと、宣言する(具体的には、__PORT を取っ払うだけです。)
そして、myFFT.cppファイルを、project に、追加するだけで、
クラスを利用する、プログラム自体は、全く、変わりません。
利用する側の、プログラムの抜粋です。
//**************************************************************************************
どちらの方法でも、同じ所要時間、同じ計算結果が出る事を、確認しています。
次は、いよいよ、PortAudio ASIOへの、実装です、うれしいにゃ。
H.18.12.13 ( 20061213 )