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 )