デジタルオーディオあれこれ

半田ごての人。紙と鉛筆だけではちょっと。

DSMの実際の周波数特性を、NTFから計算する。そこそこ実際の値に近い。

 今はもうDSMの計算には幾つかのライブラリーが用意されている筈で、これを一から自分で作る人はまずいない。アルゴリズム自体はほぼ完成されていて、初期のSACDで使っているのに比べると、随分と良くなっている。良いというのは、入力がゼロの時に変なアイドリングパターンを出さないとか、同じ次数やOSRでノイズレベルが低いという意味。SACDはあんまり良くない。

 

 しかしFPGAに実装する場合は少し違う。ソフトウエアと違ってリソースが限られているので、用途に合わせて限りなく特化する必要がある。金に糸目を付けないのならば、大きなサイズのFPGAで解決する手もあるが。デジタルフィルターにしろDSMにしろ、ハードウエア化にはそんな問題が常にある。

 

 参考書籍はあるけれど、中々自分に必要な所を見つけ出すのは難しい。ネット情報も当たり外れが大きい。ここはとても凄い。

PlayPcmWin / Wiki / PCMtoSDM

必要な情報は全てある。MATLABでの計算結果も出ている。本にはそこまで出ていない。結果が欲しければ、MATLABは高いのでpythonで計算するしかない。でも最終的な定数に辿り着くまでには些かの計算が必要。

 

 自分で計算して履歴も残っているけれど、暫くしてから見直すとサッパリ意味が分からない。一日位考えてやっと思いだす。という訳で、備忘録の積りの覚書。

f:id:xx3stksm:20181016194033j:plain

 これがDSMの基本の基本。定数の計算もこれが元になっている。入力信号はそのまま出力に出るようにして、量子化誤差に対するNTFというのを音声帯域で小さくなるようにする。NTF=1/(1-L1(z))

MATLABはsynthesizeNTFで、この関数の零と極を計算してくれる。ここにある。

PlayPcmWin / Code / [r740] /PlayPcmWin/WWOfflineResampler/NTFHzcoeffs.cs

どちらも複素数になる。

 

 この零と極をもつ関数と、実際の回路の係数を一致させれば良い。一番簡単な二次の場合はこうなる。

f:id:xx3stksm:20181213212028j:plain

%o126がL0(z)で、%o131がL1(z)。

f:id:xx3stksm:20181213213045j:plain

 z0,r0,j0,が、MATLABが計算してくれる零と極。次数が上がるとこれが増えてくる。

という按配で最終的に必要なg0,a0,a1が出て来る。ここまで自分でしなくても、g0,a0,a1も出ているので、そのまま有難く使わせて貰って問題はない。

 

 但し、gとaが出ているのは五次までなので、それ以上の七次が欲しければこの計算が必要。七次ともなると、とんでもない数式になるが、maximaが計算するので、二次の延長で数式をほり込んでやればよい。そのために、二次で流れ作業の手順を覚える必要がある。

 

 これを計算するのにはもう一つ意味がある。このNTFの周波数特性を確認したい。これが所謂ノイズシェービングというものなので、どの程度にノイズが抑えられるのかを確かめる。NTFは共にzの二次の分母と分子で出来ている。このzにe^(jωT)を代入すると、その複素数の絶対値が周波数特性となる。

f:id:xx3stksm:20181213214752j:plain

分母の実数が%o3で虚数が%o4。分子の実数が%o13で虚数が%o14。これの絶対値をエクセルで計算させてグラフ化するとこうなる。

f:id:xx3stksm:20181213215015j:plain

 横軸はサンプリング周波数を1として表示。x64のOSRだと、1が3.072MHzで0.1が307.2KHz、0.001が3.072kHzになる。二次の場合、0.1ぐらいまでノイズは上がり続ける。g0で出来る共振点が、0.005(15kHz)あたり。g0という局部帰還を入れると、ない場合の赤に較べると、ノイズシェービングの効きが良くなる。なので入ってる。

 

 けれどもこれは、グラフにあるように直流分に対しての減衰量がゼロにはならない。g0=0の赤ならば、そんな問題は起きない。偶数次の場合にはこの問題があるので、四次であれば二つの局部帰還のうち一つはゼロにした方が良い。それでも十分にノイズは落とせるので。赤の傾きは、二次の理論通り40db/decとなっている。

 

 実際に使う場合、二次ではノイズレベルが高すぎる。計算方法は同じなので、maximaを使って五次で計算させる。昔はこれを手計算でしていたので大変。間違える可能性はあるし、グラフ化するのも大仕事。今は簡単に出来る。これが五次の時の分母。

f:id:xx3stksm:20181214145718j:plain

こっちが分子。

f:id:xx3stksm:20181214145745j:plain

五次なので係数は分母にr0,j0,r1,j1,r2。分子にg0,g1。これを代入してグラフにするとこう。

f:id:xx3stksm:20181214145921j:plain

 五次の場合は、傾きが30dB/octになる。g0とg1で共振点を作ると、共振点なしの緑よりも落ち具合は良くなる。但し、零をDCに持つ項が一次となるので、共振点から上がってきた後は、緑よりも落ちが悪い。FPGAで実装する場合、リソースに余裕がないならば緑の方が遥かに簡単。現実論として、十分なノイズ特性は稼げるので、共振点の必要もない。

 

 シミュレーションは所詮仮説に過ぎないので、実物で確かめる必要がある。これは一ビットの出力なので、実際のデジタルデータをそのままFFTしてしまえば、その特性が分かる。一ビット以外であれば、DACのアナログ出力をアナログフィルター無しで入れるしかない。測れなくはないが、50Ωのプローブが使えないのでS/Nが悪化する。一ビットは楽。

f:id:xx3stksm:20181214151111j:plain

 これはg0とg1がゼロなので緑の特性。下の5MHzスパンが全体像で上が拡大図。シミュレーションでのNTFは、100kHzぐらいで平坦な特性になる。実物もそのあたりで少し飽和し始め、そこに至る間は理論通りに30dB(6dBx5)/octで上がってる。元のデジタル信号は3Vppぐらい。これを50Ωの関係で16dBぐらい落としている。

 

  3Vppは1Vrmsで120dBuVだから、この時に出している12kHzはアッテネーターなしだと120-16-6=98dBuV。実物との差は主にDAC側でのアッテネーター。一ビットは、100%の変調を掛けると必ず発振するので、幾らかのアッテネーターが必ず入る。-6で50%に落とすのは必須。普通は更に2dBぐらい落とす。残りはDAC内のフィルターでの減衰とか誤差。

 

  シミュレーションとの違いは、誤差のEかと思う。これが定数ではないので差が出るのでは。1Mから2Mにかけての成分もそこら辺りから来るのだと思う。でもL0(z)とL1(z)での解析は、相当に正確で十分に実用的。

 

 これは5MHzのスパンになっているけれど、その周期性は明らか。分母と分子の複素数がサインとコサインなので、言うまでもない話ではあるけれど、実物を見ないとこの周期性には気が付かないもの。分数の形になっているIIRであっても、言うまでもなく周期性を持つ。デジタルのシステムは離散システムと言うが、周期性システムと言った方が思い込みは防げる。

 

 アナログのような落ちっ放しのLPFなんてものは、決して実在しない。無限に高いサンプリング周波数を使わない限り。sinc関数はこれを暗黙の裡に想定している。なので現実世界で使おうとすると、思いもよらない所で足をすくわれる。デジタルとは、因果応報の輪廻の如く、必ず繰り返す周期性システム。

 

 おまけにSACDFFT。傾きからして五次ではないと思う。でも少し五次よりも上がり始めが早い感じ。もうずいぶんと昔の規格なので、変調のかけ方がまだ完璧でなかったんだと思う。

f:id:xx3stksm:20181214153441j:plain

 

  

 

 

RpiのIISで、DSMの脆弱性に気が付く。確かに彼等はジッタに弱い。

Linuxに手を出すのは、ちょっと敷居が高い。でもRpiのIISは実験用の信号源としては役に立ちそうなので、今回のDAC基板はIISのピン配置をRpiに合わせてある。大きさが少し違うのでHATとは言えないけれど、そのままRpiにはつながる。ドライバーはなくても、generic IISで信号さえ出してもらえば大丈夫。こんな具合。

f:id:xx3stksm:20181205204204j:plain

普通のHATだとこんな感じ。

f:id:xx3stksm:20181205204321j:plain

RpiのIISはジッタがテンコモリであるとは周知の事実。では数字的にどの位なのかを確かめたくて、Rpiにもつながるようにした。測ってみると、確かに問題あり。バチモンのpifiberryで調べたら、対策なしではCD並の16bitぐらいの精度しか出ない。勿論、これはRpiの問題なので、どんなDACをつないでもDSMでは同じ結果になる。

f:id:xx3stksm:20181205205053j:plain


