LoFiBeats・84分の作業用BGMを作成しました!

JUCEのDSPモジュール、デジタルフィルタの基礎とパラメータついて調査

1_プログラミング

製品版の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というものがあることがわかりました)

簡単なデジタルフィルタの実装 | C++でVST作り
デジタルフィルタを実装しようとすると、フィルタ設計の部分で「Z変換」や「伝達関数」といった高度な数学での説明が始まりますが、ここでは極力高度な数学を使わずに簡単にデジタルフィルタを設計・実装できる方法がありましたので紹介させていただきます。

JUCE利用者は作りたいフィルタの関数を使うだけ

デジタルフィルターを作成するためには、双2次フィルタ(バイクアッドフィルタ)というものに、所定の係数の与えるようです。

公式の中に、b0~b2という係数と、a0〜a2という係数があります。これらの係数でなんやかんや計算をすることで、所望のデジタルフィルターを得ることができるのですが、JUCEでは、これらの係数を所望のデジタルフィルターの係数作成の関数、makeLowPass関数やmakeHighPass関数などで作成することができます。

JUCE: dsp::IIR::Coefficients< NumericType > Struct Template Reference

JUCEのDSPモジュールでのフィルター作成は、このように得られたフィルターの係数IIRCoefficientsをIIRFilterの係数として設定することで、所望のフィルターを得ています。

slopeと呼ばれるパラメータの仕組み

前回の記事で、このようにIIRCoefficients係数を作成して、IIRFilterの設定を行ってハイパスフィルターを実装しましたが、製品版のEQのハイパスフィルター、カーブの減衰が変更できるんです。

よくslopeというパラメータになっているかと思います。このパラメータの設定がないな〜と色々と調べていたら、JUCEフォーラムに次のような記事が見つかりました。

Help Implementing IIRFilter with Db/Ocatve Requirements
Hey all, Been using Juce for a month and it’s great. Awesome community (been lurking). I’m trying to implement a LPF using the IIR filter class that has a slo...

双2次フィルタは-12db/octというスロープの減衰となるので、どうやらこれを直列につないで-24db/octとするようですね。確かに、単純に特定周波数のゲインを小さくするにはそのまま直列に繋げばいいということがわかりますが、製品版のEQって、Qとかカットオフ周波数のように変更できるので、slopeみたいなパラメータがあるのかと勘違いしていました。

JUCEフォーラムの回答によると、例えば-24db/octのスロープを作りたいとき、-12db/octのハイパスフィルターを2個繋ぐと、それぞれのハイパスフィルターに対してQ値があるので、ここをどうするかによって、メーカーによる違いが出てくるようですね。

単純にプラグインを2個つなぐイメージですね

タイトルとURLをコピーしました