« 2020年9月 | トップページ | 2020年12月 »

2020年10月

2020年10月31日 (土)

RIAAフォノイコライザをIIRデジタルフィルタで実装する ④実装・評価編

Digitalriaa
写真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に各周波数のゲインと誤差を示す。


Tek0022
図11.20Hz入出力波形

Tek0021
図12.1kHz入出力波形

Tek0023
図13.10kHz入出力波形

Tek0024
図14.20kHz入出力波形


表8.各周波数のゲイン誤差
Kekka

表8に示した周波数ごとのゲインは、出力が飽和する限界のレベルで測定している。出力レベルの飽和はおよそ4.5Vp-p(1.6Vrms)なので、将来このデータをもとに、適切なプリアンプのゲインを決められるのではないかと考え、そのような条件で測定した。
測定はオシロスコープで波形を表示し、カーソルで振幅を測定する方法で行った。表中、RIAAがRIAA規格による理論値、Errorが理論値からの誤差だ。

20kHzで誤差が0.5dB程度になるのは前回のシミュレーションと一致していておもしろい。そこでふと思ったのは、高域で持ち上がる特性は、アパーチャ効果と逆なので、もしかしたらアパーチャ効果によるレベル低下が相殺されるのではないか、ということだ。ためしに96kHzサンプリングの場合の各周波数でのアパーチャ効果を計算し、差し引いてみた。表でApertureEffectと書いてある列がアパーチャ効果による減衰レベル、いちばん右列の(E)+(A)が測定結果にアパーチャ効果による減衰を加味した誤差だ。
期せずして結果としてかなり高精度になっている。おもしろい発見をしたと思う。

今回はVHDLとFPGAの練習なので、ついでに結果をI2Sで出力する回路も書いてみた。I2S出力波形を図15に示す。ちゃんと出ているようだ。

I2s_2 
図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デジタルフィルタで実装する」プロジェクトは一旦終了します。
お付き合いありがとうございました(^-^)

| | コメント (0)

2020年10月26日 (月)

RIAAフォノイコライザをIIRデジタルフィルタで実装する ③シミュレーション編

前回まででRIAAイコライザをIIRデジタルフィルタに実装するための係数が計算できた。
今回は計算した係数でRIAAイコライザの特性がちゃんと得られるかどうか、シミュレーションを行い確認する。

まずはEXCELによるシミュレーション結果から。

表5.双一次変換法(上)とインパルス不変変換法(下)による係数のシミュレーション(96kHz)
Bilinear_impulse96_20201026172001

これは前回のブログで紹介したものの再掲だ。96kHzサンプリングで双一次変換とインパルス不変変換それぞれの係数計算結果によるもの。
上の段が各係数、下の段が各周波数ごとの理論値からの誤差だ。振幅特性を見る限りインパルス不変変換のほうがほんの少しだが良い結果になっている。

次に、サンプリング周波数48kHzの場合。

表6.双一次変換法(上)とインパルス不変変換法(下)による係数のシミュレーション(48kHz)
Bilinear_impulse48_20201026172001

サンプリング周波数48kHzでは10kHzを超えたあたりから徐々に振幅特性に誤差が増え始め、20kHzではおよそ+2.3dBの誤差が出ている。デジタルフィルタではナイキスト周波数(サンプリング周波数の半分)に近づくほど誤差が多くなる。これを回避するにはサンプリング周波数を上げるか、補正する特性を持たせる。

こんどはネットで見つけてきた係数。Githubのフォーラムでmoc.liamtoh@0691_ptj氏が投稿したもの。

表7.Githubで見つけた係数によるシミュレーション(上:48kHz 下96kHz)
Github_moc_48_96_20201026172001  

この係数は誤差が非常に優秀で、48kHzサンプリングにおいても20kHz信号の誤差が0.035dBとなっている。係数を見るとb2が存在しているので、特性の補正用に一段追加しているようだ。
補正項を追加すればポールが増えるので位相特性も変わってくるが、そのあたりはどのように考えるのか、今後機会があれば検討してみたい。

経験的に、耳で聴いて変化がわかる最小音圧レベルはおおよそ1.5dB程度なので、2倍の余裕をみても0.8dB程度に収まっていれば問題はないのではないかと、個人的には考えている。