16bitのファイルでも24bitのファイルでも、同じぐらいのS/Nになってしまう。歪の-90dB前後はまあこんなもの。現実の問題として、96dB程度のS/NはCDがそうであるように、ノイズが聞こえる事はない。問題になるのは、デジタルのクロスオーバーを使う時で、中音はスピーカーの能率が高く尚且つ耳の感度も高いので、ここでは実害が出る可能性あり。

 

どうしてこれがジッタの影響かというならば、話は簡単。ジッタ対策をしたクロックに入れ替えると、24bitファイルの劣化がほとんどなくなるので。pifiberryでは、後付けのリクロッカーというHATを間にかますしか手はないと思う。そこまで拘る必要はないけど。

 

こういう時は、市販品ではなくてDIYが真価を発揮する。自作ものであればクロックの補償は簡単に出来るので、befpreとafterを比べるならば一件落着。こういう結果になる。

f:id:xx3stksm:20181205210043j:plain

クロック補償なしで、そのままつないだ状態が上。OSRの関係か、更に悪化してS/Nは88dB程度になっている。補償してやると、20dB近くも改善する。歪もそれに連れて良くなる。x256のOSRにして5bitのDSMにすれば、S/NはSDカードからの読み出しとほぼ同じで110dBぐらいになる。これが本来の特性。

 

但しこれには少し裏がある。というか表であれば、こんな事は起きない。今までずっと表一本で来たので、ここまでジッタが影響するとは初めての経験。表というのは、マルチビットの事。マルチビットとDSMというのはかなり境界が曖昧で、ここでは元のDACチップが14bit以上をマルチビット、6bit以下をDSMと言っている。NFBはどちらも入っている。

 

その間はどうなのかというならば、考えない。普通のオーディオ関連でそこを使う事はないので、ない事にする。敢えて使うとするならば、両者の中間的特性になると思うけど。ハッキリしているのは、マルチビットは圧倒的にジッタ耐性が高い。なのでRpi程度のジッタであれば、ほとんど特性に劣化はない。こんな具合。

f:id:xx3stksm:20181205211336j:plain

補償なしだと、30kHzを少し超えた所に変な成分が出ているけれど、歪やS/Nはほとんど劣化しない。-100dBに少し欠ける程度の歪はかなり良い部類。スピーカーではどんなに良くても-60dB程度の歪はあるので、-100dBで特に問題はない。

 

何故マルチビットがジッタに強いかは、出している出力の問題。基本的にマルチビット(PCM)は1kHzであればそのまま1kHzを出力する。x512のOSRでサンプリング周波数が上がっていても、出力は低周波のまま。DSMでは、x512のOSRなら10MHz近い周波数を出して、そこから低周波分のみを使っている。

 

クロックジッタの影響に関しては、多くの誤解がある。サンプリング周波数とDACの出力周波数の比が関係する。昔のデータシートには必ずそういう事が書いてあった(pcm1702の頃)。今はオーディオメーカーがジッタで商売する様になっているので、そんな不都合な事実は書かないようになっているみたい。高速ADCやRF用のDAC関連にしかそんな記述はない。詳しくは、こういうの。

https://www.analog.com/jp/analog-dialogue/articles/analyzing-and-managing-the-impact-of-supply-noise-and-clock-jitter-on-high-speed-dac-phase-noise.html

出力が1kHzと10MHzでは、ジッタ耐性が80dBも違うよという話。

 

x64のOSRでも1MHzぐらいを出すので、マルチビットの10kHzと比べるならば、40dBも耐性が違ってくる。DSMがジッタに弱いという話は時々目にする。但し、サンプリング周波数が高いのでそうなる、という方向で言っている事が多いと思う。正しくは、出力周波数が高いのでそうなる。つまり一番のジッタ対策とは、マルチビットを使う事。

 

実際のRpiのクロックを調べるとこうなっている。

f:id:xx3stksm:20181205213041j:plain

RpiにはデータサンプリングのBCLKしかなくて、MCLKというのは出ていない。これは192kのファイルの時のBCLK。2nSぐらいのジッタがある。下はヒストグラム。前の濃いめの波形と後ろの少し薄めの波形は、頻度の違いでそうなっている。茶色の四角内で頻度を比べると、四対一ぐらいと分かる。五回のうち四回が前の波形で、一回が後といった按配。80nSぐらいの周期で2nSのジッタはかなり大きい。

 

でもまあ今一つ分からないので、FFTでみるとハッキリする。テクトロの3000シリーズは、おまけで少し本格的なスペアナがついている。オシロの他にスペアナはちょっと負担だけと、一体物ならば使って損はなし。おまけとは言え、かなりの精度が出る。

f:id:xx3stksm:20181205213853j:plain

本来の周波数に対してワサワサと、余計なのが沢山ついている。ノイズ電力という見方をするならば、40dBもS/Nがない事になる。時間軸波形からの類推として、まあこんなもんかと思う。本来はこんな具合になるのが普通。

f:id:xx3stksm:20181205214209j:plain

ほとんど測定限界で、本来のクロックのみしか観測できない。これが正しい。但し、市販チップの場合、これはほとんど意味を持たない。普通はこれを元にして内部のPLLで必要なクロックを作り出す。それは基板の実装状態であるとか、電源の質に大きく依存する。現実のクロックが如何なものかは外部からは分からない。出力の信号から判断するしか手はない。

 

自作品の場合は、DACチップに入っているそのままのクロックを見れる。これもそう。勿論、最終判断は実際の1kHzなどの信号で測る。Rpiの場合はこんだけ悪いので、ハイエンドとして使うのであれば、クロック補償は必須。或いは、マルチビットを使う。

 

リクロッカーと言っているのは、大きめのバッファメモリー(512k)を用意して、FIFOとして使うHAT。なのでいずれはオーバーフローするけれど、10時間程度は持つだろうから実質これで問題ない。うちの基板は単純にPLLで補償する。LRCKはジッタがないので、ここからクリスタルのPLLで再生用のクロックを作るのが簡単。

 

16ワード程度のFIFOを用意してRpiからのBCLKで書き込んで、PLLで作ったクロックで読みだすだけ。勿論、オーバーフローはしない。クリスタルのPLLは安定なので、ジッタに弱いDSMであっても差し支えなく動作する。

f:id:xx3stksm:20181205215421j:plain

ほんの少しだけ余計な成分が出ているようだけど、DSMでも問題なく使える。これは光入力の信号に対してロックした時のスペクトル。IISよりはずっと条件が悪い。光はフォトカプラーのジッタが大きいので、TOSLINKの場合こんな特性は望めない。CS8416だとこうなる。他のレシーバーでもTOSLINKならば似たような特性にしかならないはず。

f:id:xx3stksm:20181205215912j:plain

 

48kHzの倍数になるのは、元が48kHzの信号だから。時間軸だとこう。

f:id:xx3stksm:20181205220025j:plain

RpiのIISとほぼ同じく2nSのジッタ。カプラーでのジッタなので、綺麗な正規分布になる。今までこれをそのままクロックとして使っていたけれど、マルチビットしか使っていないためか、出力にジッタの痕跡が出る事はない。DSMだと出る可能性はある。同軸で入れるならば、こんなに悪くはない筈。

 

しかし現実問題として、光で完全な分離をしないと他に致命的な問題が出るので、導体でつながる同軸はダメ。アイソレーターなんてのは気休めにしかならない。あれは元々アースグランドの電位差でICが壊れないようにするもので、スイッチング電源から出るような高周波ノイズは素通しと思った方が良い。プラスチックに勝る絶縁体はない。なのでDSMを使うのであれば、光に対してのジッタフリーなクロックの再生が必須。

 

TOSLINKを使わなければカプラーのジッタは正規分布なので、これを平均化すると相当に正確な基準信号が作れる。それを元にしてクリスタルのPLLを使うならば、光入力に対しても上に挙げたように安定なクロックが作れる。クリスタルのPLLは引き込み範囲が狭いので、市販品で使うものはないと思う。大きく外れた周波数で出してくる装置があったりするので。

 

昔風のHC-49型は大抵は在庫品で比較的引き込み範囲が広い。多分24.576MHzに対して、+1kHzから-1kHzぐらいは引き込める。500Hz外れるものはあまりないので、大抵はこれで間に合う。特に自分用であれば全く問題はない。

 

どうして光が必須であるかは、コモンモード電流の問題。コモンモード電流とは、一本つないだだけなのに、何故か電流が流れるという不思議。例えるならば、雀は感電しないが、大型の鷲や梟は感電する。電子機器も、オーディオ製品のような微小電圧を扱う場合、発電機とは些か様相が異なる。アースグランドに対する対策が正反対。強電では、電流を流して感電防止、弱電では流さないようにして感電防止。

 

電柱にとまった鷲の翼が電線に触れると、感電する。この事故はとても多い。電柱は接地されているのでアースグランドと等電位。電線は高電位。故に感電。鷲は知らないだろうが、お前は既に触れている。アースグランドに既に触れているので、電線に触れるだけで閉回路が出来て感電。雀は電柱と電線の両方に触れる事はない。電柱のみか電線のみか。故に感電しない。

 

