「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 )