以上の誤差の評価はEXCELでのシミュレーションによるもの。やりかたは次のとおり。
まず、評価したい周波数(20Hz,100Hz,1kHz,10kHz,20kHz)のサイン波のデータを作成する。
今回は4800サンプル分のデータを使用した。サンプリング周波に応じてサイン波を生成する。

①A行に0~4800のセルを用意
②B行にA/サンプリング周波数(たとえば96000)→サンプリング単位時間
③C行に20Hzのサイン波を生成するとすると、SIN(2*PI()*20*B)

これを4800までのセルに順送りすれば、サンプリング周波数に応じた任意の周波数のサイン波のデータが生成される。
これらのデータを今回生成した係数を持つRIAAイコライザに通すには、
Yn ・・・式18
を上で生成したサイン波のデータに対して順次計算すればよい。
x(n)が現在の入力データ、x(n-1)がひとつ過去の入力データ、x(n-2)がふたつ過去の入力データ、y(n-1)がひとつ過去の出力データ、y(n-2)がふたつ過去の出力データで、これらについて上の式の計算を施して、現在の出力y(n)を得る。
注意することは、最初のデータを処理する時点では過去のデータがないので、初期値として過去2つ分のデータとして0を与えてやる。これはハードウェアに実装する場合にも注意が必要だ。値が不定だとエラーになったり誤動作したりする。

簡単なので各自自力で試してみてほしい。

次に、フリーソフトのAudacityをつかったシミュレーションについて説明する。

Audacityは音声編集ソフトだが、デジタルフィルタの係数を入れるとシミュレーションを行い、スペクトル表示や数値のテキスト出力ができる。たとえば上で紹介した96kHzサンプリングの双一次変換法による係数を入れると次のようなシミュレーションができる。

Audacity1
図9.Audacityによるシミュレーション スペクトル表示



Audacity2
図10.Audacityによるシミュレーション テキスト出力

 

使い方は簡単で次のとおり。

①Audacityを起動
②左下ペインでプロジェクトのサンプリング周波数を選ぶ。上記の場合は96kHzなので96000。
③ホワイトノイズを生成する。ジェネレータ→ノイズ→white、Amplitudeは0.1とする。(大きいと係数によっては飽和してしまう)
④ctrl+Aで波形を全部選択
⑤道具箱→Nyquistプロンプトで
(biquad-m s 1 -0.96777105 0 1 -1.866859545 0.86728426)
と入力。数字は係数b0,b1,b2,a1,a2をスペース区切りで入力。スペースとカッコもすべて半角。
⑥OKを押すとシミュレーションされ、波形が変わる。
⑦解析→スペクトル表示で図9のスペクトル表示ができる。
⑧スペクトル表示窓の「書き出し」を押すと、図10のテキスト出力ができる。

注意点は、②のサンプリング周波数設定と④の波形全部選択を必ずやること。
テキスト出力は周波数が整数で出てくれないところがちょっと使いにくいが、それでも非常に便利だ。
各周波数ごとのゲインの理論値は

Riaa_formura_20201017230801・・・式9

なので、この式を使えば、Audacityの出力した周波数のゲインの理論値が計算できるので、EXCELを使えばエラー表が作れる。


「RIAAフォノイコライザをIIRデジタルフィルタで実装する」プロジェクトの理論はこれでおしまいです。
おつかれさまでした。

| | コメント (0)

2020年10月25日 (日)

RIAAフォノイコライザをIIRデジタルフィルタで実装する ②係数計算編

前回はRIAAフォノイコライザの概念と、アナログで実装する場合の復習をした。
今回はいよいよRIAAフォノイコライザをデジタルフィルタに実装するための計算に入る。

 

1.デジタルフィルタとはなにか

アナログ信号が時間的に連続な信号であるのに対して、デジタル信号は時間的に離散している信号だ。つまりアナログでサイン波は時間軸に対してなめらかな正弦波だが、これをデジタルで表現すると、サンプリング周期ごとに値が1つずつ出てくる。たとえばCDに1khzのサイン波が入っているとすれば、CDのサンプリング周波数は44.1kHz、分解能は16bitなので、1/44100秒ごとに-32768(1000000000000000)~32767(0111111111111111)の範囲の値がひとつ出てきて、これを並べてやると飛び飛びの点だけど、1kHzのサイン波が点描されるというわけだ。つまりデジタルで表現されるデータは、サンプリング周期ごとに出てくる数を並べた数列になっている。