電子機器も同じ。商用電源を使う限り、お前は既に触れている。そして光などで絶縁されない限り、浮遊容量などを介して必ずノイズ源につながってしまう。結果として閉回路が出来て、知らない間にコモンモード電流が流れている。それは多くの場合、普通のノーマルモードに変換されるので、不可思議なノイズとなって現れる。或いは、聞こえる。電線で音が変わるのは、嘘ではないと思う。導体の電線はコモンモード電流の経路になっている。材質に意味はなく何処を這っているかがキモ。実際、空中に吊ると良いと言っている人もいる。

 

閉回路が出来ない限り電流は流れない。微小電圧を扱う場合は、アースグランドから分離する事。コモンモード電流は二本つなぐ必要はない。なので知らない間に流れている。アースの場所を変えると大きく音が変わるとは、誰もが経験している事実。そしてその対策は皆違っている。状況依存なのでそうなってしまう。強電的に流す方向で考えるならばそうなる。

 

元を辿るならば話は簡単。流さない事。雀になれば感電はしない。アースグランドから分離するならば、一本は外れる。感電の可能性はずっと減る。そして対策も簡単。微小電圧は、アースグランドにつながない。

 

 

DSMだって勿論-90dBFSの出力は出来る。こけちゃうのもあるにはあるが。

 pcm1704の代替品はRF用の高速DACに落ち着いて、結果としてx512(24.576MHz)までのサンプリングが出来るようになり、アナログLPFなしでもほぼ完全な元信号の再現が可能になる。そしてx512まで行っているので、FPGA次第でDSMとの二刀流も可能になった。期せずして、PCM(マルチビット)とDSMの奇妙な同居。

 

  市販のチップの場合、両者は水と油のようで共存は無理。製造プロセスが違う。高速DACとFPGAというのであれば、神仏混淆のように融通無碍で、寺なら松で神社なら杉かという程度の差。原理的にも両者を分けるのはNFBの有無なので、これはデジタル的にどうにでもなる。マルチビットも16bitを超える精度は無理なので、どこかでDSM的発想に切り替わる。

 

 真正のマルチビットがA級でDSMに変わるとB級動作になるようなもの。無帰還の

 A級がマルチビットで、B級のNFB付きがDSMと言ってもそんなに的外れではない。DSDを、信号を疎と密で表すとか、PWMの一種とするよりはずっと正確。x512ぐらいまでの高速サンプリングさえできれば、あとは何とかなる。微小電圧で若干の違いはあるとしても。

 

 DSMで-90dBFS(0dBFS=6Vpp)を出すとこんな感じ。1bitの量子化器で、x256OSR。FPGA(spartan6)の容量の関係でDSMは五次。Artixならば七次に出来るので、x128OSRでもほとんど高調波ノイズは出ない。但し1bitというのは中々の曲者で、少しばかりの工夫が必要。そのまま1bitで出すと、こんな特性にはならない。20dB近くは悪くなる。

f:id:xx3stksm:20181127185331j:plain

 1bitDSMに相対誤差がないというのは机の上での話で、現実世界では通用しない。パルスの立ち上がりと立下りの時間がゼロでないとこの仮定は成り立たなくて、それは不可能であるので実際はかなりの誤差を持ってしまう。結果として、5bitぐらいにして相対誤差を減らす方法論に較べると、圧倒的に不利になる。試してみれば分かる事。

 

 なので1bitは特に必要ないのだけれど、例えばpcm1792にDSDデータを渡したりとか、DSMなのにデジタルフィルターという完全な二律背反が出来たり(これは童顔なのに巨乳なんてのとは些か次元を異にする)、量子化器の1bitと5bitの変更は簡単なので、おまけとして付いてる。

 

 変調器自体は1bitなので五次のDSDとして機能するし、デジタルフィルターを通して5bitまで拡張してからAD9717に出力するので、ノイズシェービングで取り切れない高調波ノイズもデジタルの領域でかなり落ちている。5bitであっても、パルスに対する要求は立ち上がりと立下りともにゼロ、で変わりない。但し、振幅が1/32になっているので誤差もその分小さくなっているというだけの事。

 

 完全な1biであれば、仮に-90dBFSの信号であっても出力は常に最大振幅(約1Vpp)で振れている。DACのレイルトゥレイルという言い方が相応しいかも。そこから200μVppの信号を引っ張り出そうというのは、少し話がうますぎる。これを5bitにしてしまえば、30mV(1/32≒30mV)ぐらいの中から200μVなので、ずっと自然な感じになって数字も良くなるという当たり前の話。

 

 但しやっぱり、一番下の30mVを使うしかないのは事実。30mVよりも下は、全部このLSBの30mVで賄っている。1bitのDSMならば、最初からすべてを最大振幅の1Vで賄う。16bitあるのなら、1/65536までは1bit動作にならないという事。現実論として、相対誤差の補正が出来るのは6bit程度までだから、1/64までというのが最大値。

 

 そんな訳で、x256ぐらいが特性としては良さそう。それより下は高調波ノイズが少し残る。x512はやはりパルスの正確性に難が出て来るのか、x256よりは少し悪い感じ。調整次第かも知れないけれど。1bitでここまで出れば上出来と思う。

 

 この信号をpcm1792のDSDモードに入れるとこう。左の小さいのがpcm1792の基板。表示のDSM_5bitというのは所謂フェイクニュース。これは実際の測定時ではなくて、写真撮影のために出した表示だと思う。DSM_1bitというモードにしないとDSDは出ない。

f:id:xx3stksm:20181127192718j:plain

 これが測定結果。pcm1792はデータシートではx256まで入る。実際には、x512でも動作した。但しIV変換の関係か、或いはpcm1792自体の問題か、x512はあまり良くない。AD9717と同じ傾向。この数字だけからするとあんまり良くないが、pcm1792は0dBFSまで振幅を上げてもあまりノイズが増えない。

 

 これはとても珍しい特性で、総合的には相当に高い能力を持っている。二個或いは四個のパラで使うならば、SNでは他を圧倒しそう。AD9717よりも良い。しかしTHDはそんなに良くはない。両方が良いものは中々ないので、やっぱりトレードオフという所に落ち着く。

 f:id:xx3stksm:20181127193133j:plain

 

 これがAD9717の5bit。これはあんまり良くない。

f:id:xx3stksm:20181127192226j:plain

 これは0dBFSのような大振幅の時とのトレードオフでこうなっている。0dBFSを優先すると、皺寄せがどうも-90dBFSに出て来る。0dBFSの時のTHDを少しだけ犠牲にすると、1bitと同じぐらいの特性になる。1bitの場合は、あんまりそんなトレードオフが出ない。理由は不明。微小電圧での特性は、マルチビットに少し分があるのかなと思う。DSMが求める理想条件が崩れて来るので、まあ仕方ない事かも。

 

 少し蛇足を。まずはRpiのHATでpifiberryとかいうやつ。$50ぐらいの中国製。DACはpcm5122。pcmの96bit/24bitのファイル。 値段と手頃な大きさからして悪くない。volumio2でデジタルボリュームも使える。ここでは振幅が小さいので、クロックジッタの影響はない。RpiのIISは言うまでもなく不完全なので、無補償で0dBFSにするとDACとは無関係に16bit程度のSNしか出ない。f:id:xx3stksm:20181127194356j:plain

volumio2の場合LRCKにはジッタがないので、DACマスターにするまでもなく、読み出しのクロックをLRCKから作るのが簡単。FIFOは最小の16ワードぐらいで間に合う。512kバイトぐらいのSRAMで非同期読み出しするようなHATもあるけど、volumio2限定、或いはドライバー限定ならば、クリスタルのPLLが簡単。

 

 うちのDACは寸法としてHATにならないけれど、IISのコネクターはRpiと同じ並びなのでそのままつながる。ドライバーはgeneric IIS。クリスタルのPLLで完全にジッタは取れて、SDカードからの読み出しなどと同じ特性になる。実験用以外でIISの必要はない。SDカード若しくはTOSLINKが実用。TOSLINKは非同期取り込みなので、オプトカプラーのジッタは影響せず、SDカードと同じく完全にアースグランドから絶縁できる。IISではこれが不可能。

 

 最後はこういうの。中国製のES9038だったか。$50ぐらいの。これはちゃんとDSM_1bitの表示になっている。IVは電流モードに変えてある。こっちの方がメーカーの推奨で特性も良い

f:id:xx3stksm:20181127200228j:plain

 

 これがx128(6.144MHz)のDSD。pifiberryとほぼ同じ。

f:id:xx3stksm:20181127200506j:plain

 

 x256にすると、こうなってしまう。これは詰る所、軽トラで100km/hを超えると、車内はがたつくしエンジンはうるさいし、になるのと同じ。と言っても、チップ自体の責任ではないと思う。写真では分からないけれど、値段から推測できるようにこれは普通の両面基板。

