どハマり中[biquad~]

Pure Data の題材として、イコライザーはどうだろうと思ったのが運のつき、絶賛どハマり中。

まぁ、最初なので、普通に1バンドのパラメトリック・イコライザーでも作ってみんべ、で調べたところ・・・。

Pure Data には、以下、5つのフィルターがあるよ。

[lop~]   ロー・パス・フィルター
[hip~]   ハイ・パス・フィルター
[bp~]   バンド・パス・フィルター
[biquad~] 双2次フィルター(ってなんぞ、これ)
[vcf~]   ボルテージ・コントロール・フィルター(シンセについてるVCFっすな。レゾナンスもついてるよ)

[biquad~]は色んなタイプのフィルターを作れるよ。
他の4つ以外のタイプのファイルターを作るときには、これを使ってね。

というわけで、[biquad~]を試してみることに・・・。

さて、どうやって使うんだべ。
ヘルプを見てみると、ff1, ff2, ff3, fb1, fb2 の5つアーギュメントを使うらしい。

y[n] = ff1*w[n] + ff2 * w[n-1] + ff3 * w[n-2]
w[n] = x[n] + fb1 * w[n-1] + fb2 * w[n-2]

と、数式が出てるんだけど、?????

で、検索してみることに、というか、しまくることに。

分かったこと。

・双2次フィルターというのはデジタル・フィルターで、その係数の設計方法を Robert Bristow-Jonson という人が紹介した本があるらしい。

・係数には、周波数係数と、フィードバック係数があるらしい。WIKIPEDIA
推測するに、ff1, ff2, ff3 は周波数係数、fb1, fb2 はフィードバック係数なんでしょうね。

・x[n] が入力、y[n]が出力値らしい。

・ダイレクト・フォーム1とダイレクト・フォーム2があるらしく、Pure Data では、ダイレクト・フォーム2を採用しているらしい。
※上記のヘルプに記載されていた y[n] = .... w[n] = ... ってヤツ。

・んー、これ、数学というより、電気工学が分からないと理解できないんじゃない?

というところまでは分かった。

理解できないことが分かったのは良いけど、できるとこまではやってみよう=もう少し検索してみようという結論は、結局、負けず嫌いだからではないかと思う今日この頃。
時には勇気ある撤退も必要。

もう少し検索してみた結果、色々なサンプルプログラムがネットに上がっていることが判明。

earlevel.com などを参考に色々組み込んでみるものの、どうにも納得が行く結果が得られない。

どうも、みなさん、ダイレクト・フォーム1の想定で設計されているもよう。

y[n] = a0 * x[n] + a1 * x[n-1] + a2* x[n-2] - b1 * y[n-1] -b2 * y[n-2]



パラ・イコなので、中心の周波数と、バンド幅、ゲインを与えて、ff1, ff2, ff3, fb1, fb2 の値を求めたいのだが、さっぱり分からん。
素人の浅はかさで、ダイレクト・フォーム1の a0, a1, a2, b1, b2 を、それぞれ ff1, ff2, ff3, fb1, fb2 に置き換えて入力してみたんだけど、音が出ないか、ノイズが出るばかり。
ダイレクト・フォーム2って、1を展開したものじゃないのか・・・。

というわけで、どうやって係数を求めるのかでどハマり中。

検索すると、同じような疑問を持った方が技術フォーラムなどへ質問を投げていたりして、お、これは! と見てみるも、回答が「それは高度な数学的理解が必要なことなので」とか書いてあるのを見てガックリ・・・。



ていうかさー、その前に、パッチのファイル名を間違っちゃって、Eclipse でリネーム掛けたんだけど、

File patchFile = new File(dir, "xxxxxx.pd");

の xxxxxxx.pd をそのままにしちゃってたんだよねー。
で、パッチファイルのほうもリネームしたんだけど、パッチをいくら作り変えても症状が変わらなかったのね。
[biquad~] に送るアーギュメントを [print] してたんだけど、削除してもログを吐き出すし・・・。
リソースに残っちゃうのかね・・・。

ま、xxxxxxx.pd を正しく書き直したら、当然直ったんだけど。
その間、色々試していたことが全てパーになったのでした。

あいかわらずの粗忽者っぷりに、もはや乾いた笑いも出ないのであった。

スポンサーサイト

コメント

非公開コメント