毎朝ベランダの温度を記録しているとする。日によっては急に寒くなったり暑くなったりすることがあるので、たとえば半年間、毎朝の温度をプロットしてグラフを描くと、かなり細かくギザギザしてしまう。これを、全体のおおきな変化傾向だけ見たいのでギザギザを減らしたいとしたらどうしたらいいだろうか。たとえば当日を含む過去10日間を足して1/10すれば、常にその日を起点とする過去10日間の平均が得られて、一日の影響度は1/10に抑えられるので、グラフの細かいギザギザが減る。
これを移動平均フィルタといい、デジタルフィルタの考え方の基本だ。(細かなギザギザがなくなったということは、高い周波数成分がカットされたことになるので、これはローパスフィルタだと考えることができる。)
この例を上のサンプリング時間ごとの値という考え方に当てはめれば、一日に1個のデータが出るので、サンプリング周期は一日ということになる。気温のデータ分解能は、-50~50度の範囲を8ビット(0~255)で表わすとすれば、100/256=0.39つまり、0.39度の分解能で表現される。

つまり、CDから16ビットの音楽データが1/44100秒ごとに1個出てくるのも、8ビットのベランダの温度データが一日に1個出てくるのも、現象としては同じなのでとくにむずかしいことはない。

上の移動平均フィルタの例では、最新のデータを起点とする過去10個の入力データを10で割って平均したものを出力とした。言い換えると、過去10個のデータそれぞれを1/10倍して足し合わせているともいえる。過去のデータは10個に限らず何百個でも何千個でもいいし、それぞれにかける係数も1/10に限らず必要に応じて決めてやると、さまざまな特性のフィルタが構成できる。このような構成のフィルタをFIRフィルタという。FIRフィルタの特徴は直線位相特性を持ち、群遅延が全周波数で一定となること、つまりあらゆる信号に対して常にサンプリング時間の遅れでデータが出力されるということだ。

FIRフィルタでは常に過去の入力データのみに係数を掛けて足し合わせているが、そこに過去の出力データにも係数を掛けて足し合わせる、という処理を加えたらどうなるだろうか。これをIIRフィルタといい、FIRにくらべて少ないデータ数で構成でき、アナログで構成したフィルタ回路と等価的に置き換えることができる。もちろん位相特性も再現される。

以上がものすごく大ざっぱなデジタルフィルタの説明だ。くわしくは専門書を参照してほしい。

 

さて今回のミッションは、アナログレーコード再生に使うRIAAイコライザ回路のデジタル化だ。RIAAイコライザも一種のフィルタなので、デジタルフィルタで再現することができる。

前回の記事で書いたが、レコードは逆RIAA特性で録音され、再生時はその逆の特性で再生する。つまり、

Trec・・・式16

Tplay・・・式17

式16で示される逆RIAAの特性で録音されたレコードを式17で示されるRIAA特性で再生されることで、特性が1(フラット)になるということだ。特性というのは振幅特性と位相特性の両方が含まれているので、当然のことながら位相も逆特性になっている。

(注)録音時の式16は、おそらく実際には高域の制限がかかっているので正確ではないが、便宜上このように考える

位相特性も含めて式17と等価なデジタルフィルタを再現するには、IIRフィルタで構成する。

 

2.IIRフィルタの構造

IIRフィルタのブロック図を図8に示す。

Biquad_block

図8.IIR(BiQuad)フィルタブロック図
IIRフィルタの中でも2つ過去までのデータを使う2次IIRフィルタを特にBiQuad回路と呼び、よく使われる

 

図8に示すのは2次IIRフィルタで、現在の入力データをx(n)、現在の出力データをy(n)とすると、2つ過去のデータx(n-2)、y(n-2)まで使用されている。原理的には n-3,n-4…というさらに過去のデータを使用する高次のIIRフィルタも構成可能だが、現実的には図示の2次IIRを必要に応じて多段構成にすることが多い。

図中z-1はz変換の遅延演算子で、z-1を乗じるごとにひとつ過去のデータとなることを示している。x(n)はz-1を一回経るとx(n-1)(ひとつ過去のデータ)、もう一度z-1を経るとx(n-2)となっている。出力データy(n)も同様で、y(n-1)はひとつ過去の出力、y(n-2)はふたつ過去の出力だ。それぞれのデータにそれぞれの係数-a1,-a2,b0,b1,b2が掛けられ、加算されて最新の出力データとして出力される。すなわち出力データy(n)は、