f:id:xx3stksm:20181127200718j:plain

  チップ自体が悪いのでないと言いつつも、これは100MHzのクロックを外から入れている。両面基板でそれを実装すると、物理法則は嘘をつかないのでこうなってしまう。高速動作をさせる場合、普通こういう事はしない。グランドプレーンを持った多層基板にするのも常識ながら、外からこんな高い周波数は入れない。

 

 最近のFPGAだと内部では500MHz近くでの動作もある。spartan6でも、200MHzぐらいはある。でも外からそんなのは入れない。うまく動かないので。外からはせいぜい50MHz。25MHzぐらいが無難。内部で必要な所まで上げる。そうしないと到底高速動作は無理。両面の基板に100MHzのクロックは常識として無理。そこに持ってきてIVのパラレル動作というのは、ちょっと現実から遊離している。

 

 実装次第で何とかなるかもだけど、大抵はこんな具合にこける。こうなると何をしても音が変わるという状態になって、お客さんはそれをむしろ喜ぶので双方の利害が一致ではあるけれど、こういうものに手を出す必要はないというのが結論。pcm1792の方がずっと素性が良いし、高速DACFPGAという組み合わせもある。pifiberry のpcm5122は両面基板でもこけない。好みの問題であるけれど、無意味に実装の難しいものに手を出す必要性は感じない。

 

 

pcm1704の替りを見つける積りが、DSMとの同棲関係に。

 最初に自作したDACは、もう20年近く前の事でpcm1704だった。その後は暫くそっち方向にはご無沙汰で、再び始めたのは部屋を建て始めた頃で今は死語となりつつある南ア大会のブブゼラの音が鳴り響いていた。時代は既にDSMに変わっていたけれど、pcm1792と比べてみたら、どうもやっぱしpcm1704が良くて、以来今までマルチビット専門。クラシックに必須の濃いい低音がDSMでは出なかった。

 

 とはいえpcm1704は段々と廃版に近付いていたから、替りを模索しつつデジタルのクロスオーバーとSDカードからの読み出しも。今年はもう完全にpcm1704の絶滅宣言。自分で使う分は昔の在庫で賄えるけど、なんとか後釜は見つけられたような感じ。

 

 pcm1704の最大の特徴は、グリッチが出ないこと。マルチビット系のチップは、TDAxxxxとかADxxxxがフェイクも含めてまだまだ手に入るし、産業用のLTC2642とかも含めるとそこそこある。でもグリッチフリーはpcm1704だけと思う。pcm1702は、はてどうなのか寡聞にして知らないが。

 

 中でも素性が良さそうだったLTC2642は、暫く使ってみて悪くはなかったけれど意外な事にpcm1704とは少し音質に差があった。LTC2642は、ビデオ映像のように鮮やかで陽性。pcm1704は、フィルム映像のようで些か解像度は落ちるものの味がある。結局の所、やっぱり元のpcm1704に戻ってしまった。グリッチのあるなしが原因か、定かではないにしろ。

 

 LTC2642は16bitのモノトニシティを保証しているので、THDを測るとpcm1704よりも良い。16bit精度であることは、軽いDSMでそれ以上の解像度に出来るので問題にはならない。精度は残留ノイズで決まる。SNが若干pcm1704よりも悪いのは、グリッチの影響もあるのでないかと思う。悪くはないが置き換えは無理かなあ、との結論。

 

 DACに関してはここで頓挫。レコードのデジタル化にADCが必要で、精度の高いものが用意できるならば、DACのノイズ解析にも使えて一石二鳥となるので、暫しADCに寄り道。そのADCが去年ぐらいには完成したので、捲土重来で再びpcm1704の代替品探し。そのためには歪の小さい発振器が必要となるので、ちょっと手を出したDSMにはまってしまい、一年ぐらいかかった末に何とかマルチビットも終着駅。

f:id:xx3stksm:20181127141340j:plain

f:id:xx3stksm:20181127141621j:plain

 ADCはSAR型のAD7960。ADCも最近はほとんどがDSMになっているけれど、SNに関しては圧倒的にSARだと思う。THDは似たようなもの。SARは自前でアンチエイリアシングのFIRフィルターであるとか、IISの変換などを作る必要があるので、産業用が多いかも。市販品で音声用に使っているのは稀と思う。

 

 AD7960を最大の5MHzサンプリングで使い、個体間の違いがほとんどないのでLとRをインターリーブして10MHzにするならば、125dBのSNが確保できる。DSMのADCは、結構LとRの差があるのでこういう使い方は出来ない。多分、DSMで120dBを超えるのは現実論として無理。レコードのデシタル化にこんな性能は意味ないけれど、測定用も兼ねるので去年作った最新版ADC。

 

 これで色々なDACチップの微小電圧特性を見る。THDは、スピーカーや録音時のマイクの性能で制限されるので参考程度。SNは、デジタルのクロスオーバーを使う場合、かなり問題になる。人の耳の一番感度の高い2kHzから4kHzぐらいは、通常高能率のホーンを使う。低音との感度差の関係で、ここでは信号レベルがかなり落ちるので、結果として実際のSNは悪くなる。現実的に必要なSNをCDよりも悪い90dBとしても、元のSNは110dB程度確保しておくべき。

 

 これが今使っているpcm1704。下がADCの出力で、上がそこから基本波の1kHzを取った残留ノイズ。-90dBFS(0dBFS=6Vpp)での結果。26dBのSNだとこんな感じの波形。これはパラレルなしの一個だけの特性なので、かなり良い。今はもうアラブの金持ちぐらいしかできない贅沢で、四個パラにするならばあと6dB良くなるという按配。白い点が実際のサンプリングデータ。

f:id:xx3stksm:20181127143437j:plain

 こちらがちょっと鮮やか過ぎた感のあるLTC2642。3dBほど悪い。グリッチの影響があると思う。

f:id:xx3stksm:20181127144048j:plain

 とはいえ、LTC2642のグリッチは0.5nVsecという事で、産業用や音声用の中では一番良い。実測値もそれに近い。ただ問題なのは、これが全ての1/64の境界で出てしまう事。一番大きいのは所謂このゼロクロスの時みたいだけど。その影響は数字的に否定できない。音質面での違いと関連するかは分からないが。一番のとびっきりをもってきても、このぐらいは出てしまうのが現実。

 

 ディスクリートで作っているマルチビットDACがどの程度かは、言わずもがな。知らぬは亭主ばかりなりで、世の中には知らない方が幸せな事がいろいろある。これもその一つ。知らなくていい事を、それを知る前に分かるのであれば、それは賢者というもの。the wisest とは、そんな人。

f:id:xx3stksm:20181127144231j:plain

 このグリッチ問題は、「ゴルディアスの結び目」のようで視点を変えないと解けない。アレキサンダー大王の剣は、何のことはないRF用の高速DAC。例えば、少し古めのDAC2904は0.002nVsec。これは当然と言えば当然。こんな100MHzを超える高速DACの場合、200nsのグリッチが出てしまうと全く話にならない。

2mV*1ns=0.002nVsecだけど、実際はほとんどゼロ。 

 

 最新の物になると、もうグリッチのデータは出ていない。どっちみちゼロなので書く意味がない。但し元々が広帯域用なので、狭い帯域の音声用に使えるものは限られる。狭帯域では、多分内部の電流源の特性でSNが良くない。AD9717(14bit)が今の所一番良い。この手のRFの旗艦チップAD9747(16bit)は、狭帯域には全く向かない。

 

 AD9717はデュアルなので最低でも二個パラ。でもまあそんなに高いものでもないので(¥2000)、四個パラにするとこう。パラにすると、勿論SNは単純に良くなる。最新型らなると、更にその上におまけがついてくる。この手は内部に自己校正の機能がある。これは512*32=16384で、32バンクの512DACで出来ている。

