グラフィックイコライザ FEPS5142(GEQ)版を検討する!の巻き。 2020.1.6

FESP5142でのパラメトリックイコライザが一旦完成し、まずはこれで音を楽しんでいますが、
ビジュアル的にはグラフィックイコライザもつくれれば嬉しいので、実現できそうか検討してみましょう。

最初はパラメトリックイコライザとグラフィックイコライザを1枚の基板で実現できれば、と考えていましたが
どうやらそれは無理そうなので、まずは本命のパラメトリックイコライザから着手した次第です。

では、なぜグラフィックイコライザを入れなかったかといえば、色々と理由があるのですが

懸念だった事項
・DACのアナログ出力がつかえない
  イコライザ素子が7素子を越えるとPCM5142のDSP命令が数多くなるので、音声出力処理まで
 カバーしれきれません。かといって7素子のグラフィックイコライザーなんて貧弱すぎ・・・・。
 作るならmaxの24素子までやりたいのですが、先述の通りアナログ出力はむりなので、ちょっと後回し。

プログラム容量に懸念
 これがもっとも大きな懸念材料だったのですが、パラメトリックができた時点でROMの容量は75%です。
 DSPの命令とデータ領域が14%なので、実質のプログラムの容量は61%です(結構大きいな〜)。
 それに対してグラフィックイコライザの場合はDSPの命令・データが素子が増える分多くなり、およそ
 パラメトリックの3倍になります。すなわち全体の42%を占めることになります。となるとキャラクターベース
 でつくったプログラム61%とあわせると103%ですから、入りきりません。それにグラフィックを描かせると
 さらに容量も必要になってくるので、こりゃ無理だ〜てなことになってしまいます。

・速度の問題

 とくに秋月LCDと中華GLCDが混在するようなプログラムでは、GCLDのアーキテクチャーが全く違うので
 グラフィックルーチンを書くと、かなりこんがらがりそうですし、片方を優先すれば片方の速度がかなり犠牲に
 なってしまいます。

ということで、最初からあきらめモードではあったのですが、まあハードルが高いほうがチャレンジは楽しいでしょう。
ということで、色々と対策を考えます。