Yn・・・式18

この式はb0~b2、a1,a2が決まればこのままマイコンのプログラムやFPGAに実装できる。その場合、ひとつ過去、ふたつ過去のデータはバッファに格納しておいて、常に最新の入力データx(n)とともに演算して出力データy(n)を演算で求める。この形式の数式を差分方程式という。

式18から伝達関数を求めるには、Z変換を使う。Z変換は次のようになっている。

X_ztransfer

X2_ztransfer_20201024182201

x(n)のz変換をX(z)としたとき、2つ過去のx(n-2)のz変換はX(z)・z-2となる。とりあえずここでは、Z変換はそういう規則の書き換えだと思っておいてほしい。詳しくは専門書を参照のこと。

それでは式18の伝達関数Y(z)/X(z)を求めよう。

Yzxz

上記のように式18の両辺をZ変換して整理し、Y(z)/X(z)を求める。

Yzxz_0・・・式19

これが式18の伝達関数だ。ただし、b0を1に正規化することが多いので、実用的には

Yzxz_1・・・式20

としておくほうが便利かもしれない。
この場合の差分方程式は、

Xysabun_1・・・式21

こうすることで、最新の入力データx(n)をそのまま使えるので、伝達関数やコードが見やすくなる。
この場合、式20右辺の先頭に掛かっているb0は定数なので、省いてしまっても特性に影響はない。

伝達関数は、具体的には

Riaa_iir_ex0_20201025134601 ・・・式22

のように表わされる。これを見れば係数がすべてわかるので、直ちにハードウェアに実装できる。
この例では分子のz-2の項の係数は0なので書いていない。
慣れてくると、「ああこれは96kHzサンプリングのRIAAですね。」と、一瞥しただけでわかるようになる。(嘘)

 

3.フィルタ係数の計算

以上に書いたように、デジタルフィルタの設計とは、各係数を計算して求めることに他ならない。インターネットで探せばRIAAの係数はいろいろなところで拾ってこられるので、計算ができなくても作ることはできる。ただせっかくなので、今回は係数を求める計算もやってみる。

いきなり計算に入る前に、式17のRIAA伝達関数を見てほしい。この式では分母がsの2次式、分子がsの1次式になっている。伝達関数の見方として、分母=0を満たすsを「極」、伝達関数=0を満たすsを「ゼロ点」という。この式を見ると分母が2次式なので極が2つ、分子を評価すると一次式なのでゼロ点が1つだということがわかる。この極とゼロ点の個数はデジタルフィルタに置き換えても継承されるので、これから設計しようとしているIIRによるRIAA回路も分母が2次式、分子が1次式になる。(zの場合はマイナスなので、2次ならz-2だ)
つまりこれから求めようとしているRIAA回路は式22のような形になるはずだ。これを頭に入れておいてほしい。

注)この記事を書いている2020/10/24時点で、理解できていないところがあって、それも含めて以下の文章を書きます。いずれ理解が深まって解決したら、その時に追記する予定です。

 

3-1.双一次S-Z変換による係数計算

 

何度も出てきているようにアナログRIAAイコライザ回路の伝達関数をラプラス演算子で表わすと式17になる。

Tplay・・・式17

これをZ変換のz演算子で表現することが、このミッションの目的だ。
つまりRIAAの伝達関数を、ラプラス変換のsドメインからZ変換のzドメインに置き換えることだ。

Z変換は両側ラプラス変換を離散化したもので、Tをサンプリング周期とすると、Z変換におけるzとラプラス変換sは次のように対応している。

Z_vs_e_1

そしてこの置き換えから、次の式をラプラス変換領域の伝達関数に代入すればZ変換領域に変換できるとされている。

S_z_henkankousiki・・・式23

これは双1次s-Z変換法という、一般的によく使われる方法だという。だがまてよ、

Z_vs_e_2・・・式24

であるならば、

Z_vs_e_3・・・式25

となるはずだ。どうも納得がいかない、とあちこち調べてみたらこれは、e^xのマクローリン展開による近似式だそうだ。つまり

Maclaurin・・・式26

e^xのマクローリン展開は式26だ。そしてこの最初の2項1+xを使うと

Maclaurin_z_s・・・式27

となり、これをsのついて解くと式23になる。
それにしてもe^xのマクローリン展開をたった2項の1+xで打ち切るって、乱暴すぎないだろうか。誤差とかだいじょうぶなのかな。
ちなみに式25に出てくるs=logzは複素数の対数であり、これは多価関数なのでそのまま扱うのが困難なのだそうだ。

