SSブログ

念願の イコライザーが 作れそう [手記さまざま]

DirectShowでWindowsに最初から備え付けのオーディオイコライザというとDMO wrapper filterのパラメトリックイコライザだけなんです。でも、これでは実現できないイコライザ機能もあります。それはローカットやハイカットのフィルターです。

ローカットやハイカットのフィルターは、自作しなくちゃならないのです。でもどうやって作ればいいのでしょう。こういう時は決まって難しい計算式とかチンプンカンプンの用語が出てきます。

それで私は、「今回も、またなのか」と思いつつ、理解できない自分を残念に思いながら、結果だけを得るためにネット検索を始めました。

はじめ私は検索キーワードを英語にしました。そのほうが日本語よりも多くの情報が得られると思ったから。半日以上かけて、ほうぼうのサイトをチェックしました。かなりいい所まで迫りましたが、英語の情報と私の目的をガッチリ接続する「何か」がありませんでした。ソースコードで音声の入出力がfloatになっていて、これって、どういうデータなんだろう、と心配になったのです。

私がやってるのはDirectShowだから、floatは使わないんです。それに、英語サイトの上記のコードがあまりにも必要な部分に限ってのUPだったので、そのコードの外側にどういうプログラムがあるべきか、私は想像できませんでした。

半日以上(実際には足掛け2日)頑張って、いいかげん疲れてきて、「やっぱりイコライザを自分で作るのは無理だったかな」と諦めかけて、最後に日本語の情報を見ておこうと思いました。

そこでひとつのサイトを見つけました。有難いことです。ほんとに有難いことです。
http://vstcpp.wpblog.jp/?page_id=523

ここでようやく私は、floatをDirectShow用に単純に型キャストして良いことがわかりました。いやそれ以前に、BiQuadの意味をやっと理解し、サンプルコードの外側にどういうプログラムがあるべきかがわかったのです。

私はすぐさまDirectShowのtransform filterにイコライザのコードを組み込みました。今回のテストに私が選んだのは「ハイシェルフフィルタ」です。

上記の有難いサイトには
float samplerate
float freq
float gain
の各値には単位が記されていました。つまり、単位から察して値の上限と下限がわかります。ところが
float q
には単位がありません。「Q値は0より大きい値でなければなりません」という最低限守らなければならない情報だけがあります。コードを見るとqで割っている所があるので0で除算するわけにゆかず、さらに負の数も駄目というのはわかりました。でも、適正な値は何?

だって、
0 < q <= 1
というのと
0 < q <= 100
というのは相当な違いです。

それで、実験することにしました。

スイープ信号をテスト音源にして色々なパラメータで試しました。この時点でqの上限がおおよそわかりました。

qが1より大きくて、たとえば2だと、時に殺人的なノイズが入りました。5でも10でも50でも殺人的なノイズが入りました。max 1かどうかは知りませんが、大体この辺りにしておくのが良さそうです。
訂正:上記のノイズというのはたぶんクリップだと思いますが、後日私のプログラムミスが見つかり、それに付随してこの記事の実験結果の出力レベルが参考にならないことがわかりました。そこでこのノイズについても保留とさせてください。

では、qの0.2と1はどう違うんでしょう。実験してみました。

filterをかけない元音(20Hzから20KHzまでのスイープ)
default.png

freq=1000, q=0.2, gain=-40
1000 0.2 -40.png

freq=1000, q=1, gain=-40
1000 1 -40.png

freq=1000, q=0.2, gain=-90
1000 0.2 -90.png

freq=1000, q=1, gain=-90
1000 1 -90.png

上の結果から何がわかったでしょうか。qの違い以外のことも含めて考えました。

このフィルタをかけるとどうやら必ず元音よりも音量が下がるようだ
訂正:上記の音量が下がるというのは私のプログラムミスによるものでした。上の画像のように明らかに下がることはありません。詳細は現在再実験中です。

q=0.2では信号は周波数が上がるにつれて徐々に減衰する
q=1では、ある周波数を境に急激に減衰する
q=1ではカットオフ周波数あたりにいくぶん強調(resonance)がみられる
gain=-40でもgain=-90でも減衰量に差は感じられない、-40で十分か
gain=-90はgain=-40と比べてまるでカットオフ周波数が低くなったかのようだ

以上のことから考えて、各パラメータの実用的な値は・・・

freq : 適宜
gain : -40あたりが実用になりそうだが、さらに細かく調査したい
q : 0.1から1あたりが実用になりそうだが、さらに細かく調査したい

この記事の続きが出るかどうかは未定です。
とにかく今私はこんなことをやっています。

コメント(0) 

コメント 0

コメントの受付は締め切りました