対応案
・DACのアナログ出力がつかえない
 → これは純粋にあきらめます。できないものはできない、無い袖は振れません(笑。

・プログラム容量
 → これはDSPのデータはかなり重複しているところも多いので、それらをまとめると2/3くらいになるかもしれません。
   処理時間はかかりますが、初期データもすべて計算して導出するようにすれば半分くらいまで縮小できるかもしれません。
   外付けEEPROMにするのも一つの手かな・・・そのためのパターンも用意してあることだし・・・。

   それと、DSPの実行プログラムはパラメトリックでは補間係数で2倍、4倍、8倍の3つ用意したのですが、それを減らしても
  いいかもしれません。192kHz対応の2倍と48kHz対応の8倍だけにして、96kHzの場合は2倍で実行することが考えられます。
  まあ、それが可能かどうかも試してみる必要はありそうです。

・表示速度の問題
  これはテクニックだけの問題でしょう(面倒ですが)。画面に点を打つたびにデータ送信を行うと、無駄がおおきいので、
 どこかにイメージをもっておいて、同じアドレスへのデータはまとめて送信できるようにするだけでも、かなり高速になるはずです。

さて、企画倒れにならないように考えていきましょう。

まずは画面周りから

まずは折角のグラフィックイコライザなので画面が気持ちよく動いてほしいものです。
ということで、表示プログラムから再検討です。以前のときは、点を1点打っては、GLCDのメモリーに転送していたので、
すごく冗長なところがありましたが、今回は一定の領域をまとめて転送することでオーバラップを減らして、高速化をはかります。
GLCDが何がおそいかといえば、一命令の実行のあとで必ず数10uSのウエイトを入れる必要があることです。これが全体の
速度を律速してしまいます。なんせ、64MHzで動かしたPICでは1命令は62.5nSで実行できますが、その数100倍の余分な
ウエイトが必要としています。


画面周りができました。表示は同じですが、描画プログラムは一から作り直しています。

コア部分を作成しましょう!

久しぶりにPurePath Studioを起動して24素子のグラフィックイコライザの骨子を作成です。
これって、簡単な仕組みですが、配線が結構面倒だったりします。というのも、配線をつなぐ場所を
マウスでクリックするのですが、なかなか場所があわなかったりします。単なる老眼かもしれませんが・・(笑。


24素子のエレメントのグライコの構造です。

あれ?(その1)

上のグライコの構造をつくって、遅ればせながら気づきました。
単にDSPの出力をPCMで出すだけなら、補間処理はいらないんだ!!
DACを使ってアナログ出力をだすには、下のようなエレメントが必要になりますが
今回はメモリーと実行速度の関係から、搭載できませんが、アナログ処理がないのなら
この補間処理はいらないんだ!そうなるとすれば、実行モジュールは上記の構造1個で済みます

×2倍補間の音楽出力エレメント。192kHz用です。今回は使用できません。

となるとメモリーの増加は14%程度で納まりそう。ということは、現在はパラメトリックイコライザを搭載した状態で
メモリーの使用率は75%ですから、+14%しても89%ですからまだ余裕ありそうです。
というか、パラメトリックイコライザとグラフィックイコライザーが同居できそうな予感がしてきました。
とはいえ、同居させるのは結構ややこしそうです。

動きだした?あれ?(その2)

とりあえず、現在のパラメトリックイコライザーのプログラムに無理やり組み込んで、グライコとして動かしてみました。
現在のメモリの使用率は89%ですから、予想通りです。でも、余裕ないな〜。

で、まずは44.1kHzの信号を入れてみて、まずは出力が問題なくでることを確認しました。
FESP5142のDACは使えないので、SPDIFで外部のDACに接続して確認しています。


まずは44.1kHzで波形がでることを確認。

つづいて、96kHzにアップサンプリングして・・問題なし。
最後に192kHzにして・・・・あれ?波形がでない?

192kHzで動かない?
 何がおかしいか、調べているうちに24素子のグライコではDSPのサイクルが495になっています。
これが256以下にならないと192kHzの処理はできません。512以下なら96kHzは処理はできるのですが・・・


24素子のグライコだと実行サイクルがかなり大きく192kHzは再生できないようです。

どうやら勘違いがあったようで、24素子まで使えるというのは、24素子までPCM5142で実行できるというだけで、
それが192kHzまで対応しているということではなかったようです。こりゃ、失敗!失敗!

ちなみに、7素子のパラメトリックイコライザでは、アナログ再生の補間を×2にして実行サイクルを238に押さえているので
192kHzの再生が可能でした。

7素子のパラメトリックイコライザーの構造。アナログ音楽再生のための×2の補間処理がはいっています。

これで実行サイクルは238(<256)なので192kHz再生が可能です。


さて、どうするかな? 素子数を削って192kHz対応にしてもいいのだけど、そうすると素子数はおそらく12程度に
なるだろうな〜。ちょっとグライコにするには貧弱な感じです。96kHzまでの限定として24素子を確保するほうがいいかな〜。
おそらくCDとDACの間に挟むことを考えると、ほとんどは44kHzでいいはずだし・・・・。
 ハイレゾで使用する場合はパラメトリックイコライザで動かす、ということにするかな〜。

ちょっと悩みます。しかし、最大素子数の検討で速度は考慮していなかったのかなあ〜。というか、考慮していなかったことを
忘れてしまっていたのでしょう。都合の悪いことは忘れてしまうのかもしれませんね。

その後確認
#192kHzまで対応させようとしたら、最大素子数は12個でした(実行サイクル255でぎりぎり(<256)です)。
#過去の記事を読み返して、ちゃんと24素子だと96kHzまでが限界とありました(汗・・・下参照。



過去の記事でも検討してましたね!だかだか4ヶ月程度前のことですが、ほぼ忘れてしまっています・・・・。まあ去年のことなので(笑

Q値の選択だけで済むのか? 2020.1.8

グラフィックイコライザーを考えるにあったって、単純に周波数で分割したフィルターを並べてゲインを可変するだけでよいのか?
という疑問が沸いてきます。というのも、隣あう周波数帯でゲインを変えると、お互いに影響を受けてしまいます。
互いの影響を受けにくくするにはQ値を上げて、ゲインの変化を急峻にすればいいのですが、そうすると2つの周波数の間に
ゲインの谷間(ディップ)が生じます。それを回避するためにQ値を下げると、今度は互いの影響により全体のゲインが変わってきます。

このあたりをすこし実測してみましょう。

 まずはシンプルに単周波数で測定です。発振器を100Hz〜10kHzでスイープさせて測定します。
 まずは、1kHz(+6dB)、Q=4.11での特性は下図のようになります。
 計算通りベースに対してほぼ倍(+6dB)の出力になっていることがわかります。

f=1kHz,+6dB,Q=4.11 (周波数100Hz〜10kHzでスイープ)

つぎに24素子のグライコを考えると、1kHzの隣の周波数は1300Hzになります。そちらも6dBのゲインを
かけてやります。このときすこしQ値は高めの5.59にしました。下図からわかるように、1kHzと1.3kHzで
ピークが立ちますが、中間に大きなディップができています。およそ3dBくらいでしょう。これは、
見た目にもあまり宜しくありません。ということで、すこしQ値を変更してやります。

f=1kHz,+6dB,  f=1.3kHz,+6dB Q=5.59 (周波数100Hz〜10kHzでスイープ)

まずQ値を3.02とすこし下げてやりました。そうすると中間のディップはかなり減りましたね(下図)。
でも、0.5〜1dBくらい残っていそうです。まあ、このくらいなら誤差の範囲かもしれません。
でも、もう一息平坦を狙ってみましょう。

f=1kHz,+6dB,  f=1.3kHz,+6dB Q=3.02 (周波数100Hz〜10kHzでスイープ)

平坦を狙ってQを2.39まで落としました。そうするとほぼ平坦になったようです。
ただし、下図からわかるように、全体のゲインがあがっています。およそ1.5dBくらいあがっていそうです。
狙いの値を6dBにするなら、全体のゲインを下げないといけません。

f=1kHz,+6dB,  f=1.3kHz,+6dB Q=2.39 (周波数100Hz〜10kHzでスイープ)

レベルを合わせるためにゲインを1.5dB下げてみました。そうすれば、ほぼ6dBのところに落ち着きました。

f=1kHz,+4.5dB,  f=1.3kHz,+4.5dB Q=2.39 (周波数100Hz〜10kHzでスイープ)

ちなみに、このQ=2.39という値で1kHzのみを5dBに上げてやると、特性は下図のようになります。
これからわかるように、かなりゲイン特性として裾野が広がっていることがわかります。

f=1kHz,+6dB, Q=2.39 (周波数100Hz〜10kHzでスイープ)

確認できたことは

 ・グラフィックイコライザで隣り合う素子間のゲインの影響を受けないようにするにはQ値を高くする必要があるが、
  その場合には中間でのディップが生じる。
 ・ディップを押さえるためにQ値を低くすると、素子間での互いの影響を受けて全体のゲインが上昇する。

ということでしょうか。まあ予想通りですが、メーカさんはこのあたりどうのように処理していのでしょうね?
まあ、少々のディップや感度上昇が生じててもおそらく1dB程度の範囲なので、許容範囲としているかもしれません。

やるとすれば・・・・

 互いの素子の影響を加味して、狙いのゲインになるように補正をかけるというのがいいかもしれません。
厳密には1つの素子を動かすと、他の23素子(全体で24素子の場合)にすべての影響を及ぼします。それを
考えると、ゲインの補正値を計算するには24×24の影響マトリックスを解く必要があります。
 そこまで厳密に考えなくとも、すくなくとも両隣までの素子にのみ影響を及ぼすと考えれば、同じく24×24のマトリックスですが
バンド幅3のマトリックスを解けばいいことになりそうです。ただ、リアルタイムに解く必要はなく、影響マトリックスの係数は
Q値が決まれば固定になるので、予め逆行列を計算してデータとして持っておけばいいでしょう。

<備忘録>

なんか、高校の数学を思い出します・・・

このあたり、メーカはどうやっているのかな? WEBをくぐってもほとんどでてきません。
特許庁を調べたほうが早いかな?

それにしても・・・・・

すでに、プログラムを組み進めるうちに容量が91%になってきました。こりゃ、足りるかな〜?
パラメトリックイコライザとの同居はやっぱり無理かな〜・・・・・

やりたいことはこんなことです。


たとえば、こんな形の周波数特性を得たいとしても、
普通にセッティングすると右のようなゲイン特性になります。



左のゲイン特性だと、高いとこは6dBを越えるし、山谷が平坦ではありません。

できるだけ、希望のゲイン特性にするためには、すこしゲインをいじらなければなりませんが、これを自動的に行う補正ソフトの実現を検討しようかと思っています。

かなり山谷が平坦になっているとおもいます。何よりもゲインが高くなりすぎません。

ちょっと計算してみましょう! 2020.1.9

 考え方が正しいか、ちょっと計算してみましょう。
まずはイコライザの特性を測定します。単純に1kHzで6dB上げるようなフィルターを設定します。ここでのQ値は2.4としました。
実際の測定は、FESP5142にパラメトリックイコライザのソフトをDLしてゲインフェーズアナライザで測定しています。
そうすれば、細かいデータをとることができます。

まずは測定したデータがこれです。6dBアップなので1kHzのところでゲインが6dBあがっていますね。
ただ、dBではあとあと計算ができないのでリニアに変換します。

まずは1kHzで6dB(Q-2.4)での特性を調べました。

リニアに変換したらこんな感じ(下図)になります。あまり変わらないですね(笑。
で、何を調べたかったかといえば、このゲイン特性の裾野の広がりです。
隣接するフィルタにどの程度影響があるかをまずは調べます。

隣接する素子への影響を調べるため、一旦リニアに振幅を変換します。

24素子のグラフィックイコライザで周波数を20Hz〜20kHz(1000倍)で比例分割すると、隣との周波数の比は
10^(3/23)になります。1kHzだったら、両隣は741Hzと1350Hzですね。
で、両隣の影響を調べたのが下の表です。この表からわかることは、1kHzの素子のゲインを1だけ変更したら、
両隣の素子への影響は0.23ないしは0.24あるということです。さらに、その隣の素子にまで0.05、0.06の影響が
あります。まあ5,6%なのですほっとくこともできそうですが、チリもつもればなんとやらで、無視できないかもしれません。
 ちなみに、本来は影響度合いは両隣とも同じになりますが、わずかに非対称になっている原因としては、
実測なのもありますが、切のいい周波数の値を拾えなかったので数Hzずれている値を採用したことが原因でしょう。

周波数(Hz) 振幅 ゲイン(dB)
406 1.01 0.11
548 1.06 0.47
741 1.23 1.80
1000 2.00 6.02
1350 1.24 1.85
1823 1.06 0.51
2462 1.02 0.14

隣の素子への影響を調べてみました。

さて、この影響度の調査結果をもとに影響マトリックスを組み立てます。組み立てるほどのことはなく、2つ隣の素子までの影響を考慮した
単純なバンドマトリックスです。ちょうど幅5のマトリックスになります。

影響マトリックスを組み立てます。

逆行列をもとめる
 これはエクセルをつかえば簡単に求めることができました。使い方はネットを調べると一杯でてきますが、キー操作にちょと小細工がいるようです。
逆行列(下図)も影響マトリックスと同じ程度で、幅7のバンドマトリックスになります。そりゃ、そうですよね。ちなみに、両端の成分は-0と0.02ですから
割愛してもいいかもです。そうすればバンド幅3になるので、格納するメモリーの容量もかなり節約できそうです。それに、マトリックス内の数値は
ほぼ同じ値の並びですから、数個覚えるだけでよさそうです。


逆行列をもとめました。

さて、逆行列がもとまったので、先の設定の例で+6,-6dBの段差のついた設定をしてみましょう。
もとめた結果は下表のようになります。面白いのは、設定したい範囲の
外側にも係数がはいることですね。これが入ることで、より段差部がシャープになるということでしょう。

素子NO 実現したい
ゲイン特性
(dB)
設定値
(dB)
0 0 0.0
1 0 0.0
2 0 0.0
3 0 0.0
4 0 0.2
5 0 0.1
6 0 -2.4 エッジを立てるために入っている。
7 6 5.3
8 6 4.1
9 6 6.5
10 -6 -6.4
11 -6 -4.1
12 -6 -6.4
13 6 6.5
14 6 4.1
15 6 5.3
16 0 -2.4 エッジを立てるために入っている。
17 0 0.1
18 0 0.1
19 0 0.0
20 0 0.0
21 0 0.0
22 0 0.0
23 0 0.0

残念なことに
 本来設定すべきは0.1dB単位になりますが、現在製作中のグライコのゲインの調整は0.5dB単位なので、
近似値での設定になります。実際にソフトに組込むなら、ぎりぎりの値まで追い込みたいですね。
どうせ計算はCPUがやってくれますから。


算出結果をもとに、こんな形でゲインを設定しました。

実行結果は
 予想通り、かなり段差が明確になったと思います。ちょっと平坦部のリップルが残っていますが、
これは適当な値を設定したためかな?と思いきや、上の画面を確認するとQ値が3.02になっています。
本来は2.4にすべきなのに・・・・、間違えました。

ちょっと平坦部に段差が付いています。あ、Q値を間違えている!

気を取り直して・・・再測定
 もう1回配線を組みなおさないといけないのは面倒だな〜と思いながら再設定です。
再測定の結果ですが、平坦部がより平坦になりましたね。やはりQ値を間違えるとだめです。


Q値を2.39に設定して再測定です。いい感じになりました。


ちゃんとQ値は2.4に戻しています。設定値をセーブしておいてよかった〜。
一から入れると面倒ですからね。


まだまだ
まだまだ追い込むところはありそうです。というのも、24素子の周波数の割り当てですが、
現在は表示のことを考えて、きりのいい数字に丸めていますが、それはあまりよろしくありません。
正確に、等比間隔になっていなければなりません。
 まあ、計算は正確に、表示は近似値でというやり方もありますが、ちょっと不当表示みたい(笑。

素子NO 本来の設定周波数
(Hz)
丸めこんだ周波数
(Hz)
0 20 20
1 27 27
2 36 36
3 49 50
4 66 67
5 90 90
6 121 120
7 164 160
8 221 220
9 298 300
10 403 400
11 544 550
12 735 730
13 992 1000
14 1340 1300
15 1809 1800
16 2443 2400
17 3299 3300
18 4455 4500
19 6016 6000
20 8123 8100
21 10969 11000
22 14811 15000
23 20000 20000

期待した結果を出すためには周波数も正確に取り扱わないと・・・

課題は色々

さて、このゲインの補正方法を実際のソフトに組込むとなると、色々と課題がありますが
一番大きなのは処理時間の問題です。いままでは、1個の素子のゲインを変えれば、その部分のみ
定数を計算して設定すればよかったのですが、この補正方法をいれると前後も含めて5倍の素子
の再設定が必要になります。それと、補正係数の演算として実数演算が増えてしまいます。
計算時間も問題ですが、素子への設定のために大量のI2C通信が増えるのが問題です。
まあ、気になるほど遅くなるとは思えないけど、ちょっとレスポンスが遅くなるかもです。

あとは、ROMメモリー容量だな〜。すでに91%までメモリーをつかっているので、入るかな〜。
もうパラメトリックとの併用はあきらめようかな〜。

現在は振幅の重ね合わせだけで考えていますが、本来は位相も考慮すべき次項です。
ただ、位相を考えるとなるとフィルターの特性を完全にシミュレートできる環境をPICの
中にいれる必要があるので、まず無理でしょう。まあ、いまのところいい結果がでているので
位相の問題は顕在化してないようです。まずは無視でいきましょう。

まあ、組めるところまで組んでみましょう!!

難航中・・・・(愚痴モード
 本筋と違うところでソフト開発難航中・・・
  ・コンパイラのエラーと思われる現象が発生中・・・人のせいにしちゃいけないと思いつつバグがみつからない・・・。
  ・表示器の選択ができるようにするのが、思いっきり面倒(ST7920一本にしとけばよかったと後悔)。
   なんせ、秋月GLCDとST7920のGLCDでは、画面メモリーの行と列が反対なんだもん!(怒

   回転の鈍い頭をひねりながら、奮闘中です。

  明日もあるし、早く寝よ!

ようやくリフトオフ?

なんとかバグ取りも進み、ひととおり動作している雰囲気になってきました。
勿論、意地悪テストをすればぼろぼろになりそうですが・・・・

大きな変更は一つのプログラムの中にパラメトリックイコライザーとパラメトリックイコライザーを押し込んで、
どちらかを選択できるようにしました。メニュー画面から選択して、ダイナミックに切り替えることができます。
設定値のメモリーも、それぞれに独立して3個づつ設けました。EEPROMが1kBあるので助かりました。
結構グラフィックイコライザーの場合は設定が多いですから。


プログラムの中で、パラメトリックとグラフィックの選択ができるようにしました。

もう一つの改造点は、今回のメインポイントになりますが、グラフィックイコライザでのゲインの自動補正機能をつけたことです。
ここでは「ADAPTIVE」という単語を当てはめています。ひょっとして用語の意味からすこし間違っているかもしれませんが、まあ雰囲気です(笑。


アダプティブモードを追加しました。これをアクティブにするとゲインの補正を自動で行います。

操作としては、普通にゲインを各周波数ごとに設定すればいいのですが、裏ではそのゲイン設定になるように、
各イコライザ素子の設定値を計算して割り当てるようにしています。そのため、画面にでている数値と、実際の
フィルターの値jは異なります。
 でも、どのような値が振り当てられているかを確認できるように、SW4を押すと実際の設定値が表示されるようにしました。

    
これが操作画面で各周波数のゲインを設定します。    こちらは、実際にフィルターに設定される値です。

操作性についても、とくに問題にはならなかったようです。流石にPICも64MHzで動かせば、結構な処理速度を発揮してくれます。
ただし、演算に対数(LOG)を追加したこともあり、プログラム容量が一気に膨れあがり、ちょっと前まで91%でしたが、
現時点で97%までになりました。もう、ここらが限界です。これから、最終の仕上げをするとまだ若干増えそうです。

まだまだ定数の追い込みがこれからですが、効果の確認とバグだしです。

効果確認テスト

通常モード Q=2.39で固定 スイープ100Hz〜10kHz アダプティブモード Q=2.39で固定 スイープ100Hz〜10kHz

1kHzを中心に3素子を+6dBに設定。この場合、中心(1kHz)で信号の重ね合わせてでゲインが設定値より上昇。
約9.5dBの最大値となる。



左の場合のアダプティブモード。ゲインはほぼ6dB。波形の角もたっている感じ。


1kHzを中心に3素子を+6dBに設定。その両側3素子を-6dBに設定。
ゲイン変化点の角が甘いのと、ゲインが高め。




左のアダプティブモード。
ゲイン変化点の角も比較的急峻。




1kHzを頂点に+8dBに設定し、徐々に-2dBずつ周辺の素子を落とす。
測定結果ではゲインが+12dB以上になっている。


左のアダプティブモード。全体のゲインは低めに設定されています。
ゲインの最大値は約8.6dB。ちょっと高い?けど、ノーマルモードよりは正確。

とまあ、こんな感じです。なにより、ノーマルモードだと設定ゲインより、どんどんトータルゲインが高くなるのでDSPの飽和が心配ですが、
アダプティブモードだと安心してゲインが上げられるのが便利かもしれません。

このテストの最中に山ほどバグがでてきました・・・・

バグの一部。アダプティブの計算ができていない場合がある・・・どこだ?

さて、三連休はウーハも届いたことだし、スピーカをつくりを再開かな?

バグ取り完了? 2020.1.12

まずは操作面で不具合がでるようなことはなくなった気がします。
本当かな?
すこし、これからしばらく実戦に使って、使い勝手等の確認です。

ほぼほぼ完成? 

バグだしと同時に色々と手を加えました。

・周波数テーブルは20〜20,000Hzで完全に等比になるように配分。
 これはグラフィックイコライザでのアダプティブモードでの動作をより正確にするためです。

・メモリー設定を3つから4つへ増設
 常用のスピーカがメイン(3WAY)、サブ1(2WAY)、サブ2(フルレンジ)の3つあるのと、
 フラットな特性にも切り替えられるように4つにしました。これで、ほぼほぼEEPROMは使い果たしました。
 
 メモリーを4つに増やしました。

・表示を充実
 グラフィックとパラメトリックイコライザの相互変更時にはノイズが出るかもしれないので、
 一応注意文を付加しました。無視すると思いますが・・・。
 
 注意文を入れたり・・・・無視するだろうな〜

・フィルータ設定モードで、メモリーのロードが行えるように追加
 これで、フィルータの設定状態を次々に簡単に変更できるようになります。
 フィルータの設定状態と音の変化を感じるのに便利です。
   
  次々と設定を変更して、音の違いを楽しめます。ユーミンだと結構ボーカル強調がよかったな〜。

いろいろとプログラムを追加するとどんどんメモリーを圧迫してきて、途中で98%まできましたが、
DSPデータの共通化とアダプティブモードの計算方法の見直しをして最終的には93%まで、
容量が減りました。大きな要因はアダプティブモードの計算方法の見直しで、最初は計算のために
数値をリニアにしたのち、計算後にdB(対数)に変換してました。そのため変換に対数(LOG)計算が必要で、
サブルーチンの追加が必要なため一気にメモリーを圧迫していました。しかし、考え直すとリニアに変更する必要がないことがわかって、
dBのままでの計算で事足りることがわかりました。そこでLOGの計算を削除することで、大幅にメモリーの削減ができました。

ゲインフェーズアナライザーで特性を測っておきましょう

いままで、特性はオシロの画面で主に確認していましたが、定量的に把握するためにゲインフェーズアナライザで
測定しておきました(下表)。こうやって、確認するとグラフィックイコライザではアダプティブモードは絶対必要と感じてしまいました。
まあノーマルモードでもQ値が低いので、さほど凸凹はないですからゲインの誤差に目をつむればそれでもいいかもしれません。

設定値 ノーマルモード(Q=2.45〜2.93) アダプティブモード(Q=2.4)

■点は設定値

■点は設定値                         海豚発見!↑

■点は設定値

■点は設定値

ただし、ノーマルモードでゲインを優先してQ値を高くすると下表のようになってしまいます。
小さい帯域の中で4dB程度の変動が生じてしまいます。狭い領域での細かい変化は聴感上で違和感を感じるかもしれないし、
4dB程度ならわからないかもしれないですね。
 まあ、アダプティブモードは拘りということになるのでしょうか(そんなこと言ったら、オーディオなんてすべて拘りですが・・・・
拘りがなければ、今頃ラジカセで満足しているかもしれません。ん??? ラジカセってもう死語なんじゃなかろうか?)

設定値 ノーマルモード(Q=4.19)


とりあえず完成!

 これで、また一つ音楽の再生を楽しみにするオモチャが増えました!
実際に使ってみて、あまりの音の変化にびっくりします(当たり前ですが)。
とくにメインの3WAYスピ−カですが、ボーカル域を上げてやると、俄然色気がでてきました。
ネットワークでいじると、かなり広い帯域全体をいじることになります。ミッドレンジはおよそ
400〜4kHzと3オクターブ以上を受け持っていますが、普通の歌曲なら2オクターブもないでしょう。
その狭い領域の調整がグライコやパラメトリックだと可能になってきますからね。

まだまだ改善? 2020.1.13

SPDIFのケーブルを延ばして、布団の中に持ち込んでヘッドホンとともに寝る前に弄って遊びました。
やはりヘッドホンだと、音の変化がわかりやすいです。やはり音楽に集中できるからなんでしょうね。
で、色々と弄っていると、やはり操作性の改善点がみつかってきます。

・グループ選択は電源を切る前に復帰
 やはり、このGEQのメインの画面がフィルターの設定であることを考えると、最初からグライコの画面になるべきだな〜と。
 ということで、グループ画面は電源を切っても保持するようにしたほうが良さそうです。

・セーブも簡単に
 データのロードは簡単にできるようになりましたが、同時にセーブも簡単にできるようにしたほうが良さそうです。
 ロードはフィルター設定画面で、SW4を押すと、設定値1→設定値2→設定値3→設定値4→設定値1→・・・と
 次々と簡単にできますが、セーブはいちいちグループ画面を変える必要があります。フィルータ設定画面の中で
 セーブができると簡単です。ということで、SW1を押しながらSW4を押すと、セーブするようにしました。
 ただし、どこにセーブするかは指定する必要があるので、ロータリーエンコーダ(Q値用)で設定です。

 
フィルタ設定画面から、データのセーブができるコマンドも追加しました。お気に入りの特性をその場でセーブです。



・パラメトリック→グラフィックイコライザ切り替え時のノイズ抑制
 パラメトリックイコライザからグラフィックイコライザに切り替えるときに、命令コマンド書き換えによりすこしノイズがでましたが、
 書き換え最中はPCM9211のデータを強制的にMUTEにしてノイズを押さえました。PCM5142もデータが来なければ
 おとなしくするでしょう(笑。

もう、煮詰まったかな?


あらためてv2になりました

制御ソフトのバージョンが2になりました。それにしても、40PのPICだと
貼付するシールにも色々と書けます。

制御ソフトが新しくなりました。

操作マニュアルも作成しました: FESP5142PEQ_GEQ_v2Manual.pdf

(つづくかな?)