それでは教科書どおり式23で話を進める。

式17のRIAA伝達関数に式23を代入して、Z領域の伝達関数に変換してみる。ここではサンプリング周期Tに対し、サンプリング周波数Fsを、Fs=1/Tとして扱う。サンプリング周波数Fsは具体的には44100、48000,96000などのなじみのある数値だ。

Z_fs_s

Tplays_z Riaa_s_z_20201025130501 ・・・式28

かなり恐ろしげな式になってしまったが、恐れることはない。Fs,T1,T2,T3はすべて定数なので、電卓かEXCELで計算できる。
ただここで注目してほしいのは、分子にz-2の項ができてしまっている点だ。この章の冒頭で書いたとおり、いま求めているRIAA特性は極が2つゼロ点が1つの伝達関数になるので、分母が2次式、分子が1次式になるはずだが、上の計算では分子が2次式になってしまっている。これを書いている2020/10/25時点でわからない点だ。
ともあれ、式28で数値計算するとどうなるのか見てみよう。

T1~T3はRIAAの規格、サンプリング周波数は96kHzにしてみる。

Riaa96000input

この定数でEXCELで計算すると、

Zenkeisan0 ・・・式29

理由はわからないが結論だけを示すと、

Z2sakujo

つまり、z-1の項をネグってz-2の項をz-1にシフトすると、正しい伝達関数になる。これはすでに式22として示したのと同じものだ。

確認のためEXCELでシミュレーションしたところ、次のようになった。

 

表3.伝達関数 式22のシミュレーション結果
Simulation0_20201025141901

 

理論値(dB)がRIAAの規格から求めた理論値で、1kHzを0に正規化したもの、正規化(dB)がシミュレーション結果、エラー(dB)が理論値との差分だ。20kHzが最大誤差で0.537dB となっているが、実用許容範囲だと思う。

 

3-2.インパルス不変変換法による係数計算

もう一つ、一般的な変換方法として、インパルス不変変換法がある。

次のような1次ローパスフィルタ(積分回路)があるとする。

Sekibun_dentatsu・・・式30

これをインパルス不変変換法によってS-Z変換するには

Impulse_fuhen_henkan・・・式31

という置き換えを行う。ただしゲイン項(定数項)は省略してある。

今回の課題であるRIAA回路は次のように分解できる。

Riaa_bunkai・・・式32

つまりこれは積分回路2つとその逆数のハイブースト回路の積算であると見れば、式31を使って

Impulse_fuhen_sekisan・・・式33

と表現できる。

サンプリング周波数Fs=96kHz、T1=3180us、T2=318us、T3=75usとして計算すると、

Impulsefuhen_keisuu・・・式34

となる。

EXCELによるシミュレーション結果を表4に示す。

表4.インパルス不変変換、96kHzサンプリング
Impulse_fuhen_error

計算方法はシンプルだが、先ほどの双一次変換法よりも若干誤差が小さくなった。

 

☆次回は計算した係数やネットで入手した係数のシミュレーションなどについて書く予定です。

 

【参考文献】

はじめて学ぶディジタル・フィルタと高速フーリエ変換」 三上直樹 著

実践ディジタル・フィルタ設計入門」 岩田利王 著

 

【参考サイト】

デジタルフィルタードットコム-DIGITALFILTER.COM
理論や実装方法の記事、それに便利なソフトを配布してくれているありがたいサイトです。

Wyne Stegall HomePage
オーディオのページに、インパルス不変変換法によるRIAAイコライザのC言語での実装や、そのほかにもオーディオ技術関係の記事が多数あり、勉強になります。

Familie Beis HomePage
デジタル信号処理の詳しい説明があり、とても勉強になります。無料配布しているデジタルフィルタの設計解析ソフトが便利です。


| | コメント (0)

2020年10月18日 (日)

RIAAフォノイコライザをIIRデジタルフィルタで実装する ①準備編

コロナ禍待機中でヒマなので、いままであまりなじみのなかった、FPGAをつかったデジタル信号処理の勉強をしている。やはりここは、うまく動作すると音楽が聴けるという特典を付けると勉強も捗るのではないかと思い、ここ何年かトラ技でも取り上げられているFPGA、MAX10にIIRでデジタルフォノイコライザを実装する、という課題を通じて勉強することにした。