f:id:xx3stksm:20181127152033j:plain

 誤差が出るのは次のバンクに移る時で、LTC2642は多分64*1024=65536。バンクが変わる時、AD9717はグリッチは出ないけれど、誤差は大きくなる。その誤差を内部的に校正できるようになっている。スロットマシンのようで、何時当りが出るかは分からない。何度か試して良いのを使う。

 

 四個パラの場合、それぞれが別個の校正をするので、時々大当りが出る。この校正値は保存可能なデジタルデータなので、当りが出るまでくじを引けば良い。二夫にまみえず、なんて禁欲は必要ない。何度でも何度でも望むがまま。この大当りはTHDに関するものなので、SNにはあんまり関係しないけど。

 

 昔ならば、奮発して20個ぐらいのチップを用意して、その中から選りすぐりの4個を選ぶのと同じ。だいたい20回も籤を引けば、そこそこの当りは出る。勿論、何回引いても初期費用のみで追加料金はゼロ。温度特性も大きく改善するので、四個パラはかなり強力。八個もソフト的には試せる。単純にADCのデジタル出力を足し合わせるだけ。

 

 ハードウエア的に加算しても、劣化なしで同じ結果になる。何故かと言えば、IV変換は抵抗一本のパッシブ型。ほとんど電位差のない信号同士をつなぐだけなので、劣化はない。pcm1792や音声用のDACの場合、基本的にパッシブ型は無理。コンプライアンス電圧が低いので、SNが悪化する。頑張ってパッシブやってる人もなくはないけど。

 

 RF用はトランスでのIVが標準。高周波なのでSMDの小さなトランスで間に合う。音声用のごつい出力トランスは不要。しかし1Vぐらいのコンプライアンス電圧は許容範囲なので、音声用にはパッシブが最善。単純につなぐだけ。NDAは論外だし興味もないけど、ESxxxxも基本的には並列化で性能を上げる。でもバッシブは無理だから、現実論として劣化なしの高電流はあり得ない。それを使いこなしの問題とするならば、オーディオメーカーが喜ぶだけで、ユーザーはやらずぼったくりの憂きめ。簡単に実装できるのが優れた製品というもの。

 

 うちの環境で使うためには八台必要。来年の春までにはどうにかしたい。違和感なく乗り換えられるはずなんだけど。

 

 

火のない所(入力 )に煙(出力)は立たず。畳み込みは漸化式で。

デジタルのシステムには、必ず厳格な帯域制限がかかっている。ここがアナログとは根本的に違うので、出せる信号も自ずと違ってきてしまう。端的に表れるのが、いわゆるreconstruction filterの所。日本語にすると、再現フィルターかな。デジタル化で出てしまう本来は存在しないイメージ(虚像)を取るためのフィルター。デジタルフィルターだけでは取り切れないので、普通はアナログのLPFとの合わせ技になる。オーバーサンプリングフィルターとも言う。

 

48kHzのサンプリング周波数だと、20kHzまでを通すのは中々難しくて、かなりきつめのbrickwall(煉瓦塀)型を使う事になる。と言っても、煉瓦塀を使えるようになったのは半導体の集積度が上がったからで、昔のアナログフィルターでは相当にきつい。であるけれど、煉瓦塀特有のリンギングという現象は避けられない。リンギング自体は悪くはないと思うけれど。

 

このリンギングの正体とは、意外と単純。単純なのでリンギングしないフィルターというのも、以前書いたように不可能ではない。デジタルフィルターでのリンギングは、単に係数の並びの問題。係数が単調増加か単調現象であれば、リンギングはしない。簡単な五次ぐらいのデジタルフィルターで確かめてみれば良く分かる。デジタルフィルターは難しい数式で表されるけれども、要は漸化式なのでエクセルで図解すれば単純。こんな按配。

 f:id:xx3stksm:20181022192732j:plain

グラフ化しないと意味不明。

f:id:xx3stksm:20181022193114j:plain

f:id:xx3stksm:20181022192843j:plain

入力として方形波を用意して、二つのデジタルフィルターを通してみる。片方はリンギングしないように単調増加と単調現象のみ(a0-a4)。片方は普通の係数(b0-b4)。デジタルフィルターを通すとは、入力のFHと係数のFIかFJとの畳み込み積分を計算する事。畳み込み積分とは、入力と係数との単なる積和演算。文字式で書かれると卍固め決められたようで手も足も出ないが、漸化式で具体的な数字を当てはめるならば、普通の四則演算。

 

見ての通りで青はリンギングしない。赤はする。入力の方形波は、ずっとゼロが続いた後で今度は1が続く。ゼロの時は、勿論計算結果はゼロ。1が入って初めて何らかの値を持つ。b0からb4との畳み込みの場合、最初はb0の-0.1。次はb0とb1になるので足して0.2。最初のデータがマイナスだったのに次はプラスになるので、リンギングつまりは振動してしまう。a0-a4の場合は、常に足していくか或いは引いていくので、リンギングはしない。1024の次数になっても、理屈は同じ。

 

デジタルのシステムは帯域制限を入れるので、方形波のように無限の周波数帯域を持つものは、「幾許かの削り取られ」が必ず発生する。それがリンギングになったりならなかったりする。ほとんどの場合はなる。なので完全な方形波は、デジタルのシステムには存在しない。勿論アナログシステムにだって、そんなものは存在しないけれど。

 

リンギングが後に出るのはアナログフィルターでもそうであるから許すとしても、前に出るのは許せない、信号が来る前のリンギングはおかしい、というのはおそらく時間軸を間違えている。デジタルシステムでは簡単に遅延を入れられるので、出力が入力の前に来ているような状態にもできる。それを見て、デジタルに対する悪感情が入り混じったんだと思う。畳み込みの意味を考えればそれはあり得ない。正しい時間軸は、上の図。直線位相であれば大体次数の半分ほど出力は遅れる。5次であれば2から3。

 

リンギングの本質は、必須である帯域制限を如何にして入れるかという話。結論から言ってしまうと、遷移帯域を広めに取るのが宜しい。48kHzサンプリングで20kHzまでを通過帯域にする場合、必然的に20kHzから24kHzが遷移帯域になる。これはなかなか厳しくて、ちょっと狭すぎる。この条件でリンギング無しを選択すると、イメージの除去を完全に行うのは無理。

 

リンギング無しの条件である単調増加と単調減少を守ると、理由は分からないけれども急峻な特性は作れない。20kHzから24kHzのみが遷移帯域というのは無理。他にもリンギング無しの条件はあるかも知れないので、絶対に無理と断言はできないけれど、リンギング無しとイメージの除去は両立が難しい。あれこれと試行錯誤して何とか辿り着いたのがこんな特性。

f:id:xx3stksm:20181022201528j:plain

あんまり意味がないけれど、インパルス応答がこれ。この図で分かるようにインパルス応答はデジタルフィルターの係数を並べただけなので、これ自体はあまり物理的意味合いを持たない。レベルがフィルターの種類で大きく変わるのも難点。利点は、これをFFTすれば上の周波数特性になるという事ぐらい。

 

f:id:xx3stksm:20181022201547j:plain

 

赤のno_ringingは、全くリンギングしない。しかし半分の24kHzを超えても一向に減衰しないので、かなりのイメージが残ってしまう。具体的には、18kHzぐらいでも相当な歪率になる。こんなことになる。

f:id:xx3stksm:20181022202412j:plain

 こういう特性なので仕方ない。これは実測値。

f:id:xx3stksm:20181022202506j:plain最初の18kHzのイメージの30kHzでは、18kHzより-12dBぐらいしか下がらない。歪率25%になってしまう。但し、それより上のイメージは全てデジタルフィルターで取れている。x256以上のOSRであれば、特にアナログのLPFは不要。より現実的にはこんな具合で、リンギングはしない。

 

f:id:xx3stksm:20181022203124j:plain

黄色は10kHzのバースト波形。少し波打っているのは、やっぱりイメージの影響があるため。但し、現実の音声では10kHzのここまで大きな信号はない。聞いて分かるか否かは不明。いずれ確かめるにしても、八台必要になるのでしばらくは先の話。完全なリンギング無しを、48kHzサンプリングで実現するのはおそらく無理と思う。

 

煉瓦塀であればイメージは完全に取れる。こんな特性だから。21kHzまででその上は無し。

f:id:xx3stksm:20181022203618j:plain

リンギングは出る。周波数はリンギング無しと同じ。

f:id:xx3stksm:20181022203738j:plain

但し、騙されてはいけない。木や金属でできた楽器を人間が弾くのであれば、こういう信号は現実世界ではありえない。シンセサイザーで無理やり作ったりしない限りは。楽器が音を出すためには空気を振動させる。そのためには質量を持った何らかの振動版が動く。その振動版は、重さ故に初めからこんな高速な反応はしない。リンギングが目立つほどの急峻な始まり方は出来ない。定常運動に入れば10kHzで振動可能としても。

 

問題があるとすれば、聞こえるかどうかは抜きにして本来あったはずの24kHz以上が消えてしまう事。24kHzまでで良いのかというのが本来の問題で、リンギング云々はその

二次的な話。いわば高域カットの警告程度の意味合い。一つの妥協が、両者の良いとこどりのhybrid。

 

f:id:xx3stksm:20181022205225j:plain

f:id:xx3stksm:20181022205314j:plain

これであれば18kHzでも30dBぐらいの減衰になるので、もうそんなには歪まない。こんな感じ。3%程の歪で真空管並み。そこそこの許容範囲。10kHzのバーストでこれならば、現実的にプリとかポストのリンギングは音楽信号では無視できる程度になる。

f:id:xx3stksm:20181022205503j:plain

上の周波数特性から見て、これは20kHzから100dB/octぐらいで落ちていく。自然界の空気フィルターであれば、もっと緩やかな特性なのでまだまだ不自然かも知れないけれど、警告としてのリンギングもそこそこなので、この辺りが妥協点かなと思う。見た目のインパルス応答は、no_ringingと大差ない。実際の特性はかなり違うけれど。

 

