PortAudio ASIOを使う octaveでの検証を、実際に試す


1. 大分、よくなった...

 上図は、2KHz sine wave を PA19_ASIOに、入力して、その出力を、WDMに繋ぎ、spectrumを観察したものです。
 これが、可能なのは、Prodigy7.1XTが、wireの機能を持っているからです。



 上図に戻ると、
  50dBc以下に、細かい振動が、観測されます。3KHz付近のうねりは、 cutoff周波数が3KHzだからだと、思います。
  使用したLowPassFilterは 1999 tapsです。

    Prodigy 7.1XTのwire機能を使って、音楽で、Filterの効果を聞いてみました。
  小野リサ(MP3)です。
    ここで、小野リサが 「chanter de  da_ba da_ba... 」と、歌っている所の、原音と、filterに掛けた所を
  windows media playerで、見てみました。

 

                                    原音                            filterを通した音                                                                      
       

 確かに、filterの効果が、見えますね。
 しかし、音楽では、判りにくいのですが、 背後で、雑音が、チリチリチリと、 うるさいのです。

 恥ずかしながら、私の声を、聞いていただきますと、チリチリチリと、鳴っているのが、確認できると、思います。
 スピーカーで聞くと、聞こえない程度なのですが、ヘッドフォンで聞くと、気になります。

2.この原因は?
  
   以前にも、書きましたが、48KHz samplingとして、2000個のデータを得るには
   
      2000*1/48000 = 42ms程の時間を要します。
   
   一方、filter処理には、 3ms程の時間で、よいのですから

   
      42/3 = 14回程、 PortAudio の callback関数の中をグルグル回っていると、言うことなのでしょうか......?
   
   ともあれ、音を入力から拾っている間も、fir filterは、計算し続けていることに、なりますよね。
   これが、ノイズとして、入ってくるのでは、ないでしょうか?
   PortAudioのcallback関数の仕組みが、よく判っては、いないのですが......これが、最大の疑問点なのです、実は。

   解決策は、「音を入力している時は、filterに計算させない」のが、得策だと思うのです。

   PortAudioには、Blocking ReadWriteと、言うものが、あるようなので、これが、使えると、思います。

   しかし、残念な事に、ASIOを使うと、BlockingReadWriteが、作動しないのです。(PA19_ASIOをdllにしなくても、作動しません)

   この原因が、まだ、よく、判っていません。

     (ASIO2 SDKを調べましたら、判りました。 ASIO2は、callback関数で、録音再生していますので、blocking/IOが、作動しないのです。)


   もう、ひとつ、考えられる対策

     50% Overlap-Save法

   を、用いる方法です。もしかしたら、これが使えるかもしれません。

   何故、それを使わないのかと、言いますと、使わなあかん、理由がわかりませんねん。

   前節で、octaveで検証した際は、

     「 有限長信号に対して直線たたみ込みを得る方法 」 (シミュレーションで学ぶディジタル信号処理 尾知 博先生 CQ出版 p.48)
   
   を、使いました。

   だって、fftする時、有限長で、区切っていますから、それの連続として、出力を得るのだと、思っています。
   
   はよ、言うたら

   50% Overlap-Save法 ないし、Overlap-Add法が、ちいーっとも、判ってないのです、涙  (-_-)

     でも、チリチリと言う、僅かの音を気にしなければ、「できた!」と、言っても、いいかも....
   
   そう言いながらも、96KHz samplingにすると、チリチリの音が、大きくなって、やっぱり、気になりますわ、とほほ。

    p.s.  今回は、 ホームページ作成に、alphaEDIT の、お世話になっております、ありがとうござます。

  H.19.1.13 ( 20070113 )