この企画を思いついて着手したのが9/30だったが、すでに10/14に試聴ができ、特性も確認した。いつものわるい癖で、現物を作るのは早いが理論が後回しになっているので、備忘録として記事を書いておく。

 

1.RIAAアナログフォノイコライザの復習

アナログレコードはCDとちがって音の信号がそのまま溝として掘られていて、この溝の振動を増幅して音にしている。実際にレコード盤に溝を掘る場合、低域の大振幅の溝を掘るのが物理的に困難だったり、高域の細かな信号のS/Nがわるくなったり、という問題を解決するため、レコードの録音(カッティング)は低域のレベルを下げ、高域のレベルを上げて行い、再生時にその逆の処理をして原信号に戻すということをしている。この処理はアメリカレコード協会(RIAA)によって規格が定められていて、RIAAフォノイコライザ特性といわれる。
フォノイコライザの規格はRIAAによって1950年代に統一されたということだが、当時IEC,Columbia,Decca,eRIAAなど複数の規格が乱立していて、レコード会社によって使う規格がちがうということが起こった。ただ現在われわれに縁があるレコード盤はほとんどがRIAAだろうと考えられるので、今回はもっとも標準的なRIAA規格のみを検討する。

★RIAAフォノイコライザ規格

レコード再生時のRIAAイコライザ規格は図1に示すような時定数になっている。

Riaa
図1.再生時のRIAA特性
RIAA特性は3つの時定数で定義されている。

 

図1は3つの時定数を明確に示すために折れ線になっているが、実際にはなめらかな曲線になっている(図2)。

 

Eqriaa
図2.実際のRIAA規格曲線


1kHzを基準0dBとして、低域20Hzで約+20dB、高域20kHzで約-20dBとなっている。
20dBは信号振幅で10倍なので、1kHzを基準(1倍)としたときに20Hzでおよそ10倍、20kHzでおよそ1/10倍になっていて、20Hzと20kHzではゲイン差がおよそ100倍だ。つまりこの倍率で低域を持ち上げて、逆に高域を下げている。

レコードの音を、フォノイコライザを通さずに直接増幅して聴いたことがあるだろうか?
レコード直接の音は、チャカチャカとした、低音がほとんどなく、高音が強調された音になっている。

つまりレコードは図2に示すRIAAカーブの逆特性、すなわち低域を約20dB下げて、高域を約20dB増幅して録音されていて、再生時に図2のRIAA特性をかけることで元通りのフラットな周波数特性を得ている。

 

2.RIAAフォノイコライザの定数計算

それではこのRIAA特性は具体的にどのような伝達関数になっているのだろうか。
RIAAイコライザの伝達特性の式は次のとおり。

F6・・・式1

ここで時定数T1,T2,T3は上述したとおりそれぞれ3180μs(3180*10^(-6))、318μs(318*10^(-6))、75μs(75*10^(-6))、sはラプラス演算子だ。

これは文献によっては次のように表現されることもあるが、同じものだ。

F8・・・式a

ラプラス変換が出てきたからといって、恐れる必要は無い。これは交流信号で周波数によって位相が回ったりする面倒な現象を表現する便利な道具で、実際にラプラス変換したり、ラプラス逆変換したり、微分方程式を解くような場面はほとんどない。単なる記号だと思っておけばよい。ラプラスの悪魔なんていないのだ。

さて、式1の伝達関数を回路で表現すればレコードが正しい音で聴ける。
どのような回路だろうか。一般的には図3のような回路になっている。

Creq_sch
図3.CR型RIAAイコライザ回路
式1に示す伝達関数を表現する一般的な回路。


ただしこの回路は前段の出力インピーダンスが0、次段の入力インピーダンスが十分に高い、という前提になっているので、実際はこの回路の前後にバッファアンプが接続される。
現在ぼくが実際に使っているイコライザアンプの回路を図4に示す。

 

Myeq_sch

図4.実際に使用中のイコライザアンプ
これはMJの安井さんの設計をもとに作ったもので、±4.8Vのニッケル水素電池で組んでいます。枠で囲った部分がRIAAイコライザ回路で、
8.256kは8.2k+56、0.147は0.1u+0.047uです。図中、平滑コン、パスコンの類いは省略しています。