結論として、基本的には煉瓦塀にして問題はないと思う。試せるのであれば、hybridとかno_ringingにも価値はありそう。いわゆるNOSというのは、もっともっとメチャクソな特性になるが、結構好きな人はいる。クラシックには向かなさそうだけど。或いは、20kHzまでしか使わないけれども、96kHzサンプリングにする。こう。

 

f:id:xx3stksm:20181022210754j:plain

こうしてしまうと、20kHzのイメージの76kHzはno_ringingでも40dB近く確保できる。1%の歪。ハイレゾというものに意味があるとするならば、広めに取れる遷移領域。聞こえる聞こえないは抜きにして、このhybridの特性のようなフィルターは自然界でもかかると思う。20kHzから40dB/octぐらい。

 

もう実測値は取っていないけれど、48kHzの時よりもずっと良くなる。うちの音源はほぼ全てがレコードからのリッピングで、再生用は48kHzサンプリングにしているけれど、メモリーをケチらずに96kHzサンプリングにすれば、ほぼ完璧にこの特性でのデシタル録音と再生が可能。元ファイルは96kHzサンプリングなので、今からでも出来なくはなし。

 

20kHz以上は音声としては必要がない。スピーカーから数メートルも離れると、高域は一気に落ちる。うちのように10mぐらい離れてると、20kHzは実測値で20dBは落ちる。コンサートホールではもっと落ちてるが、全然気にならない。それでもデジタルシステムの帯域制限を円滑にかけるためには、広めの遷移領域が必要なので、96kHzサンプリングにも意味はある。結論の歌。敷島の 96kHzを 人問わば 広めに取れる 遷移領域かな。

 

PCMを超えようとの積りでもなくDSMを暇つぶしとして。何事も 夢幻と 思い知る 身にはPCMも DSMもなし。

DSMとは、初めにNFBありき。オーバーサンプリングとかノイズシェービングとかは、実用的な歪に持っていくために必要になるけれど、条件次第で無しでも何とかなる。でもNFBなしのDSMはあり得ない。PCMは量子化誤差を捨てる。DSMはNFBという形で再利用する。誤差が大きくならないように、プラス側に大きくなったならばこれを入力にNFBして、次の出力が小さくなるようにする。

 

なので例え1ビットであったとしても、ノイズシェービングというのかノイズに対する伝達関数の特性次第で、実用的なものが作れる。というか、今はそんなDSMが主流になっている。捨てればPCM使えばDSM。今はもったいないの観点からも、DSMの優位性は動かない。 

 

数字的にはDSMがPCMを圧倒するし値段も安い。昔トランジスタは石の音がすると言われたし、CDも発売当時は実際あまり良くはなかったけれど、デジタルはギザギザとか今でも言われる。DSMにもアンチはいる。1ビットでまともな音が出る訳ないという、夷敵撃つべしみたいな感情的側面がある。この場合の帝はpcm1704みたいな伝統的マルチビット。

 

おそらくちゃんと作れば、両者に差はないと思う。異人にだってシーボルトのように、未練というのか情に厚過ぎる人もいる。DSMは一つのチップとして出来上がっているものがほぼ全てなので、いちから始めるDSMで市販品と同等のものを作るのは簡単ではない。そんな積りもなかったけれど、測定用の低歪発信器をDSMならば簡単に出来るだろうと手を出したら、結構な泥沼にはまってしまい一年近く、もがく羽目。

 

時間だけはあるのでlong and interesting roadと思い定め、基板CADも新しくしたので使い勝手を試しつつ、基板データの丸投げを受けてくれてメタルマスクも激安の、ちょっとこのロゴはやっぱし野暮ったいよねなドイツメーカーに発注し、雪に埋もれながらのデバッグとか停電で断水する事二度の苦難の果て、北極圏のてっぺんまでは難しいとしても、北緯80度ぐらいまでは到達。

 

DSMの教科書は、「Understanding Delta-Sigma Data Converters」というのが定番で、和訳も出ている。実用レベルにするためには、最低5次ぐらいが必要。7次あれば御の字。但しこれは使っている回路構成や定数にも左右される。SACDDSDは、開発時期が古いので、今のものと比べるとあまり特性は良くない。この程度のものは、5次で十分に作れる。

 

材料としては、FPGAと高速のDACチップ。5次か7次のループフィルターをFPGAで実装し、ノイズシェービングのためではなく色々な理由で数メガヘルツ以上になるサンプリング周波数に対応するためには、高速のRF用DACが必須。市販品はチップ内にDACを持っていて、勿論単独でこれを買う事は出来ない。

 

どんなループフィルターが必要であるかは、上述の本に書いてある。自前で最適なアルゴリズムを考える必要はない。考えても到底敵わない。問題なのは、ハードウエア化し易いものとそうでないものがある事。ソフトウエア処理であれば、DSMの変調は不便ではあるけれどリアルタイムでなくとも良いので、芋蔓プログラムでも何とかなる。ハードウエアでは、限りなくスリムでないとダメ。

 

f:id:xx3stksm:20181016194033j:plain

DSMには、量子化器という数式化しにくい素子が必ず含まれる。そこで上にあるようなモデルで、まずは単純化する。これは多分、ノイズシェービングが初級ならば、DSM中級篇の免許皆伝のために学ぶべき術。この雲を掴むようで取りつく島のない図が実はツンデレで、デレを引き出せた時には中級を会得。

 

このループフィルターという中身は、色々な人が随分な時間をかけて色々考えている。なのであっさりと成果を使わせてもらう。教科書に幾つか出ているので無料で使える。例えばこんなの。

f:id:xx3stksm:20181016194658j:plain

定石に従って、出力のVは入力のUにノイズを足しただけの形にする。ノイズのEは量子化器のビット数に相当するので、基本的に定数。zの関数になっている1/(1-L1)を小さく出来るように係数のa0からa4を決めれば良い。これも実は教科書に出ている。matlabで走るプログラムがあるので、それを使うと計算できる。問題なのは、計算してくれるのはここでのa0からa4ではない事。

f:id:xx3stksm:20181016195137j:plain

ちょっと小さくて見難いけれど、見易くても理解し難いので結局は同じ。f(V)というのが、ノイズの伝達関数に相当する1/(1-L1)。良く目を凝らしてみると、確かに分数の形になっていて、分母も分子もzの5次式になっている。g0とg1はローカル帰還と言って、これがあると少しだけ性能が上がるけれど、実装の手間の割には功徳に乏しいので無視してゼロにする。五体投地のような係数。マニ車の方が賢い。

 

この鬼のような5次の多項式のa0からa4と、matlabが計算してくれる係数のr0,j0,r1,j1,r2とは、一次の五元連立方程式になるのでこれを解くと、下の段のようにa0からa4が出て来る。ここにr0,j0,r1,j1,r2の値を代入すると、やっと欲しいa0からa4が出て来る。これを手計算するのは中々に難しく、vxmaximaという無料の数式計算ソフトを使う。

 

matlabはかなり高い。ネットを渉猟すると、r0,j0,r1,j1,r2の値は見つけられる。a0からa4もなくはないかも知れないが、正しいとは限らないので自前で計算するべき。r0,j0,r1,j1,r2は大本なので、間違いはないと思う。5次でもソフトがないとお手上げ。7次になると、PCの一画面に収まらないぐらいの長さの数式になる。鬼の七乗。確かに性能は上がるけれど、OSR比で補填は可能なので、5次ぐらいが妥当かなと思う。

 

この5次CRFBというのには、遅延積分器と無遅延積分器の2つがある。ソフト的にはほとんど意味がない。ハード的にはイギリスとキリギリス程に違う。或いは、北アイルランドアイルランド程。FPGAでのハード化は、高いクロック周波数で時分割処理をして、スループットを上げるのが基本。

 

FIRのように帰還を持たない場合は、単純に時分割すれば良い。クロックが高ければ全て丸く収まる。DSMのループフィルターはIIRのように帰還を含むので、時分割が難しいか或いはできない。出来ない場合、ハード化するためには膨大な量の掛け算器などが必要になる。金に糸目を付けないのならば、大容量のFPGAで話はケリ。そうでない場合は、可能な限り時分割できる回路構成を選ぶ。

 

無遅延積分器は時分割が出来ない。遅延積分器は、ある程度可能。遅延積分器は、押し寄せてくる膨大なデータの一時的な防波堤になり得るが、無遅延積分器はただ右から左に流すだけなので、溜めにはならない。ループフィルターは、無遅延積分器だけでも作れる。でもこれをやると、大きなFPGAが必要になるという話。なので、可能な限り遅延積分器を含むものが好ましい。

f:id:xx3stksm:20181016201946j:plain

