RIAAフォノイコライザをIIRデジタルフィルタで実装する ④実装・評価編
写真1.今回試作したデジタルIIRフィルタによるRIAAフォノイコライザ
CQ出版社のMAX10基板を搭載したSSDAC試作基板をベースに試作した。
いよいよ実際にFPGAに実装して、性能評価を行う。
FPGAのVHDLソースの公開はしないが、開発の肝になる部分を書いておく。
●参考書
①トランジスタ技術2018年10月号
この号には田力基さんの記事で、FPGAを使ってI2S信号をパラレルデータに直してからAD1860というDACデバイスのシリアルフォーマットに変換する手法が紹介されている。この中から、I2S→パラレルデータの部分を使って、I2S出力のA/Dデバイスから取り込んだデータをパラレルに変換して、IIRフィルタに送る。
②「実践 ディジタル・フィルタ設計入門」岩田利王著
この本には、VHDLでFPGAにデジタルフィルタを実装する例題が載っているので、上の①で取得したパラレルデータをIIRフィルタにかけるためのコードを書いて、係数をRIAAに差し替えれば目的にかなう。
●迷いどころ
前回の係数計算で出てきた、a1=-1.866859545と1個過去の出力データy(n-1)のかけ算!?
これってどうやるんだろう?浮動小数点??そんな計算VHDLでできるのか???
これは上の②の書籍にも書かれているが、たとえば24bit精度で計算するとしたら符号付きなので1ビット減、1を超えているのでさらに1ビット減じて、22bitつまり2^22=4194304を1として計算してやればよい。またa1,a2は
-a1・y(n-1) -a2・y(n-2)
のように引き算として出てくるので、あらかじめ符号反転しておいて、実際の演算では足し算とする。
a1=-1.866859545
これを符号反転して
1.866859545
としておいて、2^22=4194304を1として計算すると、
4194304*1.866859545=7830176
これを2進化すれば
0111 0111 0111 1010 1010 0000
となる。
a2=0.86728426
これを符号反転すると
-0.86728426
まず符号を取った状態で2進化する
4194304*0.86728426=3637653
2進化すると
0011 0111 1000 0001 1001 0101
2の補数表現でマイナスにする(全ビット反転してから1を足す)
1100 1000 0111 1110 0110 1011
b0,b1,b2は足し算なので、符号反転する必要はない。そのまま変換する。
これらの係数の精度が24bitで、かけ算するデータも24ビットなら、かけ算の結果は48ビットになる。
全部の計算が済んだら、必要なビット数に丸めてやる。おおざっぱに言うと、たとえば計算結果48ビットを16ビットに丸めて出力したいなら、下32ビットを切り捨てればよい。これは小数点計算で必要桁数以下を切り捨てるのと一緒で、少数点があるかないかだけの違いだ。
それからもう一点。
「実践 ディジタル・フィルタ設計入門」のIIRフィルタの例題のVHDLコードに1箇所重大な間違いがある。
MuxIir.vhd
の129行目
HnXn_20b(i) <= HnXn(i+11);
は、間違いで、正しくは
HnXn_20b(i) <= HnXn(i+12);
だ。ここがちがっていると正しい結果が出ないだけでなく、シミュレーションすらできなくなるので注意が必要だ。
迷いどころはこれくらいだと思う。
●試作回路
ダウンロード - 20201030digitalriaa_max10.pdf
興味のある人はダウンロードしてご覧ください。
ADCは秋月で売っているPCM1808を使用した。これは最大96kHz 24bitのADCだ。今回はRIAAの原理試作なので入力アンプは付けていない。後述するが、カートリッジの信号をどれくらい増幅するかはなかなか難しい問題だと思う。
PCM1808からデジタルアイソレータADUM1400を介してI2S信号を送っているが、おおもとの電源が共通なのでほとんど意味がない。これは流用したSSDAC試作基板において、amaneroのI2S信号をisolateしていたときの名残だ。
Max10はCQ出版のMax10スーパーキットの付録基板を使用している。
DACデバイスは16bitのマルチプライングDAC、DAC8822を使っている。せっかくRIAAをデジタル化しても、再生時にDACのオーバーサンプリングデジタルフィルタを通過してプリエコー、ポストエコーが付いてきたのではレコードを聴く意味がないので、サンプルレートを高く取るか、スーパーサンプリングするかして、オーバーサンプリングデジタルフィルタを介さずにマルチビットDACで聴く、というのが妥当な選択肢なのではないかと思う。
●仕様
・サンプリング周波数:96kHz
・ビット深度 :24Bit
・出力 :アナログステレオおよびI2S
☆測定結果
図11~図14に入出力の波形を、表8に各周波数のゲインと誤差を示す。
図14.20kHz入出力波形
表8.各周波数のゲイン誤差
表8に示した周波数ごとのゲインは、出力が飽和する限界のレベルで測定している。出力レベルの飽和はおよそ4.5Vp-p(1.6Vrms)なので、将来このデータをもとに、適切なプリアンプのゲインを決められるのではないかと考え、そのような条件で測定した。
測定はオシロスコープで波形を表示し、カーソルで振幅を測定する方法で行った。表中、RIAAがRIAA規格による理論値、Errorが理論値からの誤差だ。
20kHzで誤差が0.5dB程度になるのは前回のシミュレーションと一致していておもしろい。そこでふと思ったのは、高域で持ち上がる特性は、アパーチャ効果と逆なので、もしかしたらアパーチャ効果によるレベル低下が相殺されるのではないか、ということだ。ためしに96kHzサンプリングの場合の各周波数でのアパーチャ効果を計算し、差し引いてみた。表でApertureEffectと書いてある列がアパーチャ効果による減衰レベル、いちばん右列の(E)+(A)が測定結果にアパーチャ効果による減衰を加味した誤差だ。
期せずして結果としてかなり高精度になっている。おもしろい発見をしたと思う。
今回はVHDLとFPGAの練習なので、ついでに結果をI2Sで出力する回路も書いてみた。I2S出力波形を図15に示す。ちゃんと出ているようだ。
図15.I2S出力波形
上からLRCK、DATA、BITCLK
●試聴
今回はプリアンプを付けていないのでカートリッジからのレコードの生再生はしていないが、以前ソフトウェアRIAAと、LTSPICEによるCR型RIAAイコライザのWave波形シミュレーションを行った際に使ったDL103生録音データがあったのでそれを聴いてみた。これはDL103の出力をオペアンプで160倍で増幅し、SoundBlaster PremiumHDを使って録音VR最大でWav録音したもの。当時CDとの聴き比べをする目的だったため、データは44.1k、16bitで少し物足りないものだが、それでも素直なアナログレコードの特徴は聴き取ることができた。
160倍の増幅はhttps://fixerhpa.blog.fc2.com/blog-entry-221.htmlを参考にさせていただいて、サウンドブラスタの入力感度がフルビットで1Vrmsであることから決めた数字だ。ただ今回の評価では少し録音レベルが低いような印象があった。アンプの増幅レベルは再考が必要だと思う。
参考のため、DL103から160倍でリッピングしたデータをリンクしておく。
●まとめ
今回はデジタルフィルタと、VHDLによるFPGAへの実装の勉強がてらRIAAイコライザをデジタルフィルタで設計し、FPGAに実装するという目的を達成した。これまで、CPLDやFPGAを、実験用の回路で汎用ロジックの代わり程度でしか使ったことがなかったが、FPGAの真価は、ストリーミングデータのリアルタイム処理などで発揮されるのだと実感できた。
デジタルRIAAは将来、実用レベルで製作してみたいと思う。今回ADCは部品箱に入っていたPCM1808で96kHz、24Bitとしたが、ちゃんと作るならせっかくなので192kHz、24Bitまで対応してみたい。再生系はSSDACでスプライン補完をしてマルチビットDACで出力すれば完璧だと思うが、そもそもレコードをよい音で聴きたいという目的であれば、アナログでCR型イコライザを通して聴けばいいだけの話なので、そこまでデジタル化に手間暇とお金を投入する意味はない。(コンデンサはAPSで十分なのか、オレンジドロップがいいのか、WIMAがいいのか、双信のディップマイカなのか、それとも思い切ってSE!?という悩み(あるいは楽しみ)からは解放されるかもしれない)
ただ、デジタルRIAAは今回のような練習や、興味のためにはとてもおもしろいテーマだと思う。
以上で「RIAAフォノイコライザをIIRデジタルフィルタで実装する」プロジェクトは一旦終了します。
お付き合いありがとうございました(^-^)
2022/2/22
続編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ⑤Octaveによる位相検証
を書きました。ご参照ください。
| 固定リンク | 0
« RIAAフォノイコライザをIIRデジタルフィルタで実装する ③シミュレーション編 | トップページ | SSDAC(Super Sampling D/A Converter)の新しい可能性について »
コメント