パラメトリックイコライザーを検討する!の巻き(後編) 2019.8.23

前編はこちら。

ちょっと息抜き・・・VR基板の作成
ソフトばっかりいじっていると、すこし体がなまってくる(?)ので、すこし力作業を行いましょう。
ということで、構想だけしていた入力基板を作成してみました。基板は適当に片面基板でも良かったのですが、
部品面にスライドVRを半田で固定する必要もあったので、両面スルーホールが必要です。
また、GND配線を簡単に行いたかったので、ちょっと贅沢してWIDEサイズの自家製の基板をつかっています。


まずはレイアウトを考えて、最初にスライドVRを取り付けです。
回転式のVRは、簡易的に1回転の調整用のVRをつかいました。安価な中華製です。

完成
 配線数はさほど多くありません。各VRに電源を配線して、VRの中点をPICに接続するだけです。
基板の部品面にGNDメッシュがあるので、GND配線はそこへ半田ジャンパーさせるだけでいいので
簡単です。このGNDメッシュは配線の簡易化に役立ち、またGNDインピーダンスを低下させるのにも
有効で、一度使うとやめられません。
 今回はADの入力点数が多いこともあるので、PICには40Pinのものを用いました。


完成です。それほど時間はかかりませんでした。夜中の悪戯にベストマッチ(笑。

まずは単独で動作確認
 合計で15個のVRがあるので、それらをすべてAD変換してLCDに表示させるソフトを作成しました。
そして、それぞれVRを動かしたときに、所定のチャンネルが動作するかの確認です。

まずは単独で動作するソフトを作成です。


おいおい!
 1個1個VRを回しながら値が動くかをチェックしていきますが、中華製のVRはどうも回転がスムーズではありません。
と、1個づつチェックしていると、あるVRをまわした瞬間に「ポロ」と回転部分がとれてしまいました。
あれまあ〜。安いからか、つくりが粗雑なのや性能が悪いのは我慢するけど、壊れるのは我慢できないな〜。
まあ、一個くらい壊れても無視すればいいのですが、その部分だけ値がふらつく(接点がなくなっているため)し、
見た目も悪いので、仕方なく交換しました。
 しかし、この調子たど他のVRも壊れそうだな〜。

あちゃ〜、こんなん壊れるの初めてみた。

通信ソフト作成
 単体で動くことが確認できたので、DIV5142との接続テストです。DIV5142とVR基板との通信は
2線インターフェイスとしています。DIV5142からクロック信号を送出して、それに同期してVR基板から
データを1ビットづつ送信します。だいたい、15個のVRのデータ(10ビット×15)を送出するのに、
全体で2mS程度かかりました。1ビットあたりに換算すると約12usですね。すこし早いRS232C程度という
感じでしょうか。ソフトをもう少し見直せば早くなりそうですが、まあ2ms程度で全データが通信できれば
十分でしょう。実際には1秒間に10回程度しかサンプリングしませんので、まだまだ余裕があります。

 一応、送り出しデータと受けとりデータが一致することが確認できました。これで、VR側のLCDは
お役ご免です。

通信ソフトも完成しました。VR側とDIV5142側で同じ値が表示されることを確認したので、
もうこれでVR側のLCDは不要になります。


簡単にPEQを動かしてみましょう!

さて、入力部分もできたので簡単にPEQのソフトを作ってみましょう。
係数を各BIQUADフィルターに書き込むだけの簡単なものを作成します。
といっても、今日は週末だから夜鍋コースかなあ〜(いつも夜鍋のような気も・・・・)

簡易版完成!2019.8.24
 とりあえず、入力装置が5素子なので5素子分のイコライザを作りました。
ほんとうは、それぞれの素子の役割は任意に決められるようにできるのですが、
ここでは決めうちです。そのためpeakingEQとして動くのは3素子になります。
どのように素子を割り当てたかといえば
 素子1: LowShelf      f0=20〜200Hz Q=0.3〜30 Gain=-15 to 15dB
 素子2: peakingEQ1    f0=20〜200Hz Q=0.3〜30 Gain=-15 to 15dB
 素子3: peakingEQ2    f0=200〜2kHz Q=0.3〜30 Gain=-15 to 15dB
 素子4: peakingEQ3    f0=2k〜20kHz Q=0.3〜30 Gain=-15 to 15dB
 素子5: HighHSF      f0=2k〜20kHz Q=0.3〜30 Gain=-15 to 15dB


5素子にしても設定の組み合わせが無数にできてしまいます。まあ、すべての素子を動かすことは
ないかと思うので、使わない素子はスルーも選択できるようにしたおいたほうがいいでしょう。

ディジタル設定の憂鬱
 さて、できたのはいいのだけれど、ディジタルにすると設定はイライラする側面がでてきます。
というのも、ボリュームの値はADで読み込みますが、PIC内蔵のADとはいえ分解能が10ビットあります。
ほぼそれに近い分解能を割り当てることができるのですが、そうするとゼロ調がイライラします。
どうしても、ティジタルなので設定値が「0.0」になるようにしたくなるのですが、かなり微妙な調整
が必要です。これが、アナログなら適当にゼロ付近ということで、済むのですが・・・・
 ということで、仮の設定ですが現状10ビットある分解能を32階調に減らしました。そうすれば、
ゼロ調が簡単です。
 j実際の分解能はどの程度にすればいいかは思案のしどころです。大体100分割くらいかな?

試聴の前にデータ取り

色々と設定してデータを取ってみましょう。
表示の見方は下図の通りです。




まずはフラットな特性から。すべての素子のゲインを
0dBにしています。192kHzサンプルなので96kHz以降
がばっさり切れています。


まずはLow Shelfです。周波数100Hzでゲイン6.6dB、
Q=0.71の特性です。



同様にHigh Shelfです。周波数8kHzでゲイン5.7dB、
Q=0.71の特性です。


中心を膨らますためにf=1kHzで5.7dBゲインを上げました。
Q=0.52なのでかなり横軸に膨らんで上昇しています。


Q値を3と高くしてみました。かなりシャープになりました。
これって聞いたら不自然に聞こえるのだろうな〜。


HighShelp とLow ShelfとpeakingEQを組み合わせてみました。


さて、試聴してみましょう!

おっと、その前に視聴用に電源を調達する必要があります。
現状は実験用の電源をつかっているので、そのまま移設はできません(できるけれど、とても面倒・・・)。
部品箱から、適当なものがあるはずなので捜索しましょう。

あ、そろそろ出かけなくっちゃ。試聴は明日かな?〜。

試聴の前に 2019.8.25

まだ(夜中なので)音だしできないこともあり、すこし気になっていた最大素子数について試算してみました。
DIV5142をつかってグライコ並みにどこまで素子数が増やせるか、です。
 検討しているときに気づきましたが、PCM5142ではDACを動かすこと自体がかなりの実行サイクルが必要になるのと、
それと実行サイクルの制限がでてきます。それに対して、DAC出力をカット(音声出力なし)とすれば、実行サイクルの
制限から開放される(データの時間遅れは気にならない)ので、素子数を増やすことができます。実際に音声なしの場合での
最大素子数はPCM5142のRAMに格納できる命令ステップの上限で決まるようです。
 Biquadフィルターの係数は最大で254までつかえますが、実際にはその半分も使わないということです。

で、試算した結果は下記の通りです。

CASE 構成 音声ありの場合
(DAC稼動)
音声なしの場合
(DAC非稼動)

1個だけ使用した場合。
7素子
24素子

2個使用し、それぞれL,Rの専用プロセッサとして使用。出力は合成器をつかって
1つのPCM出力にまとめる。
14素子 49素子

2個のPCM5142をシリーズでつなぐ。
31素子
(全段をDAC非稼動で24素子、
後段をDAC稼動の7素子)
48素子
上記の3段シリーズ 55素子

1段目 DAC非稼動 24素子
2段目 DAC非稼動 24素子
3段目 DAC稼動 7素子
72素子
上記の4段シリーズ 79素子

1段目 DAC非稼動 24素子
2段目 DAC非稼動 24素子
3段目 DAC非稼動 24素子
4段目 DAC稼動 7素子
96素子

PCM5142では4個のPCM5142を搭載できるので、やる気になれば最大で96素子のグライコあるいはパラメトリックイコライザーが作れることになります。
しかし、それだけ素子数があっても設定が大変なので実用的には最大で30もあれば十分でしょうね(それでも、どうやってパラメータを入力するの、とは
なりますが)。

この場合、構成としてはCASE2あるいはCASE3になりますが、CASE2だと外付けで若干の回路が必要になります。
CASE3ならば基板内のパターンカット1箇所とジャンパー1箇所ですみます。
やるとすれば3ですね。

ただ、パラメータの入力方法をどうするかがもっとも頭をつかうところです。
スライドボリュームを30個並べるのは壮観だなけどなあ〜。

試聴準備

試聴室(リスニングルームです)に基板類を持ち込むわけですが、ばらばらのままだと、いざというときに
落として配線をきったりする恐れもあるので、まずは一体にまとめます。このあたりは基板サイズが同じなので
積みかせねるだけでいいのですが、VR基板とDIV5142が重なると液晶がみにくくなるので、VR基板は片持ちでの
とりつけです。
 しかし、相変わらずこの状態って「ハウルの動く城」だなあ〜と思ったりです。

持ち運び出来るように一体にまとめました。


電源は部品箱にあったスイッチング電源です。+5V、正負15Vの出力がでます。

試聴!
さて、試聴室に持ち込んで結線して試聴開始です。
接続の構成は下記の通りです。

CDプレイヤー(同軸出力)→SRC4137(192kHz変換)→DIV5142(5素子PEQプログラム)
                     →プリアンプ→チャンデバ→パワーアンプ(×3)→スピーカ(3WAY)


DACはそのままDIV5142のアナログ出力を用いています。


こんな感じで試聴しています。

まずはフラットな特性で聞いて、普段の音を確認したのち、まずはLowShelfから試してみます。
「これはいい!」

使っている3WAYのトールボーイは、以前から気になっていたのですが、バスレフポートが長くて低音の量感に
すこしかけるところがあります。まあ、バスレフがあまり効いていないということは、自然な音なんだろうな〜と自分自身を
納得させていましたが、PEQを入れてすこし低めのF0で低音を持ち上げてやると、見違えるような音に変身です。
POPSなどで低音が響く音楽には、やはりドンシャリ気味の方が聞いていて気持ちいいところもあるのですが、
まさしく心に響く音になりました。
 いろいろと試してみて、fo=60Hzあたりで6〜7dBくらい上げるといい感じです。
それ以上あげると、さらに低音は増すのですがすこし不自然に大きな低音です。また、f0を上げると
同様に、低音領域全体が持ち上がるのでそれもすこし不自然になります。スピーカユニットの不足とする領域のみを
持ち上げるのが良さそうです。
 次は、高音部です。高音部は触る必要はないと思っているのですが、心持ちあげるとシャキットした音になりそうなので
2dBほどあげまあした。


低音を持ち上げるとやはり気持ちいいです。

中音部、たとえばボーカル領域については調整はかなり難しいです。
上げると、たしかにボーカルが前にでてくるのですが、上げすぎるとすこし乾いた音になってきます。
このあたりはQ値を変更すればいいのかもしれませんが、中音域はさわらないことにしました。

結果としては、低音部についてはfoを低めにして持ち上げるというのが私のシステムではもっとも効果が
ありました。あと高音部についてもすこしだけ持ち上げてみました。
しばらくこれで音楽を聴いていますが、落ち着いたらもっと色々と調整してみたいものです。
でも、この調整ってかなり泥沼に陥りそうですが・・・・・

気になる点は
 PEQのソフトをつくりましたが、気になる点が1つありVRを動かして特性が変更されるときに
音がすこし途切れます。これはテーブルを書き換える前に一旦MUTE状態にしているからなので、
どうしようもありません。ひょっとしてもMUTEをかけなくてもよいのかもしれません。
PCM5142には係数用のRAMが2テーブルあって切り替えることができます。これは上記の
対策のために作られたものと思うのですが、特性を変更するときは他方のテーブルに書き込んで、
書き込みが終了したら、テーブルごと切り替えることで音の途切れを最小限にするものでしょう。
まだ、その使い方は知らないで、すこし調べてみる必要がありそうです。
 DIV5142ではプッシュスイッチで特性を変更していたこともあり、スイッチ操作時に音がすこし
途切れるのは気にならなかったのですが、VRだと操作が連続していることもあり、その操作中に
音が途切れるのはすこし気になりました。すこし課題ですね。

まあ、週末はのんびり音楽でも聴きましょう。

なるほど!

前述したように、PCM5142の係数用RAMは2つあり、それぞれがA,Bという名前がついています。
アダプティブモードにすると、DSPが動いている間はAがアクセスされています。その状態ではAには書き込みができません。
Aに書き込みをするには、DSPをとめる、すなわちDACをスタンバイさせる必要があるというわけです。
それに対してBにはDSPが動いている間でも書き込みができる。
いままでは、Aだけをつかっていたので、係数を書き込む前には一旦DSPを止めて(DACをMUTE状態)、係数を書き込んだのちに、
再スタートをかけていました。そのため書き込む係数の量にも依存しますが、数mS〜数10mSはDACが止まった状態になり、
そこから再スタートをかけたときに、起動時のプチという音が聞こえたのだと思います。
 そこでレジスターのセッティングをみると、RAMのスイッチがありAとBをスイッチ(どちらかといえばSWAP)ができるようです。
すなわち、DSPが動いている間(Aをアクセスしている)にBに新しい係数を書き込んで、スイッチをさせれば
音が途切れることなるフィルター特性を切り替えることができます。

たとえばゲイン(スケール)を変更する係数を換える場合ですが、従来方法との比較で空白の時間が新しい方法ではゼロになっています。

今まで方法だと、新しい係数を書き込むときに
DSPを停止させていたので、数mSの空白期間
があります。
アダプティブモードでのスイッチ機能をつかえば、
空白期間なしに、切り替えることができます。


切り替え時のデータの連続性もあるようです(ゲイン切り替え時)


このスイッチをつかえば、音が途切れることなくフィルタの特性を変更することができそうです。
ただ、1つ面倒なことがあって、RAMのA,Bを入れ替えるのはいいのだけでど、切り替えられたRAMの内容には、
変更した内容が反映されいませんから、以前に変更した内容もふくめて新しい内容を書き込む必要があります。
すなわち、変更にすこし時間がかかりそうなことです。一つ前に書き換えた内容を覚えておいて、それを追加で
書き込むのが時間的に早いですが、結構面倒なのでフィルター全体を書き込むのがソフト的には作成が簡単です。
ただ、フィルターすべてを書き換えるのにどのくらい時間がかかるか、一度測ってみないとわからないな〜。
 まあ、このあたりは細かいところではありますが、意外と時間のかかるところだったりします。


タイムアライメントを調べてみましょう 2019.9.2
もともとオーディオでタイムアライメントを調べてみると、カーオーディオへの適用が多いようです。
そりゃ、考えればそうですよね。運転席は国産なら右前方ですから、左右のスピーカならびに
前後のスピーカとも距離がバラバラです。ツーイタが目の前にあるにもかかわらず、ウーハが後部座席
の後ろにあったりしたら、音の到達時間はバラバラになってしまいます。
 一方、ホームオーディオはどうでしょう? すくなくとも、リスニングポイントは左右のスピーカの真ん中
です。考えられるとすればウーハとツイータのボイスコイルの位置の違いくらいでしょうか。
そういればタイムアライメントのために、ツイータの位置を後ろにずらすなどの工夫がされているものも
ありますね。
 やっかいなのはホーンをつかっている場合かもしれません。巨大なホーンだとウーハとホーンドライバ
の距離は1m以上はなれている場合もありそうです。まあ、それは極端な事例として、タイムアライメント調整
がPCM5142でできるか調べてみました。

DELAY素子?

Purepath Studioの中のブロック図にはDELAYなるものもがあります。
おそらく、時間遅れを発生させる機能なのでしょう。これがあることは知っていましたが、
どのくらいの時間が遅れるかは、定量的に調べてことがないので、この機会に調べてみました。

極端な例ですが、DELAY素子の各素子の設定値を最大(45)にして、12個並べてみてどのくらいの
時間遅れが発生するかを調べてみました。
 片チャンネルだけにDELAY素子を集中して配置します。


Lチャンネルのみに、12個のディレイ素子を並べてみました。

結果は192kHzサンプルの場合ですが、12素子を並べると約1.06msの遅れを発生させることができました。


12素子を並べると約1mSの遅れが発生します(192kHzサンプル時)

各素子あたりで約88usの遅れが発生できるようです。各素子の最小値は3で最大で45ですから、
概算で88/45=1.95usですから約2usの調整ができる可能性がありそうです。
 音速を340m/sとすれば約0.66mmの分解能になります。

問題は・・・・・
 DELAY素子の設定に問題があります。ディレイ素子の遅延時間は定数テーブルとして入っているのではなく、
命令の中に組み込まれているという点です。すなわち、どこかの値を書き換えれば任意の時間遅れが設定できる
というわけではなさそうです。命令群になにか規則性がわければいいのですが・・・・・
 色々と知らべていますが、結構難航中です。

ちょっと妄想・・・・ 2019.9.16

スライドボリュームをつかって、ゲイン調整できるようになればカッコいいけど、周波数がたくさん増えると大変だし、
それにケース加工がものすごく面倒そうです。それに、キャラクターディスプレイへの数値の表示は定量的でいいのだけど、
ちょっと感覚的にわかりにくい。
 やっぱりグラフィカルになったほうがいいな〜と妄想していました。
で、何気に部品箱をみていると、あまり買った記憶がない(ひょっとして福袋に入っていた?)のだけど、グラフィックLCDがあったので
これをつかうといいかも!と思ってしまいました。
 ドット数は128×64とちょっと少なめですが、それでも色々な表示ができるはずです。
これを使えば、こんな感じのものができるかな〜っと。



・周波数とゲイン、Qはロータリーエンコーダで調整。
・折角なのでグラフィックイコライザ(GEQ)とパナメトリックイコライザ(PEQ)を切り替えできるように。
・PEQだとフィルターの種類もかえられるといいかな?といってもpeakingEQとhighShelfとLowShelfだけですが・・・。
・DIV5142と組みあわせるならCHの変更もできるといいかな? しかし、1chで十分じゃない?という気も・・・・。

とりあえず

手元にあるグラフィックLCDを動かしてみましょう。


こんなんが見つかりました。ちょっと古そう・・・・
秋月での最初の販売は2007年のようです。

まずは、簡単にブレッドボードに組み込みます。配線数が以外と多いです。
キャラクターディスプレイは全部で制御線が6本で済みましたが、グラフィックLCDは
全部で14本必要です。そのため、PICも40Pinタイプをつかいました。

まずはブレッドボードに組込みです。

なかなか動かない・・・・・

GLCDの取説をみながら、プログラムを書いているのですが、なかなか動きません。
正確には、表示はされるのだけれとノイズだらけ。予期した表示がされません。

なぜかな?と悩みつつ、何気なくPICのクロック周波数を落とすと動き出しました。
どうやら、書き込み/読み込みのタイミングの問題のようです。でも、
マニュアルにあるタイミングは守っているのだけどな〜。
 たとえば、書き込むクロックについては最小幅450nsとあるのですが、
実際には3usにしないと動かないという始末。なぜなんだろう?
 まあ、原因調査は別途行うとしても、まずは動き出してホットしました。

ちょっと雰囲気だけ・・・・

GLCDが動き出したので、ちょっと雰囲気だけ感じるために図形を描いてみました。

グライコをイメージした表示。


パラメトリックイコライザーをイメージ。
バーの位置が周波数で、高さがゲイン、そしてバーの幅がQ値です。

まあ、128×64だけど、使えそうな雰囲気です。これに、数値や文字も表示するようにすれば、
それなりにカッコイイ感じになっていくでしょう。でも・・・・・・

ちょっとコントラスト低いな〜

このGCLDのコントラストはものすごく低いです。バックライトをつけてもほとんど改善しません。
コントラスト調整のVRがわるいのかな〜。これだと、ちょっとやる気が出ないです。
もっと、いいLCDを調達しましょう・・・・

これあたりが良さそうです。

これだと、もうちょっと綺麗かな〜。

明日、東京にいくついでに秋月に寄ってみましょう〜。

(つづく)