Soundがcaptureできれば...DirectX.Direct3D編

 

1. DirectX.Direct3Dで、描いてみました。

    結論から申せば、

        spectrumの、グラフの描画が遅いのは、FFTの計算量の多さが、原因でした。

GDI+で、描くのも、このプログラムでは、充分な速さを持っていました、なんのこっちゃ (^_~;;

しかし、よい経験でした。

2DをDirect3Dで描くのは、そんなに多くの知識を、必要としません。

グラフの頂点の集合を作り、その集合体が、どんな種類のpointの集まりなのかを指定してやれば、よいのです。

 

「C# ゲームプログラミング 赤坂玲音著 ソフトバンククリエイティブ社」より

この本、非常に為になる、よい本です。C#の画像関係なら、これしかない!

そんで、captureしたデータを、この集合体に、入れてやるのです。

全てのプログラムを、お見せしたいのですが、CaptureSoundプログラムから、延々と引き継いでいますので

まだ、整理が付きません、すまそ。

2. Normを追加する

Prodigy7.1XTの、LINE入力は、48KHzサンプリングの時、少し、ノイズを持っています。(ジャックにプラグを指さないでも、そうなる。)

そんで、これを打ち消すプログラムを、追加(captureData_FFT_and_normalize()関数)。

この関数は、ノイズの大きさを、100回で平均して、これを、測定値から差し引いています。

(100回平均をとるのに要する時間は、充分、1秒以内ですから、captureしたデータを取り出すのは、充分速い。

 8192個のデータ(16384byte)を、100回取り込んでいます。

 となると、描画が遅くなる原因は、FFTに起因するちゅうことに、なります。)

いや、待てよ...

captureData_FFT_and_normalize(int m)関数も、FFTしてるから、FFTが遅い訳でもない.....

ちょっと、判らん.....何処が遅いんやろか... はて?.....

残るは、描画部分しかない.....Direct3Dでも、あかんか?

 

                                    normあり

                                normなし

このほうが、見やすいでしょ。 

このLINE INのノイズなんですが、

こうなってて、

ノイズのピークを0dBの所に持ってくると

実に、-120dBあたりも、観測できちゃってます、凄いダイナミックレンジ!

3. 肝心のFFTの部分の性能

    CaptureSizeが、重要です。

FFTが16384ポイントの時、CapureSize( =NotifySize )を、16384byteにするのと、その半分の、8192byteにするのでは

性能に、大きな差がでます。(同一の波形の観測 共に normあり)  

  

FFTポイント数 = CaptureSize( =NotifySize )  

にするのが、1番よい結果が、出ました。

CaptureSizeをFFTポイント数の2倍、3倍にしても、効果ありませんでした。

4. DirectX.Direct3Dを使うと、よい所、よくない所

よい所は  

     描画が早い

     CPUの負担が、すごく少ない(タスクマネージャによると、7%から20%までの間)

よくない所

   このまま、 windowを最大化すると、画面が粗い

windowのサイズが変わると、Direct3Dが、自動的に、調整してくれるのですが、

これは、Bitmapを拡大したように、粗く、なります。(私は、これ位、全然気になりません)

しかし、これは、最初から、大きな画面で、設計しておけば、済むことですね。

一方、前節で、ご紹介した、拙作のプログラムでは

最大化しても、画面の綺麗さは、変わりません。

しかし、CPUの負担が、少し、重いのです。

 

大体、30%から40%まで、位です。(私のPCmachineのCPUは、セレロン2.53GHzです。)

これ位のCPUの負担なら、これでも、よいのかも.....

最後に、96KHzでのspectrum解析を、お見せします。

                                        norm前

                                                                normあり

96KHzサンプリングの時は、FFTは 32768ポイントが、丁度よいし、速度も、丁度よいです。(あまり速いと、目まぐるしくて....)

ちなみに、LINE INへの、外部発信器入力は、以前作ったAD9851DDS SGです、2KHz出力。

師匠と仰ぐ、efu様のWave Spectraの性能は、ほんま、凄い!....及ばん...

次は、周波数軸の範囲を、マウスで選択できるように、してみたいです。

H18.8.23