なお、民生品では帰還型のRIAAイコライザアンプが多いようですが、ここではCR型しか扱いません。
ぼくも深く考えずに長らく帰還型のイコライザを使っていましたが、あるときCR型の試作をして音を聞いてびっくりしました。帰還型のイコライザはなにか不自然な艶っぽさのようなものがあることがわかりました。
わかりやすいのは針が落ちたときのポツという音です。帰還型だとうっすらリバーブがかかったような音になりますが、CR型だとそれがありません。
それ以来イコライザはもとより、パワーアンプも無帰還の電流アンプ、電圧アンプをオリジナルで設計して使っています。
図4のイコライザアンプのオペアンプも、いつか無帰還バッファアンプに作り替えて、どんな音になるか試してみたいと思っています。

 

さて、図3の回路に伝達関数を実装するには以下のようにする。図5を参照してほしい。

Eq_formura_sch_20201017205101
図5.計算用回路図

まず図5の伝達関数Vo(s)/Vi(s)の式を導出し、その伝達関数が式1と同じになるように、恒等式として各パーツの定数を求める。
図中に示すように、入力電圧をVi(s)、出力電圧をVo(s)、R1,R2,C1を流れる電流をI1(s)、R3,C2を流れる電流をI2(s)、C1,C2のインピーダンスをそれぞれ1/C1・s、1/C2・sとする。

まず入力信号Vi(s)に着目すると、信号電流I1(s)、I2(s)を使って、

F9_20201017220801  ・・・式2

次に、出力電圧Vo(s)に着目すると、I2(s)がC2に流れているので

F10_20201017220801  ・・・式3

またR1,R2,R3の接続点の電位に着目すると

F11

つまり

F24・・・式4

この式4を式2,3に代入して整理すると、

F13

F12_20201019155601

よって伝達関数Vi(s)/Vo(s)は

F14・・・式5

 

式1で最初に示されたRIAAイコライザの伝達関数を展開すると

F7_20201018005701 ・・・式1-b

なので、式5と式1-bを恒等式として見れば、

F5・・・式6

F15・・・式7

F16・・・式8

 

ここで、T1,T2,T3は上述したとおりRIAA規格で定められた定数で、それぞれ次のとおり。

T1=3180μs

T2=318μs

T3=75μs

ただし、5変数に対して式が3つしかないので、初期値はエイヤっと決めてやる必要がある。

まず考えやすいのは式6だ。T2が318μsなので、適当な組み合わせを当てはめる。よく使われるのは次の値。

C1=0.047μF
R2=6.8kΩ

この2つを決めた上で、R1もエイヤでR1=56kΩとして残りのC2とR3の組み合わせを計算すればよい。
この作業は式7または式8のどちらかのみで行うことができるが、式8はT1とT3の和の値を基準として計算するため、誤差が大きい。よってT1,T3の積を基準とする式7を使って、C2、R3の組み合わせを計算する。エクセルで計算した結果を表1に示す。

 

表1.C2、R3の組み合わせ計算結果
Keisan1

T1、T3はそれぞれ規格で3180μs、75μsなので、T1*T3=2.385*10^(-7)、T1+T3=3.255*10^(-3)が理論値だ。
s^2の項の係数であるT1*T3を基準に計算しているので、T1*T3はぴったり計算通りだが、T1+T3では誤差が生じる。誤差が最小になっているのはC2=4700PF、R3=11kΩの場合だ。これらの定数の組み合わせはよく見られる。

 

3.計算結果のシミュレーション

上で算出した定数で回路を組んだ場合の誤差をシミュレーションしてみよう。
まず、RIAAの規格通りの各周波数のゲインは次の式で得られる。

Riaa_formura_20201017230801・・・式9

次に、上で求めた各部品の値を使った回路の、各周波数の振幅特性を求めるには、伝達特性から振幅特性を求める式を導出する。

振幅特性は、伝達特性からH(s)*H(-s)を求め最後にs=jω(jは虚数)を代入し、平方根をとればよい。つまり、

式1-bに対し、

F17・・・式10

 

F18・・・式11

と置き換えると、振幅特性は

F19

           F20

           F21(ただしω=2πf)

これで各周波数のゲインはエクセルで求められる。

せっかくなので位相特性も計算してみよう。

位相特性は伝達特性の虚部と実部の比の逆正接(アークタンジェント)から求める。ただ今回の場合は虚部と実部を分離するのがたいへんなので、重ね合わせから求めることにする。

図6に示すのは積分回路だ。

 

