パラメトリックイコライザーを検討する!の巻き。 2019.8.19

このような、触手をくすぐる投稿をいただきました。


パラメトリックイコライザって?
 そもそもパラメトリックイコライザって何者?ってな感じですが、昔のオーディオ全盛期にはグラフィックイコライザなるものが
結構ありました。これは、周波数帯を分割して、個別のゲインを設定できるものでした。もちろん、分割数が多いほど、
細かい調整ができるので、10以上の分割されたものはざらにあった記憶があります。
「グラフィックイコライザ」の画像で検索すると山のようにでてきます。懐かしいなあ〜。

グラフィックイコライザの例。スライドボリュームが大量にあるのが特徴でした。
引用: https://blogs.yahoo.co.jp/kiyo19371122/36360275.html


私もグラフィックイコライザなるものに興味をもって、かなり昔ですが自作した覚えがあります。
HP内にたしか写真を残しているはずなので、探したらでてきました。


かなり昔に作ったグラフィックイコライザです。


中身の様子です。結構シンプルです。


回路としてはオペアンプをつかったシミュレートインダクターを用いていますが、これは何かというと・・・
もう忘れちゃいました(笑。ネットを探すとでてくると思いますが、本題から外れるので割愛です。

で、グラフィックイコライザは決められた周波数帯のゲインを可変するのが目的で、細かく周波数帯を
分割して調整することで、再生機器の周波数帯域のフラット化などの補正が行われます。

それに対してパラメトリックイコライザでは、調整できるのは周波数やQ値あるいはバンド幅で定義される
変化させる周波数の幅(帯域)も可変することができます。
このあたりからパラメトリックイコライザという名が付いたのでしょう。

 これを使う目的は、勝手な思い込みですが、どちらかといえば業務用で、たとえば環境ノイズの低減や
アナウンサなどの声の特定周波数の強調などが主な目的で、民生用にはあまり関係ないのでは?と思ったり
しています。環境ノイズとは、たとえば近くでモータなどの固有周波数をのノイズ源などがあり、それをマイクで
拾ってしまう場合には、わざとその帯域に調整してゲインを落としたりすることなどです。
すなわちグライコのように、任意に分割した周波数帯のゲインを調整できる機能よりは、
そもそも調整すべき周波数を選択して調整することで、はるかに特定の用途に向いたものだったのでしょう。
ただし、それを実現するには回路的にも複雑で、一般にパラメトリックイコライザでは調整できる周波数の数は
数個だったと思います。そんな機能が数10個あっても、扱いきれるものではないですからね。

ディジタルフィルターで実現を検討してみましょう!

ディジタルフィルターをつかうのことが前提となりますが、そのプラットフォームはDIV5142を考えます。
もともとDIV5142はチャンネルデバイダー用に開発したものですが、その要のPCM5142には多彩な機能を実現する
ディジタルフィルターが内蔵されていますので、それを活用しようというわけです。
 チャンネルデバイダーが周波数帯で出力を分割する、縦方向のフィルタとすれば、イコライザは時間軸の中で
出力を分割調整する横方向のフィルターのようなものです。

リハビリが必要だなあ〜

 機能としてはDIV5142でパラメトリックイコライザーは実現できるはずなのですが、どのように使えばいいのかが課題です。
というのも、DIV5142を開発したのが1年以上も前のことなので、中身についてすっかり忘れてしまっています。
「1年で忘れるの?」といわれそうですが、年をとると忘れる速度も加速度的に早くなるものですよ(笑。
ひどい場合は昨日の夕食に何食べたかも思い出せませんから(爆。

 まあ、それはさておきディジタルフィルターをつかうためのTI社のPUREPATH STUDIOを久しぶりにインストールして使ってみましょう!
 じつはDIV5142の開発時につくったソフトやなにかはの一式は、PCのクラッシュ時に紛失してしまっています。そのときは、DIV5142も
完成したあとだったので、あまり気にしていなかったのですが、いまとなってはデータのバックアップはこまめにしないとな〜と反省材料
です(反省しかしないのが不味いのですが・・・)。とにかく、以前に検討した記録がほとんどない・・・・。

検討環境を構築しよう!

まずは再度、ディジタルフィルタの動作確認ができるようにハードウエア側からの環境の整備です。
今回の検討における構成は

 DDS発振器→ADC5397(AD変換器)→SRC4137→DIV5142

としています。なぜディジタル信号の発生に、わざわざADコンバータをつかったかといえば、周波数領域での観測が
必要になるとおもっているからです。そのときにはゲインフェーズアナライザが活躍していれるはずなので、そのアナログ信号が
つかえるようにしたかったわけです。
 SRC4137を入れている理由は、ADC5397は96kHzあるいは192kHzの出力だけなので、44.1や48kHzの信号を
作成するために入れています。


パラメトリックイコライザの検討のための環境づくりです。

ああ〜やっぱり面倒!
PUREPATH STUDIOでフィルターを設計して、DIV5142のPICに組み込むのですが、だんだん思い出してきました。
実際に動かすには次のステップが必要です。

 @PUREPATH STUDIOでフィルター設計
 APUREPATH STUDIOでBUILDしてコンンフィグファイル(CFG)を作成
 BコンフィグファイルからPICに書き込むためのデータテーブルを作成。
 Cそのデータテーブルをつかって、PICへの書き込みプログラムをコンパイル。
 Dライターで書き込み、動作チェック

この作業を毎回繰り返さないといけないことがわかりました。こりゃ、大変だ〜。
まあ、何事も辛抱が大切ですね(年をとると辛抱もできなくなってきました(爆。

まずは単純に10素子で・・・動かない
最初なので、まずは単純にPEQ(パラメトリックEQ)のモジュールを入れてみました。

まずは入出力の間にPEQを挿入です。

PEQの素子は適当にということで、10素子を選択してみました。
選べる範囲は5〜20となっています。

まずは10素子のPEQを入れてみました。


結果は、うんともすんとも言いません。その原因はすぐにわかりました。
リソースウインドを開いてみて実行サイクルをみると675となっています。
たしか、そんな多きなサイクル数は覚えがありません。おそらく300くらいが限界だったようなかすかな記憶です。
それを超えているため内部で実行できていないようです。


実行サイクル(上か2段目)が675と大きすぎて動かないようです。

控えめに5素子で・・・駄目だ!
10素子でだめなので、もうすこし素子数を減らしましょう。ということで
最低の5素子にしました。ついでに1150Hzで6dB上げてやりました。
今度は実行サイクルが506と小さくなりました。でも、なんかまだ大きいな〜。

次は5素子でチャンレンジです。


実行サイクル(上か2段目)も506と小さくなりましたが、まだ大きい?


だめだ、やっぱり全然動きません。LRCK周波数がもれてます。

PEQモジュールはつかわない!
 結局のところ、PCM5142では内部のDSPの速度がおいつかず、
PEQモジュールでは5素子も動かないことがわかりました。

さて、どうしよう?

こうなったら個別に作りましょう!
別にPEQをモジュールとして使うのではなく、個別にBIQUADフィルターを用いて構築すれば
いいわけですから、それで検討してみましょう。そのためには、個別のフィルターがどのような
挙動を示すか、すこし確認が必要です。

まずはもっとも簡単に1個のBIQUADフィルタを挿入します。

1個のフィルターを挿入してみました。

設定は  Equalizer(Q Factor), fc=1000Hz,Gain 6dB,Q=5 です

実行サイクルは254と半分になりました。これなら大丈夫でしょう。
DIV5142にインストールすると、こんどは動いていますね。
ただ、単純にゲインが6dBあがるので出力が飽和してしまっています。
ちなみにすこし周波数をずらすと飽和は解消されます。フィルターとしては動いているようです。

1kHzでは当然のことながら出力は飽和。 1.5kHzでは飽和はなくなりました。

イコライザでは、元の信号から振幅レベルがあがることがあるので信号の飽和は考えないといけないですね。
チャンネルデバイダの時はLPFあるいはHPFだけなので、出力の最大振幅が元の振幅を超えることはなかったので
考える必要はありませんでした。

ということで、事前に入力を-12dBとすることにしました。

入力に-12dBのATTを追加
入力に事前に-12dB(0.25倍)のSCALEを追加しました。さて、これでいいかな?

出力が飽和しないように入力側であらかじめ信号を減衰させておきます。


このときに実行サイクルは262です。
動かしてみると、周波数1kHzのときにちょうど振幅が1/2になっています。
元信号を1/4にして、フィルターで6dB上げているので丁度元信号の1/2ですからOKですね。

うん!大丈夫そうだ。


周波数特性を測ってみよう!ゲインフェーズアナライザー登場


黄色の部分がゲインフェーズアナライザです。実測データがとれるのが嬉しいです。

こういうときに活躍するのが、これですね。つくって良かった!です。
なお、縦軸の絶対値はあまり関係ありません。ゲインフェーズアナライザの出力レベルは固定なので
ADCを入力範囲一杯で動かすまでの出力がでないためです。低周波数側でゲインがすこし落ちていますが、
これはDIV5142の出力抵抗が大きく、さらにゲインフェースアナライザでのカップリングコンデンサとの組み合わせで
HPFが構成されてしまっているからです。これは気にする必要はありません。

測定結果です(Equalizer(Q Factor), fc=1000Hz,Gain 6dB,Q=5)

すこし拡大するとこんな感じですね。

-3dBの周波数範囲は約200Hz。中心周波数の約0.2倍。

さらに中心のゲインを12dBにしてみました。これもきちんと増幅されていますね。

測定結果です(Equalizer(Q Factor), fc=1000Hz,Gain 12dB,Q=5)

5素子を試してみましょう
フィルターを5連にして試してみました。
それぞれの設定は
 @400Hz +6dB A600Hz -6dB、B1kHz 6dB、C1.5kHz -6dB、D2.5kHz +6dB です。
ガタガタの特性をわざと組んでいます。


5連で試してみました。

実行サイクル数は342です。だいぶ増えましたね。周波数特性は下の通りですが、ほぼ予想通りの結果です。
しかし、こんな特性で音楽聴いたどうなるだろう?ちょっと興味が沸いてきました。


5連での周波数特性です。

ふう〜
 ここまで確認したら、ドップリ夜が更けてしまいました。そろそろ寝なくっちゃ!

長期戦に備えて・・・ 2019.8.21
今回の検討には、いろいろな基板を動員する必要があるのですが、平面に展開すると机の上がうまってしまいます。
かろうじてキーボードがおける程度です。そうすると、他のことができなくなる(例えば勉強とか・・・←嘘)ので、
すこしコンパクトにまとめておきました。

長期戦に備えて、すこし検討対応をコンパクトにまとめました。

左側が、上からADC5397、SRC4137といわゆるソースになります。右側が上からDIV5142とゲインフェーズアナライザです。
RCAのケーブルも余った分は丸めて結束しておきます。これで、机の上がすこし広くなりました。
キーボードのほかに、マウスもおけそうです(笑

PeakingEQは使えるかな?

なんとかDIV5142でパラメトリックイコライザ(PEQ)は実現できそうなのはわかったのですが、実際にディジタルフィルタの
係数計算は自前でできる必要があります。つねにPCで計算させて、その結果をPICに書き込むのではスタンドアロンで
使えません。で、Cookbookから、おそらくこれだろうな〜とおもうpeakingEQがパラメータの計算に使えるか試してみましょう。

備忘録的に引用しますが、Biquadフィルターの伝達関数は

となります。そして、それぞれの係数は

で与えら得ます。ここで、


となります。
さて、例題としてサンプリング周波数がFS=44.1kHzでfo=1000Hz、Q=5,Gain=6dBの場合の係数を計算してみると。

FS 44100
f0 1000
Q 5
dB 6
α 0.014199429
wo 0.142475828
sin 0.141994289
cos 0.989867477
A 1.412537545
B0 1.020057226
B1 -1.979734954
B2 0.979942774
A0 1.010052426
A1 -1.979734954
A2 0.989947574

ここで得られた結果をPCM5142の係数に割り当てます。PCM5142の係数は次式のようになっているので、
A0で正規化したのちに、若干数値を変換します。


PCM5142のBiquadフィルターの伝達関数

変換した結果は次のようになります。

PCM5142係数
B0(N0) 1.009905229
B1(N1) -0.980015939
B2(N2) 0.970190011
A1(D1) 0.980015939
A2(D2) -0.98009524

あれ?
 係数をみていると絶対値が1を超えているものがあります。これはいけません。PCM5142の内部では整数演算されるのですが
1を超える係数を単純に整数にしてしまうと正負が反転してしまいます。ということで、すこしゲインがかわりますが、1を超える係数の
部分で分子あるいは分母のみを正規化します。ここでは分子のみの正規化です。

さらにPurepath Studioで計算された値とも比較してみました。なんか微妙に違いますが、ほぼ一致しているようですね。
おそらくこの違いは倍精度と単精度での計算の違いかな?と思われます。

正規化前 分子を正規化後 Purepath Studioでの
Equalizer(Q)での計算値
B0(N0) 1.009905229 1 0.999999
B1(N1) -0.980015939 -0.970403867 -0.9703376
B2(N2) 0.970190011 0.960674311 0.96054077
A1(D1) 0.980015939 0.980015939 0.979982
A2(D2) -0.98009524 -0.98009524 -0.98002684

ついでにフィルター係数として、あと使いそうなのがlowshelpとhighshelfです。これはいわゆるラウドネスをつけるときに
使います。たとえばlowshelfだと設定した周波数以下のゲインを一様にあげることができます。highshelfはその反対で
設定した周波数以上のゲインを一様にあげます。

それにしても、Lowshelfにしてもhighshelfにしても式が長いな〜。プログラムするときに間違えてしまいそうです。

ちょっと妄想

パラメトリックイコライザをつくったとしても、その設定をどうすかは興味のあるところです。
というのも、いつものようにスイッチパチパチでLCDで数値を確認しながらというのが、もっともシンプルで場所もとりませんが、
もう少し視覚的にというか感覚的に操作ができるとよりおもしろいでしょう。本当ならPC上でマウスをつかって〜となるところですが、
あくまでもスタンドアロンでの動作にこだわると、(こだわるというより単にPCのソフトが組めないだけですが・・・)
オールドスタイルですが下のようなパネルがあるといいな〜と思ってしまいました。
 昔には高くて入手できなかったリベンジにもなりそう。



 そう思って感触だけでも楽しもうと思って、秋月で注文するついでにこんなものも買ってしまいました。


こんなのをずらりと並べるのも楽しそう。
50kΩ(B)のスライドボリュームとつまみで130円/セットです。

最終的にはディジタル入出力(PCM)が可能なパラメトリックイコライザーですね。

ただ、問題が一つ。一杯可変抵抗器を載せるのはいいのだけど、その数だけAD変換器の入力チャンネルが必要です。
8素子とすればゲイン、周波数、Qの組み合わせでトータル24チャンネルです。8chのADを3個使えば足りますが、あまり芸がないかな?
精度的には10ビットもあれば十分なのでPIC内のADを使うのも一つの手ですね。でも24チャンネルとなると40PinタイプのPICが必要です。
28PINタイプのPICだと、入力チャンネルは19くらいだな〜。
 まあ、こんなことを考えるのはもう少し先になってから考えましょう。

peakingEQをDIV5142に組み込んでみましょう!

さて、Purepath Studioで算出したフィルターと、peakingEQで計算したフィルターの係数をDIV5142にインストールして比較してみましょう。
両方を比較した結果は下のグラフのようになりましたが、完全に一致しますね。微妙な差を拡大してみても、その差はほとんどないと言って
いいでしょう。


Purepath StudioのEqualizer(Q)とpeakingEQの定義式はまったく同じようです。


細かくみても、ほぼ一致。微妙な違いは計測再現性の問題かな?

その他のフィルターも試してみましょう

・highShelfフィルター fc=1000Hz、Q=0.707、Gain=6dB



・lowShelfフィルター fc=1000Hz、Q=0.707、Gain=6dB


lowShelfはfo以下が6dB下がっているのだけど、highShelfはfo以下が6dB下がっているな〜。
相対的には正しいのだけど、こういったも形になるんですね。ということは、highShelfをつかうと高域は強調されるが
全体的なゲインは下がるということになりますね。

念のため
今試しているのはLチャンネルのみに8個のBiquadフィルータをつけています。すなわち8素子のパラメトリックイコライザが
あるわけです。ここで、念のため全段をスルーにした場合を計測しておきましょう。

テストで使っているフィルター構成です。Lチャンネルのみに8個のフィルターを搭載しています。

全段をスルーにした場合の特性は下のようになります。
フラットですね。低域て低下しているのはカップリングコンデンサンのと抵抗によるハイパスが構成されているためです。

        ゲイン特性です。ディジタルフィルターはすべてフラットです。

ここで、一度位相特性もみてみましょう。折角のゲインフェーズアナライザですからフェーズも観測しなくっちゃ!です。


      位相特性です。ディジタルフィルターはすべてフラットです。

この位相特性をみて「?」と思われると思いますが、これは位相特性には間違いないのですが、位相がずれて
いるというより時間遅れによるものです。すなわち、ディジタルフィルターをスルーにしたといっても、その回路内を
通過するのに時間を要します。その時間遅れ(一定値)が、すべての周波数帯でかかっていることになります。
そのため、高い周波数になるほど位相が激しく変わっているように見えているだけですね。

ちょっと改造 2019.8.22

 いろいろと測定していますが、やはり低域のゲイン減少が測定上邪魔です。原因はカップリングコンデンサが小さい
ためによるHPFとしての影響です。今後の測定に邪魔(こんがらがる)なのでゲインフェーズアナライザに入っている
10uFのカップリングコンデンサを除去しました。本当は、もっと大きな値のものに変えようかと思いましいたが、実装スペース
がなかったため、あんちょこにショートさせてやりました。
 その結果は、フィルタ−スルーとfo=100Hz、5000Hzでラウドネスをかけた場合のゲイン特性です。
今回は測定範囲を10Hz〜100kHzと拡大しています。低域でのゲインのだら下がりはなくなりました。
しかし、10uFのコンデンサを除去するだけで、なんでこんなに効くかなあ?ひょっとしてコンデンサが劣化して内部の直列抵抗が
相当に大きくなていたのでは?と思ったりです。まあ、時間があればそのあたりも調べてみましょう。
 あと、周波数が20kHz以降はばっさりと切れています。これは、再生側(DIV5142)も発振器側(ADC5397)もどちらも
FS=44.1kHzで動作しているので、20kHz以降はばっさり切れているということですね。

ゲイン特性。フィルタースルーとfc=100Hz、5000HzでlowShelfとhighShelfをかけた場合(Q=0.5,G=6dB)

もうちょっとグラフの縦軸を拡大しておきましょう。計算どおり、低域と高域で6dB上昇しているのがわかりますね。
 
ゲイン特性。フィルタースルーとfc=100Hz、5000HzでlowShelfとhighShelfをかけた場合(Q=0.5,G=6dB)

ついでに、800HzあたりにQ=5、ゲイン3dBの定数で、パラメトリックイコライジングを追加してみましょう。
真ん中にちょこんと、小さな山ができましたね。


上記の特性にpeakingEQ(f0=800Hz,Q=5,G=3dB)を追加した場合。

このように自由に周波数特性をいじれるのがディジタルフィルターのいいところですね。

動作周波数の確認

 パラメトリックイコライザを構成する基本要素であるpeakingEQの動作が確認できました。
また、周波数特性を変更するときによくつかうlowShelfとhighShelfの動作も確認できました。
あとは、これらのフィルターを構築したときに、どこまでサンプリング周波数を上げることが
できそうかを確認しておきましょう。
 いまのままだと、44kHzのみになるので、やはり192kHzまでは再生できるようにしたいです。
基本的にはDIV5142とフィルターの構成は同じですが、入力にスケール(減衰器)が入っているので、
これですこしクロックを消費しそうです。

1)LRで8素子×2・・・・だめ
まずはDIV5142とほぼ同じ構成について、入力にアッテネータをつけました。
この場合、実行サイクルが258になり255を超えるのでだめです。

DIV5142とほぼ同じ構成で、入力部分にアッテネータが付いている。

サイクル数は258と大きいです。目標は255以下です。

2)LRで7素子×2・・・・OK

そこで、1つだけBiqauadフィルターを減らしました。そうすると、サイクル数は238になり、問題なさそうです。

1つBiqauadフィルターを減らし7個にしました。これならOKです。

3)LRで7素子でモノ再生・・・OK
 2)の構成でモノラル再生もできるようにした場合でも、サイクル数は243であり問題なしです。


4)片チャンネルのみなら?・・・14素子まで
 グラフィックイコライザのようにつかうなら素子数は多いほうがいいのですが、この場合は片チャンネルだけつかって
ということが考えられます。この場合なら14素子まではいけそうです(実行サイクル234)。ステレオで使う場合は
2個のPCM5142をつかって、出力を合成すればいいでしょう。LRクロックの極性で、どちらのチャンネルの出力を送出するかを
決めればいいので、とても簡単にできるはずです。

片チャンネルだけでつかうなら14素子まで対応できそうです。グライコになりますね。

ちょっと長くなってきたので後編に移ります。


後編につづく