こんな按配で、遅延積分器はz^(-1)の四角がデータを遮っているので、一時的に溜められる。無遅延積分器はドライブスルーですけすけ。これはどちらも積分器として動作するので、機能的には同じと考えて差し支えない。でもやっぱし、溜まるか溜まらないかは大違い。全て遅延に出来ないかと色々考えたけれど、どうも無理そう。何か手はあるのかも知れないけれど。

 

係数の値が分かって回路構成も決まると後は実装。三角の印は係数のa0とかa1を掛けろという意味なので、a5以外で10箇所ある。計算精度の関係で、a0からa4は40ビットで、入力のデータは36ビット。40x32の掛け算器がいる。金に糸目をつける場合はとても大変。上側でUとの掛け算は時分割が可能なので、実際は1個で済む。

 

下はDSMの特性として時分割できない。次のデータの計算には、必ず前の計算結果が必要になるので。でもここに掛け算器は必要ない。掛ける相方のVは量子化器の出力なので、この場合は5ビットしかない。なので40x5の掛け算。となるともう掛け算ではなくて単なるROM。32個の40ビット係数を予め計算してROM化すれば良いという話。10個の掛け算器は結局1個で済む。

 

他にも足し算器も色々な方法で節約して、やっとこさXc6slx25というFPGAにステレオで5次のDSMを実装。容量に収まりさえすれば、計算はデジタルなので何の問題もない。デジタル領域では、5ビットの量子化器で元の24ビット精度と同等の量子化ノイズに出来る。この場合のDSMとは、24ビットから5ビットへの劣化なし変換と等価になる。もしもwavファイルにするならば、一種のロスレス変換。メモリーサイズは相当に大きくなるとしても。

 

実際のDACはアナログ領域にあるものなので、デジタル領域での性能は絵に描いた餅。或いは3Dプリンターで打ち出した成形品。これを本物の餅肌で喉に詰まらしたら昇天の餅にするのはアナログの世界。それは又別の話なので別の機会に。結果だけはこんな具合。

f:id:xx3stksm:20181016204750j:plain

 

数字は立派。PCMでこんな特性は出ない。-120dB(0.0001%)近いTHDは測るADCにも左右される。110dB超えるSNは、DSMとかPCM以前に基板の質が大きく影響するので、通常の市販品の両面基板ではまず不可能。オーディオでのSN表示は所謂フェイクなので、実際に信号を入れて普通のSNの測り方をすると110dBを超えるものは稀。CDプレイヤーは、原理的に100dBを超える事はない。

 

 DSMなので1MHzまでの帯域でノイズレベルを見るとこう。

 

f:id:xx3stksm:20181022191022j:plain

 

f:id:xx3stksm:20181022191038j:plain

f:id:xx3stksm:20181022191059j:plain

f:id:xx3stksm:20181022191115j:plain

 

上からX64、X128、X256、X512の順番。

さすがにx512になると残留ノイズも皆無。簡単な6dB/octのアナログフィルター二段だけでここまで少ない。20kHz帯域でのノイズと、binあたりでは同じぐらいと思う。後は音を聞きたいけれど、うちのシステムに実装するためには八台作る必要がある。まあ、冬の間に縄をなう事もないので半田付けをして、来年の春頃にはなんとか。

 

 

デルタシグマ変調の原理。敗着は初手にあり。

 信号のデジタル化には、サンプリングに際して必然的に発生してしまう不要な高い周波数を如何にして取り除くかという問題が、どれだけの量子化ビットが必要かという話も含めて常に付きまとう。音声の分野で最初に始まったのは、概念としては理解しやすいPCM方式。これはあまりサンプリング周波数は考えない。標本化定理の少し上ぐらいなら良かろう、程度で終り。CDの44.1kHzのように。

 

 替りに、量子化ビットには拘った。16ビットは当時の技術水準からすると、過剰品質。ADCは勿論、DACも家庭用として価格的に実用的なものはなかった。PCM の性として、そっちに拘ってしまう傾向があるので、そこまで頑張ったんだと思う。現実のアナログ素子としては、今も16ビットはほぼ限界。単調増加を保証しているマルチビットの16ビットDACは、そんなに多くない。

 

 そんなPCMの原理的宿命を回避するのがDelta_Sigma_Modulation、所謂DSM。DSMはあまり大きなビット数を必要とせず、おそらく製造上のプロセスの関係からデジタルフィルターなどのデジタル素子との親和性も高いので、アナログプロセスの必要なマルチビットと比べて、安く高性能にできる。問題は、些かその理論的背景が複雑なので、PCM程には直感的理解が難しい事になっている。

 

 それは元々DSMが、1ビットで出来ているデルタ変調に源があって、多くの場合は1ビットで語られることが大きな要因。更には、どうして1ビットでまともな音が出るのかという、DSMの根源的な問いに対して直観的で明確な答がないという事。PCMのどうしてナイキスト周波数はたったの2倍で良いのか、よりもハードルは高い。

 

 PCMですら、デジタルのギザギザでアナログの音は出ないと未だに拒否感があるので、更にDSMの1ビットと来るならば、黒船扱いされるのも致し方なし。とはいえ、今はDSM以外のDACはとても稀なマニア向けになってしまっているのも事実。DSMが難しいかというならば、必ずしもそうではない。直感的に理解していると思っているPCMの方が、実は複雑と言っても嘘でない。

 

 それは、初めに1ビットなし。DSMの歴史は1ビットに始まっているけれど、原理的にはそうではないので。1ビットを止めてしまうと少し話は分かり易くなる。1ビットもあるけれど、今のDSMDACは6ビットぐらいが多い。解析する時も、その位が宜しい。これは単に量子化器の問題なので、ビット数はあまり関係がない。必ず出てくるノイズシェービングという一種の積分器の数は、3か5か7かで大きく変わってしまうのだけれど。

 

 下の図は大抵の教科書に出て来る、基本的な一次のDSM。但し問題なのは、ほとんどの場合は触れられてないけれど、この図は4通り存在する。入力と出力がアナログなのかデジタルなのか。アナログ(入力)-デジタル(出力)、デジタル(入力)-デジタル(出力)という按配で4種類が存在する。前者はDSMのADCで、後者はPCMからDSMへの変調器で、良く使われるのはこの2つ。この図は後者のDSM変調器で、ここではこれ以外は扱わない。ほとんど全ての教科書は、この4つを断りなく混在させるので、読む方は全く分からなくなる。おそらく、書いている人だって分かってない。分かっているならば、必ず断りを入れる。そうでないと、本人でも分からなくなる。

f:id:xx3stksm:20180914150352j:plain

 この図をとっつきにくくしているのは、Z^(-1)というやつ。俗にz変換と言われるが、これは単純に1クロック分の遅延。74HC374というICと同じもの。デジタルの話なので(ここでは全てのデータがデシタルの場合しか扱わない)、v(n)の一つ前のデータはv(n-1)で、v(n-1)=z^(-1)*v(n)が成り立つ。なので、z^(-1)がなくてもこの回路図の入力と出力の関係は数式化できる。

 

 出力のv(n)を1クロック遅らせたものを入力のu(n)から引いて(u(n)-v(n-1))、これに量子化器の入力であるy(n)の1クロック遅延を足したのがy(n)。

つまり、 y(n)=u(n)-v(n-1)+y(n-1)

知りたいのは入力のu(n)と出力のv(n)の関係なので、量子化器の入力のy(n)は些か邪魔だけど、量子化器という線形でないものを含むので多分これは仕方ない。

 

 この数式が全てのDSMの基本であるけれど、これが何を意味するのかは全く分からない。元々DSMも、デルタ変調に積分器を入れてみたら上手く行った、という偶然の要素から生まれているのので、これは結果オーライしてしまった。

 

 そこで少しばかり発想を変える。このようにして出力を入力に戻すと、これはOPアンプのNFBのように機能する。量子化器のために出力は入力と同じになる事はない。つまり必ず歪は存在する。しかしNFBなので、量子化器で決まるある一定値を超えて出力が入力に外れる事はない。なので誤差つまりは歪は、そんなに大きくならないのではと期待できる。ならばと、デジタルの単純なNFBを考える。こんな具合。

f:id:xx3stksm:20180914150410j:plain

 量子化器の入力y(n)と出力v(n)の差であるy(n)-v(n)を1クロック遅延させてから入力のu(n)に足し、これを量子化器の入力y(n)とする。量子化器で発生する誤差を入力にNFBするだけ。これは1クロックの遅延がミソ。この遅延がないと、デジタルの回路はNFBであっても発振してしまう。エクセルでは、巡回参照のエラーとなる。

 

 この場合のy(n)は、

y(n)=u(n)+y(n-1)-v(n-1)となる。これは前述の