Cr_sch
図6.積分回路

 

この回路の伝達関数は

F22 ・・・式12

このとき、位相特性は

Sekibunisou・・・式13

 

ところで今回求めるRIAAの伝達特性はT=C・Rとすれば、

F23・・・式14

と分解することができるため、式12,式13の関係から重ね合わせて求めると、

F2(rad)・・・式15

とすることができる。

T1、T3は式10,式11で示したとおりなので、それぞれ

F3_20201018084601

F4

(ただしP=T1*T3、Q=T1+T3)

と示すことができ、式15より位相特性を計算することができる。

位相特性についてはあまり触れられていないが、システムの伝達特性を考える上では非常に重要だ。とはいえ、今回のような場合では、伝達特性が決まれば振幅特性と位相特性は一意に決まるので、振幅特性のみ検証すればよいと考えられる。

さて以上ですべての材料が出たので、エクセルによるシミュレーション結果を表2にそのグラフを図7に示す。

 

表2.RIAAイコライザのシミュレーション

Tokuseisim

Tokuseisimg_p

図7.EXCELによるシミュレーション結果のグラフ

 

表2で”RIAA”と書いてある行が式9による理論値で、式9によれば1kHzでの値は0.089dBとなるが、これを0に正規化してある。Gain(dB)の行が今回の設計によるシミュレーション結果、Error(dB)が今回求めた部品定数による誤差だ。

 

アナログRIAAイコライザの復習はこれでおしまいです。

 

10/18
一気に書き上げたので肩が凝りました\(>_<)/
内容確認せずにここで一旦アップしてしまう。加筆や修正は気がついた時点でやります。

 

| | コメント (2)

2020年10月 1日 (木)

Z97 Deluxe マザーボード故障

 ちょうど一年前、3万円の出費で修理したデスクトップパソコンがまた故障してしまった。

 今回も前回と似ていて、起動で失敗する。ただ、前回は電源が入ったままQ-CODEが00すなわちCPUが起動しないという故障だったが、今回は電源を入れると1秒で電源がダウン、そして自動的に電源ON、1秒でダウンそして……という具合に、電源起動に失敗してリトライを繰り返す。これは推測だが、おそらくマザボ上でCPUコアの電源に抱かせているコンデンサが劣化し、CPUコア電源の起動時にラッシュカレントが流れたときに電圧降下を起こし、これを電源監視回路が検出して、ATX電源を落としているのではないかと思われる。
 延々とリトライを繰り返し、なにかの拍子に起動に成功した場合は、その後の動作は安定しているし、再起動も問題ない。上記のような問題が出るのは電源を落として数時間後にまた電源を入れたときだ。

 最近はほとんどデスクトップは使っていないので、もう捨ててしまってもいいかとも思ったが、実はつい一か月前に電源を新調してしまっているので惜しいのだ。

 そこで、苦肉の策として、起動できない事態に陥った場合の、緊急起動SWを追加することにした。

 ATX電源にはパソコン側から電源のON/OFF制御ができるようにPower On端子が付いている。今回の不具合も、パソコンが異常を検知して自分で電源を落としているのが原因だ。そこで、Power On端子ととなりのGNDを引き出して、これをショートしてやれば強制的に電源ONになる。つまり起動時に異常検出して再起動する瞬間を、強制電源ONでスルーしてやれば起動できるはずだ。

Emgsw
図1.ATX電源コネクタにタクトスイッチを付ける。
Power On端子16番ピンととなりのGND15番ピンにタクトSW。ジャンク品なので汚い(^-^;


 パソコンがOn/OFFを繰り返して起動できない状態で、このSWを3秒ばかり押しておいて離してやると、もう電源は落ちない。このままパソコンは起動する。
 まれに電源落ちはスルーできてもQ-CODEが0のままCPUが起動しないことがあるが、その場合は再起動だ。いずれ去年と同様にどうやってもCPUが起動しない事態になるかもしれないが、その時はこのデスクトップの捨て時だろうと思う。

【補足】
CPU周りのコンデンサが怪しいので、これらを、古いマザボからよさそうなものだけ選んで交換できないか検討したが、マザボのはんだ付けは放熱重視で、広大な両面銅箔にサーマルも付けずにはんだ付けされているので、手持ちのはんだごてでは歯が立たずあきらめたのだった。

 

| | コメント (0)

« 2020年9月 | トップページ | 2020年12月 »