製品版のEQには、slopeパラメータとかあるけれど、JUCEのモジュールには見当たらないので、どうなっているのでしょう
デジタルフィルタの設定パラメータについての理解度をもっと上げていきたいね〜
JUCEのDSPモジュールには、簡単にデジタルフィルターを実装できる仕組みがあります。
基本的には、IIRFilterにIIRCoefficientsを設定することで所望のデジタルフィルターの実装ができてしまうのですが、実際には、DSP、デジタルフィルターの世界を知っていないと理解に苦しむ点があります。一方で、私のように、デジタル信号処理の基礎がないけれど、EQのようにフィルターを使ったプラグインを作りたい場合、デジタルフィルターの理解を数学的な背景から理解するには少しハードルが高いと思います。そのため、JUCEのDSPモジュールでデジタルフィルターを実装するための基本的な知識を調査したので、そのまとめです。
ある程度どのような部分を知っておいたらデジタルフィルターを利用できるのか、という点を重視してまとめていきたいと思います。
こんな人の役にたつかも
・JUCEでデジタルフィルタを実装したい人
・デジタルフィルタを実装するための基本的な知識を調べている人
・JUCEでEQなどのフィルターのプラグイン作成を行いたい人
デジタルフィルターの基礎となる式
デジタルフィルターを実装するための公式は、「Cookbook formulae for audio equalizer biquad filter coefficients」(以下、RBJ cookbookと呼びます。)というページにまとめられており、この計算を行うことで、ローパスフィルターやバンドパスフィルターなどの各種デジタルフィルターが実現できるようです。
デジタルフィルターについて基本的な知識を知りたい方は、うつぼかずらさんのサイトに詳しくわかりやすくまとめられていますので、ぜひご参照ください。(このサイトでRBJ cookbookというものがあることがわかりました)
https://vstcpp.wpblog.jp/?page_id=523
JUCE利用者は作りたいフィルタの関数を使うだけ
デジタルフィルターを作成するためには、双2次フィルタ(バイクアッドフィルタ)というものに、所定の係数の与えるようです。
公式の中に、b0~b2という係数と、a0〜a2という係数があります。これらの係数でなんやかんや計算をすることで、所望のデジタルフィルターを得ることができるのですが、JUCEでは、これらの係数を所望のデジタルフィルターの係数作成の関数、makeLowPass関数やmakeHighPass関数などで作成することができます。
https://docs.juce.com/master/structdsp_1_1IIR_1_1Coefficients.html
JUCEのDSPモジュールでのフィルター作成は、このように得られたフィルターの係数IIRCoefficientsをIIRFilterの係数として設定することで、所望のフィルターを得ています。
slopeと呼ばれるパラメータの仕組み
前回の記事で、このようにIIRCoefficients係数を作成して、IIRFilterの設定を行ってハイパスフィルターを実装しましたが、製品版のEQのハイパスフィルター、カーブの減衰が変更できるんです。
よくslopeというパラメータになっているかと思います。このパラメータの設定がないな〜と色々と調べていたら、JUCEフォーラムに次のような記事が見つかりました。
https://forum.juce.com/t/help-implementing-iirfilter-with-db-ocatve-requirements/19642
双2次フィルタは-12db/octというスロープの減衰となるので、どうやらこれを直列につないで-24db/octとするようですね。確かに、単純に特定周波数のゲインを小さくするにはそのまま直列に繋げばいいということがわかりますが、製品版のEQって、Qとかカットオフ周波数のように変更できるので、slopeみたいなパラメータがあるのかと勘違いしていました。
JUCEフォーラムの回答によると、例えば-24db/octのスロープを作りたいとき、-12db/octのハイパスフィルターを2個繋ぐと、それぞれのハイパスフィルターに対してQ値があるので、ここをどうするかによって、メーカーによる違いが出てくるようですね。
単純にプラグインを2個つなぐイメージですね