y(n)=u(n)-v(n-1)+y(n-1)と同じ結果。つまり、デルタ変調から発生したDSMの基本回路とは、単純なデジタルのNFB以外の何物でもない。一次のDSMとは、量子化器で発生する誤差を入力にNFBさせているだけの事。

 

 この2つの図は機能的には同じ。最初のは積分器というのが入っているので、さてこれは何だろうかと引っかかる。積分器なので、入力が直流であるとかならず飽和する。積分器とは足し算なのだから。なので符号を変えて足している。所謂NFB。2つ目はならばとNFBを考えただけで、積分器だとかDSMだとかノイズシェービングとかは一切考えていない。必要もない。 

 

 この数式は、z変換とも無縁な単なる漸化式なのでシミュレーションは容易。エクセルで簡単にできる。今はmatlabとかpythonが主流で、エクセルはお子様ランチみたいな感なきにしもあらず。でも漸化式を視覚的に一つ一つ追いかけるのであれば、表計算に勝るものなし。こんな具合に視覚化できるのが一番良い。

f:id:xx3stksm:20180914151512j:plain

 これは5ビットの量子化器を使っている。どうもハードウエア化する場合、6よりも5のほうが上手く行くので。カラムのEが量子化器の出力。入力を16ビットで6kHzにして48kHzでサンプリング。64倍のオーバーサンプリングで計算。どうしてオーバーサンプリングかという問いは、誤差であるカラムFをグラフ化すると、感覚的に理解できる。 

f:id:xx3stksm:20180914152139j:plain

 青が量子化器の出力v(n)。ほとんど重なって見えないけれど、緑が入力のu(n)。赤が量子化器での誤差であるy(n)-v(n)。もしも青が緑と同じであれば、赤はゼロで誤差がないという事。赤のFFTをとればこのNFB回路、つまりは一次のDSM変調器の歪が分かる。赤を、カラムFを小さくすれば、この5ビットDSMの歪は減るという話。

 

 縦軸の電圧方向は単純。量子化器のビット数を上げれば小さくなる。今は5ビットなので1/32ぐらいの最大値となっている。但し、問題は音声帯域内での歪なので、あまり電圧方向は効果がない。このコサイン波形は6kHzなので、赤の時間軸方向の解像度はかなり高い。解像度の高さは高い周波数成分を意味するので、全体のレベルは高くても音声帯域での歪成分は小さい筈。つまりは、音声帯域では低く帯域外では上がる、所謂ノイズシェービングが自動的にかかっている。

 

 さらに2倍して128倍にしたならば、更に高い周波数成分を意味するので音声帯域の歪は減る。電圧方向(量子化ビット)よりも、周波数方向の対策(オーバーサンプリング)が有効だという事を赤は言っている。実際のFFT結果はこう。

f:id:xx3stksm:20180914153657j:plain

 こんな単純なデジタルNFBでも-66dB(0.05%)ぐらいの歪。16ビットのPCMの場合も、同じように入力と出力と誤差をグラフ化するとこう。

f:id:xx3stksm:20180914154048j:plain

 

 言うまでもなく、赤のPCMでの誤差はかなり大きい。電圧方向は16ビットあるのでほぼ無視できるけれど、時間軸での歪が大きいので。8点しかサンプリングできないので当然と言えば当然。DSMでの赤とはかなり違う。但し誤差のスペクトル(対域外に無限に出るイメージ)は、サンプリング周波数の整数倍の両脇に大きなピークが出来るので、デジタルフィルターやアナログフィルターで取り易い。

 

 FFTから分かるように、ナイキスト間隔内では圧倒的にPCMが有利。16ビットの理論値とほぼ同じで0.001%ほど。しかし42kHzと54kHzには、10%を超える歪が出る。更に上の所にも無限に出る。いくら電圧方向に拘っても、PCMには限界がある。これは標本化定理の要求する理想フィルターとも通じる。時間軸方向を考えないと無意味。

 

 DSMは電圧方向は最初から捨てている。その方が製造上のメリットがあり、尚且つ帯域内での歪も減らせるので。両者の誤差の赤の波形が意味する所は大きい。少し想像力を働かせると、何故にデジタルフィルターのタップ数が理想フィルターとしては全く無力かの答がある。

 

 オーバーサンプリングしないならば、横方向の解像度は6kHzを48kHzサンプリングすると、8しかない。縦は65536あったとしても、これは65536x8の解像度で、緑のような滑らかな曲線が書けるかという問題で、勿論無理。DSMは前提としてオーバーサンプリングするので、この場合は32x512の解像度で緑を描けという話になる。これはほぼ描けるので、つまりはタップ次第。オーバーサンプリング無しのPCMでは原理的に不可能。タップは無関係。

 

 後は一次の積分器でも-66dBの歪なので、積分器の次数を上げて五次ぐらいまで増やせば、帯域内の歪は64倍のオーバーサンプリングでも、-140dBぐらいになる。これは入力に24ビットを想定すると、もう上がり。デジタルの領域での歪はないと言える数字。現実の世界では些かの制約が出るけれど、-120dBぐらいの歪は特に難しくない。これはPCMでは絶対に不可能な数字。

 

 単純な一次のDSMを5ビットぐらいで量子化し、その誤差を視覚化するとその中身はPCMよりもずっと元の入力信号に近く、本質的な意味合いが分かる。1ビットに拘ってしまうと、尚且つ歴史的経緯に沿った回路で解析しようとすると、もうお手上げ。物理的な意味合いがまるで分らない。DSMとは基本的にデジタルのNFB回路にしか過ぎないけれど、次数を上げた実用的な回路から元の意味合いを辿るのは難しい。

 

 最後に参考までに1ビット。こうなってしまうので、これでは元も子もなし。頼りになるのは数式だけで直感はきかない。理学的にはアリとしても、工学的にはなし。これが使い物になるとは到底思えないけれど、意外と帯域内での歪は小さくて、 -49dB。DSMと1ビットを結びつけるべきではない。初めの1手を間違えているので、もうにっちもさっちも行かなくなる。敗着は初手にあり。これをやってしまうと、もうDSMは数式の闇の彼方に消えて行くのみ。

f:id:xx3stksm:20180914182707j:plain

 

f:id:xx3stksm:20180914182726j:plain

 

 1ビットの場合は、多ビットの比較上1と-1で二値化。1ビットでは、二次までこのシミュレーションが可能。三次以上は必ず不安定になるので無理。その理由は意外と単純。1ビットDSMのDSDに関しては、信号を疎と密で表すと説明されることがある。嘘ではないけれど、実用的にそれはあり得ないので、そういうものは実験室以外には存在しない。

 

 確かに上の図で、信号が最大値や最小値に近い所では出力にほとんど変化がなくて、疎になっている。二次でもだいたいこうなる。しかし3次以上では不安定。3次以上とは別の言い方をするならば、ノイズシェービングで歪をより高い周波数に持っていくという意味。そうすると一次の時のように、出力がずっと同じ状態にとどまる事は出来ない。高次のノイズシェービングとは、常に変化する密の状態でないと成り立たない。高い周波数とは、常に変化している状態。

 

 疎は無くなって密ばかりになる。だから高い周波数に歪成分を動かせる。3次以上のDSMには密しかない。それが変調度の制約になる。1ビットの高次DSMに、50%を超える変調度はない。密を維持するために出力は常に変化している。最大値を出したい時も、1、1、1、1というような並びはなくて、1、1、-1、1のように4つのうち一つは-1を混ぜる必要がある。密のゴリ押し。

 

 結果として、最大値は(1+1+1+1)/4=1ではなくて、(1+1-1+1)/4=0.5にしかならない。最小値も-0.5で、出せる最大振幅は2ではなくて1。その制約下で入力が絶対値で0.5以上のレベルになると、もう股裂き。忠ならんと欲すれば考ならず。腸捻転でもがいた挙句、発振するしかなくなる。帰還の係数の問題でなく、原理的に変調度は50%まで。

 

 1ビットの3次以上が不安定になりやすいというのは嘘で、50%を超える変調度は原理的に不可能。入力のレベルを50%以下に制限しないと、高次の1ビットは機能しない。制限すれば問題なく動作する。自分で試さないと、この問題の本質は分からない。そのためか1ビットの変調度の制約に関する話は、ほとんど見かけない。5ビットぐらいあると、勿論この問題はほとんどなくなる。

 

 現実論としては、量子化ビット数はあまり歪に関係しないので、5次であれば1ビットも変調度に気を付ければデジタル領域では実用になる。アナログにまで変換するのであればまずは無理。市販のDACチップはモノリシックで、内部にアナログ回路が入っているから実用になる。それと同じ性能を、外付けのハイブリッドで出すのは無理。

 

 1ビットにDACの精度は不要なので、ロジックICをDACとして使うことも可能。これを更に発展させて、アナログのFIRフィルターと組み合わせると、そこそこは行く。でも色々な問題があって、数字としては90dBぐらいのSNが限界でCDには届かない。実用的には問題がないので、これは結構人気があるのも事実。

 

 多ビット型のDSMであれば、110dBぐらいのSNは可能。これはほとんど市販のDACチップと同じ数字。FPGAと高速のRF用DACで実現可能。この組み合わせであれば、1ビットでも同じSNを確保できる。この場合は、敢えて1ビットにする理由もなくはないので。