SSDAC

スーパーサンプリングD/Aコンバータ(SSDAC™)について

2024年10月 3日 (木)

SSSRC( スーパーサンプリング・サンプリングレートコンバータ ) ソフトウェア公開

SSDACのPCアプリによる実装について、これまで次の記事で説明してきました。

SSDACをパソコン上のPythonで実装する ①

SSDACをパソコン上のPythonで実装する ②

これらの記事では、SSDACの目的や原理について説明し、
新たな発見として、スーパーサンプリングによってアップサンプリングしたwavデータは、一般的な市販品のオーバーサンプリングDACで再生しても新たにプリエコー、ポストエコーが発生しない、ということがわかりました。

ソフトウェアでスーパーサンプリングを行うことは、スプライン関数によって補間データを追加してファイルを生成していることから、スプライン関数補間によるサンプリングレートコンバートを行っているということになりますから、入力がCDフォーマットの44.1kHz16bitフォーマットの出力ファイルは、たとえば88.2kHz24bit(2倍スーパーサンプリング)、176.4kHz24bit(4倍スーパーサンプリング)という具合になります。

前回の記事では、88.2kHzサンプリング音源でプリエコー、ポストエコーが発生したとしても、その周波数は44.1kHzなので、聴感上の悪影響はほとんどないであろう事を予想していましたが、実際の検証では、スーパーサンプリングでアップサンプリングしたデジタル信号は、その後オーバーサンプリングDACで処理しても、プリエコー、ポストエコーが発生しない、という意外な結果を得ました。

また、前回までPC上のプログラミング言語Pythonを使ってスーパーサンプリングを実装し検証しましたが、Pythonはインタープリタ言語(逐次翻訳型言語)であることから非常に処理が遅く、15秒の音楽ファイルを処理するのに数時間かかるという具合で、およそ実用的ではありませんでした。

そこで今回は、wavファイルをスーパーサンプリング処理して同じくwavファイルで出力する、サンプリングレートコンバータ、名付けて、
スーパーサンプリング・サンプリングレートコンバータ(SSSRC)をC#コンパイラで実装しましたので、次の通り公開します。

今回作成したSSSRCソフトの仕様は次の通りです。

入力フォーマット : 44.1kHz 16bit (CDフォーマット)
出力フォーマット : 88.2kHz、176.4kHz、352.8kHz、705.6kHz(いずれも24bit)


●ダウンロードと使い方
このソフトはwindows10またはwindows11上で動作します。

ダウンロード - sssrc.zip

SSSRC.zipをダウンロードして任意の場所に解凍したら、SSSRC.exeをダブルクリックして実行します。
このとき、.NETのランタイムがインストールされていないと、次のようなエラーが出ることがあります。

Sssrcnet1
図1..NETランタイムがない場合のエラー

この場合は”Download it now”をクリックして、.NETランタイムをインストールしてから、あらためてSSSRC.exeを実行してください。


●使い方
図2はSSSRCの起動画面です。

Sssrc
図2.SSSRC起動画面


使い方は簡単で、希望するスーパーサンプリング倍率(Super Sampling Ratio)を選んで、変換したいwavファイル(44.1kHz16bitのみ)を、この画面上にドラッグ&ドロップすると、元のwavファイルと同じ場所に”SS_OUTPUT”ホルダが生成され、その中にアップサンプリングされたファイルが生成されます。複数ファイルを一括してドラッグ&ドロップすることができます。
変換時間は、私の古いパソコン(第5世代Corei7(2core)、メモリー16GB、windows11)で、4分(約40MB)のwavファイルを88.2kHzに変換するのに35秒、705.6kHzに変換するのに1分30秒かかりました。

実際にこのソフトで処理した信号の波形を見てみましょう。代表例として、1kHzの方形波と正弦波を4倍スーパーサンプリングでアップサンプリングした場合の波形を図3、図4に示します。

1korg
図3.元波形(44.1kHz16bitサンプリング)


1k4x
図4.4倍アップサンプリング波形(176.4kHz24bitサンプリング)

以上のように、スプライン関数による補間によりアップサンプリングしたファイルが出力されます。

ここで注意したいのは、出力ファイルの容量です。アップサンプリング倍率に加えて、ビット分解能が16bit→24bitと1.5倍となることから、
出力ファイルはアップサンプリング倍率x1.5倍の容量になります。
たとえば長さ4分で約40MBのwavファイルは、2倍アップサンプリングでは3倍の120MBに、16倍アップサンプリングでは24倍の960MBになりますので、ストレージを圧迫します。要注意です。

今後、今回のSSSRCで元ファイルをアップサンプリングして通常のDACで再生したものと、元ファイルをそのまま通常のDACで再生したもの、また、元ファイルをハードウェアのSSDACで再生したものの違いについて聴き比べと検証を行う予定です。


| | | コメント (0)

2024年9月27日 (金)

SSDACをパソコン上のPythonで実装する ②

【今回の結論】
・WAVファイル再生時の前処理として、スーパーサンプリングを応用したアップサンプリング処理をしておけば、通常のオーバーサンプリングDACによる再生においても、プリエコー、ポストエコーによる音質への悪影響をSSDACと同程度に軽減できる。


前回の記事では、Windows上でPythonを使ってSSDACを実装し、補間の様子をグラフで確認しました。
今回はPythonで実装したSSDACで、実際のWAVファイルを処理して、結果を同じくWAVファイルで取り出し、効果を確認、検証します。

なお今回も前回に引き続き、PythonによるSSDACの実装コードを公開します。今回は任意WAVファイルに対して、任意のスーパーサンプリング倍率処理を施したWAVファイルを出力するもので、名称はSSSRC(スーパーサンプリング・サンプリングレートコンバータ)です。

SSDAC(スーパーサンプリングD/Aコンバータ)の目的は何かというと、過渡的な信号を再生する際に、従来から行われているオーバーサンプリングで原理的に発生するプリエコー、ポストエコーというノイズを抑えることです。

図1に、一般的なDACデバイスを使用して過渡的な信号を再生した場合の典型的なプリエコー、ポストエコー発生の様子を、図2にSSDACを使用してプリエコー、ポストエコーが抑えられた波形を示します。

Ess_20240926181001
図1.ESS9018K2Mによるポストエコー、プリエコー


Tek0053_20240926181001
図2.スプライン関数補間により、プリエコー、ポストエコーが抑えられる


図1に示すように、従来のオーバーサンプリングデバイスではプリエコー、ポストエコーが発生し、その周波数はサンプリング周波数の半分です。たとえばCD音源の場合はサンプリング周波数が44.1kHzなので、プリエコー、ポストエコーの周波数は22.05kHzです。ヒトの可聴周波数帯域は20kHz上限といわれていますから、22.05kHzのノイズが直接聞こえることはないと思われますが、CDには20kHzまでの信号が記録されていて、たとえば記録上限の20kHzの音が再生されたとき、これが22.05kHzのプリエコー、ポストエコーと干渉して、その差分すなわち2.05kHzのビートが発生する可能性があります。このようにプリエコー、ポストエコーが発生すると、音源に含まれるすべての周波数帯域との間でビートが発生することになり、これが聴感に影響を与えます。
このようなことが起こらないように、プリエコー、ポストエコーの発生を抑えつつデータ補間を行う事を目的に考案されたのがSSDACで、同じ過渡的な信号をSSDACで再生すると、図2に示すようにプリエコー、ポストエコーが抑えられます。

ところで、上に述べたプリエコー、ポストエコーは、22.05kHzという、再生周波数上限の20kHzに近い周波数で発生することによって聴感に悪影響を与えますが、プリエコー、ポストエコーの周波数が十分高ければ、具体的にはたとえば44.1kHz、あるいはそれよりも高い周波数であれば、もし発生しても聴感上の影響はかなり小さくなるだろうと思われます。それはつまり、音源のサンプリング周波数が88.2kHzまたは96kHz以上であれば、プリエコー、ポストエコーの周波数は44.1kHzまたは48kHz以上となり、聴感への悪影響は些少であるということです。

そうすると、44.1kHzサンプリングのCD音源信号を、88.2kHzサンプリングに変換してから通常のDACで再生すれば、プリエコー、ポストエコーの影響は無視できるのではないかと考えられます。
それならばSRC(サンプリングレートコンバータ)であらかじめサンプリングレートを88.2kHzに変換しておけばよいのではないかということになりますが、これでは意味がないのです。なぜなら、SRCの原理はオーバーサンプリングと同じで、インターポーレーション後にFIRフィルタ処理を行うため、SRCの行程でプリエコー、ポストエコーが付加されてしまうからです。

そこで、2倍のスーパーサンプリング、つまりスプライン関数でデータ間1点の補間を行えば、プリエコー、ポストエコーの発生を抑えた2倍アップサンプリングが可能で、この2倍アップサンプリングデータを通常のDACで再生すれば、プリエコー、ポストエコーの影響が些少な再生が可能であると考えられます。

以上のような考察に基づいて、以下の検証を行います。

【使用音源】
a. 1kHz方形波をCDフォーマット(44.1kHz16bit)で録音したWAVファイル→元音源
b. 元音源を2倍スーパーサンプリングによってアップサンプリングしたもの→2XSS音源(88.2kHz32bit)

【評価内容】
①元音源をソフトウェア(TASCAM Hi-Res Editor)によって352.8kHz32bitにアップサンプリング
②2XSS音源をソフトウェア(TASCAM Hi-Res Editor)によって352.8kHz32bitにアップサンプリング
③上記①、②の再生波形において、プリエコー、ポストエコーの発生を比較

【評価結果】
まずは図3に元音源(1kHz方形波44.1kHz16bit sampling)の波形を示します。
ここでは補間の様子がわかりやすいように、すべての波形はデータの散布図として表示します。波形の表示にはaudacity2.4.2を使用しました。

Sq1k_org
図3.元波形(1kHz方形波 44.1kHz16bit)

この元波形を、TASCAM Hi-Res Editorを使用して352.8kHz32bitにアップサンプリングしたものを図4に示します。

Sq1k_352
図4.352.8kHz32bitにアップサンプリング


図4では、プリエコーポストエコーが発生しているのがわかります。これは一般的なDACデバイスによってオーバーサンプリング再生を行った場合と等価な結果です。


次に、元波形に対して今回作成したpythonによるSSSRCを使って2倍のアップサンプリングをした波形を図5に示します。

Sq1k_ss2x
図5.SSSRCによる2倍アップサンプリング波形

スーパーサンプリングによる補間によって、立ち上がり前後でオーバーシュートが発生する典型的な波形になっています。これは図2で示したSSDACによる波形と等価です。
これは元の波形のフォーマットを44.1kHz16bitから88.2kHz32bitにアップサンプリングしたものであると考えることができます。

次にここで得られた88.2kHz32bitサンプリングの信号を、TASCAM Hi-Res Editorを使って352.8kHz32bitサンプリングにアップサンプリングした波形を図6に示します。

Sq1k_ss2x_352
図6.SSSRCで2倍アップサンプリングしたものを、352.8kHzにアップサンプリングしたもの

これは興味深い結果で、44.1kHzのプリエコー、ポストエコーが新たに付加されることを予想していましたが、予想に反して新たなプリエコー、ポストエコーは付加されず、SSSRCによる2倍アップサンプリングの波形(エンベロープ)がそのまま出てきました。

つまり、SSSRCで前処理として2倍アップサンプリングしておくことによって、一般的なオーバーサンプリングDACデバイスにる再生においてSSDACと等価な結果が得られるのではないか?ということです。

もちろん前処理は2倍に限らず任意のアップサンプリング倍率を選ぶことができますが、ソフトによる処理では倍率が高くなるほど処理時間が増加し、生成されるファイルが大きくなります。
今回のSSSRCでは、5秒のWAVファイルを2倍アップサンプリングするのに1分40秒かかりました(^-^;


【SSSRC(スーパーサンプリング・サンプリングレートコンバータ)ソースコード】
今回もPythonによりコードを作成したので公開します。
コードの内容は前回発表したSSDACの実装とほとんど同じで、今回は補間してできあがったデータをWAVファイルとして出力する部分を追加しました。

ダウンロード - 20240924python_ssdac101.py

興味のある方はダウンロードしてご覧ください。
以下は要点です。

19行目
data_dir = 'C:\\Local_Files\\Python'
これは加工する元WAVファイルの格納ディレクトリです。

20行目
fname = '1k_1s.wav'
加工するターゲットファイルです。

26行目
ss_ratio=2 #スーパーサンプリング比
スーパーサンプリング倍率を設定します。2^nの数値を設定します。上限はありませんが、大きくするほど仕上がりのファイル容量は大きくなります。

75行目
wavfile.write(fileName, samplerate*ss_ratio, (y_all*47662).astype(np.int32))
演算したデータをWAVファイルに書き込みます。ファイル名は演算開始時刻にしており、できあがったWAVファイルの生成時刻との比較により演算に要した時間がわかります。
y_allは16bitフルスケールの整数からfloatで計算しているため、これを32bit整数に拡張してファイル出力します。スーパーサンプリングによる補間によって、信号ピークは最大1.375倍になるので、65536/1.375=47662を乗じて、フルスケールになるように調整します。

78行以降
グラフ表示部分をコメントアウトしています。

※できあがりのWAVファイルは、このソースファイルと同じディレクトリに生成されます。


【今後の予定】
今回のPC上のPythonによる実装では、多大な処理時間がかかり実用的ではないため、C#などのコンパイラによる実装で処理時間を短縮し、より実用的なものにしたいと思います。


そういうわけで、ソフト処理によってより簡単にSSDACの効果を体感できるということがわかりましたので、より多くの方々にSSDACの音を楽しんでいただきたいと思います(^-^)

【おまけ】
今回公開したPythonのファイルはWindowsパソコン上で実行できます。
もっとも簡単な方法は、Anaconda3をインストールして、同梱のSpyderを起動、pyファイルを読み込んで実行ボタンを押せば実行できます。
Anaconda3はこちらからメールアドレスを入力すればダウンロードできます。
実行結果にグラフが含まれる場合は、Spyderの右上窓のPlotsタブに表示されます。
コマンドラインでのPython実行は右下窓で実行できます。
Pythonが初めての方もぜひ遊び感覚でいじってみてくださいね(^-^)

関連記事
SSSRC( スーパーサンプリング・サンプリングレートコンバータ ) ソフトウェア公開



| | | コメント (0)

2024年7月15日 (月)

SSDACをパソコン上のPythonで実装する ①

この記事では、これまで紹介してきたSSDACを実際にパソコン上のPythonで実装し、デジタルデータをスプライン関数で補間するという作業をご理解いただきたいと思います。

今回は、まずは簡単な信号を録音したCDと同じ44.1kHz16bitのWAVファイルを読み込んで、任意のスーパーサンプリング倍率でスプライン補間した場合の波形をシミュレーションします。

最終的にはPythonで実装したソフトで、CDのデータをスプライン関数補間によってSRC(サンプルレートコンバート)したファイルを出力し、疑似ハイレゾファイルとして再生できるようにしたいと思います。

なおこの記事を書くにあたっては、スプライン関数を導出するための公式を使っています。スプライン関数の公式の詳細な説明は次の文献をご参照ください。

トランジスタ技術2018年10月号記事

電気学会論文 ECT-17-058-3

電子情報通信学会論文  ICD2017-28


1.なぜスプライン関数で補間したいのか
オーディオDACでは通常、オーバーサンプリングという技術でデータ補間を行っています。これはごくおおざっぱに言うと、上限周波数20kHzに対してサンプリング周波数が44.1kHzでは粗いので、補間してなめらかにしてから再生するということです。また、このときオーバーサンプリングによって量子化ノイズやエイリアシングノイズの周波数を高域に追いやることで、ポスト・ローパスフィルタの設計が楽にできるというという大きな利点があります。
通常、オーバーサンプリングは、データに対して補間点に0値の点を挿入(インターポーレーション)して、FIRフィルタを通すことで実現していますが、ここで使われているFIRフィルタには、過渡的な再生信号に対してプリエコー、ポストエコーと呼ばれるノイズが発生するという、宿命的な欠点があります。図1に示すように、ポストエコー、プリエコーはサンプリング周波数の半分、たとえばCDだと44.1/2=22.05kHzで発生します。
それでは、プリエコー、ポストエコーの発生を抑えつつ補間する方法はないか?ということで考案されたのが、スプライン関数による補間です。図2に示すように、スプライン関数による補間では、プリエコー、ポストエコーが大幅に抑えられているのがわかります。
これこそが、SSDAC最大の利点なのです。

Ess
図1.ESS9018K2Mによるポストエコー、プリエコー

Tek0053
図2.スプライン関数補間により、プリエコー、ポストエコーが抑えられる


2.なぜこれまでスプライン関数補間によるDACがなかったのか
飛び飛びの点をなめらかにつなぐために、たとえばEXCELでは包絡線の機能があり、これはスプライン関数によるものです。離散的な点をスプライン関数でつなぐ、という発想はごく当然なものです。それではなぜこれまでデジタルオーディオで応用されなかったのでしょうか。

スプライン関数を正確に計算するためには、開始点と終止点が確定していることが必要条件です。たとえば音楽再生で考えると、スプライン関数を計算するためには、ある曲が始まってから終了するまでのすべてのデータを使って演算する必要があるのです。そうすると、データを一曲分先読みしておいて、スプライン関数をすべて計算してから再生するということになり、再生ボタンを押してから再生開始まで、スプライン関数の演算時間を待たなければなりません。短い曲ならいいかもしれませんが、長い曲ほど演算に時間がかかります。また早送りなどをして途中から再生したい場合などには、全体を通して再生する場合とスプライン関数の演算結果が違ってしまうなどの不都合が生じます。
SSDACでは、これらの問題点について数学的なアプローチで解決することに成功しました。

3.どのように解決したのか
いま、CDからデジタル信号が入力しているとして、これは44.1kHz16bitのサンプリングなので1/44100≒22.68μsごとに-32768~32767までのいずれかの値を持つデータが1個(ステレオだと2個)送られてきますから、これをアナログの値に変換するのがD/Aコンバータの仕事です。-32768~32767の値を持ったデータは、D/Aコンバータの仕様によって、たとえば0V~2Vとか、±2.5Vとかの範囲の電圧に変換されて出力されます。

今現在D/A変換している生データをD0として、ひとつ未来の生データをD+1、n個未来の生データをD+n、ひとつ過去の生データをD-1、n個過去の生データをD-nというように、現在の生データD0を中心に、データに番号を振っておきます。

スプライン関数でデータを補間するとは、具体的には現在の生データD0から1個未来の生データD+1までの間を、

Shiki1・・・・・①

という3次関数でなめらかにつなぐということです。この式のd0は現在の生データD0です。
このときxの変域は

Heniki

であり、式さえ求まってしまえば、あとはxを細かくステップすればするほどなめらかな補間ができます。
この式でx=0のときはy0=d0=D0、つまり現在の生データ、x=1のときは1個未来の生データD+1となります。

それでは、スプライン関数の公式を使って、式1を決定するやり方を見ていきましょう。式①を決定するとは、各係数a,b,cを決定することです。

まず式①で、x^2の項の係数bを求める公式は、


Bj・・・・・②

djは入力された生データです。e,fは次式で与えられます。

En・・・・・③

Fn  ・・・・・④

ここで、αは、

Alpha

という定数です(これは発明者の小林芳直氏によってIS(Infinite Spline)定数と名付けられました)。

上記式③、④および定数αが、SSDACでスプライン関数の計算が可能になった最大のキモなので、以下に簡単に説明します。

スプライン関数の計算を実装可能にしたのは、このαという定数の発見と、それに伴い計算の打ち切り条件が算出されたことです。
これらは上述のトランジスタ技術2018年10月号にて詳しく解説していますので、ここではごくおおざっぱに説明します。
まず、現在の生データとひとつ未来の生データの間を補間するスプライン関数に与える前後の生データの影響は、1つ未来または1つ過去に遠ざかるにつれて、αを乗じた分だけ影響度が低下してゆく、ということが発見されました。つまり、式③、式④にて示されるように、ひとつ過去また未来の生データの影響度はα倍、2つ過去または未来の生データの影響度はα^2倍・・・n個未来の過去または未来の生データの影響度はα^n倍となっています。αはおよそ-0.26ですから、2乗、3乗、4乗……と乗じるごとにどんどん小さくなっていきます。
さて、式③、式④では未来または過去に13個離れた生データまでで打ち切られています。これはどうしてかというと、これらの式はデータ精度を24bit出力として得る場合のものなのですが、13個より遠い生データが現在のスプライン関数の演算結果に与える影響は24bit精度以下になるので14個目以降の生データを打ち切ることができる、ということを示しています。
どこで打ち切っていいのか、ということは、希望する出力のbit精度によって違い、次のようになります。

16bit・・・・・未来過去それぞれ9個の生データまでで、10個以降は打ち切り
24bit・・・・・未来過去それぞれ13個の生データまでで、14個以降は打ち切り
32bit・・・・・未来過去それぞれ17個の生データまでで、18個以降は打ち切り

つまり、得たい出力ビット数に応じて、ビット数/2+1までの未来過去までを演算すれば良い、ということがわかったのです。

ここまででスプライン関数のx^2の係数bが計算できたので、残りのaとcを、次の公式を使って求めます。

Aj・・・・・⑤

Cj・・・・・⑥

ここで、djは現在の生データ、dj+1は1つ未来の生データ、bjは先に計算した現在のスプライン関数の係数b、bj+1は1つ未来のスプライン関数の係数bです。

これで、現在の生データから1つ未来の生データまでを補間するスプライン関数が求まりました。

4.PC上のPythonで実装する
それでは以上に述べたスプライン関数によるデータ補間を、実際にPythonで実装してみましょう。
ここでは、CDと同じ44.1kHz16bitサンプリングのWAVファイルのデータを、スプライン関数によって補間し、補間前後の波形をグラフで表示して比較する、ということを行います。
まず筆者の作業環境ですが、windows11にAnaconda3をインストールするとJupyter Notebookが自動的にインストールされるので、これを使っています。

Jupyter Notebookを起動すると、ブラウザ上にjupyterのHomeが起動するので、ここで作業を行います。画面右上のNewのプルダウンからNotebookを選ぶと、新しくNotebookが開きますので、ここのコード入力窓にコードを入力して最終行末尾にカーソルを持って行ってshift+Enterすれば実行されます。
Pythonを使い慣れた人はanacondaに付随しているSpyderを使う方が便利かもしれません。
次のコードの下にソースコードのダウンロードリンクを張っておきます。

以下に、今回Pythonで作成したSSDACのコードを示します。

##############ここから#################################
from os.path import dirname, join as pjoin #文字列接続メソッドjoinのインスタンス定義
from scipy.io import wavfile
import scipy.io
import numpy as np

import matplotlib.pyplot as plt
from scipy.io.wavfile import read

data_dir = 'C:\\MyData\\Python'
fname = '1k_5ms.wav'
wav_fname = pjoin(data_dir, fname)

alpha=-2+3**0.5 #IS定数
ss_ratio=4 #スーパーサンプリング比

samplerate, data = wavfile.read(filename=wav_fname)

#24bit精度でスプライン関数を計算するため、データの先頭と末尾に(24/2)+1=13個の計算用ダミーデータを追加する。
padding_array = np.array([[0, 0], [0, 0], [0, 0], [0, 0],[0, 0], [0, 0], [0, 0], [0, 0],[0, 0], [0, 0], [0, 0], [0, 0],[0,0]])

data=np.vstack((padding_array,data)) #data先頭にダミーデータ13個追加
data=np.vstack((data,padding_array)) #data末尾にダミーデータ13個追加

#ファイル全体分のインパルスe,fの空の配列(L,R)を用意する
e = np.zeros(shape=(len(data),2))
f = np.zeros(shape=(len(data),2))

#ファイル全体分のスプライン関数のaj,bj,cjの空の配列(L,R)を用意する
aj = np.zeros(shape=(len(data),2))
bj = np.zeros(shape=(len(data),2))
cj = np.zeros(shape=(len(data),2))


#仕上がりデータ
y_all=np.empty((1,2)) #ここで空の配列を作る

#ファイル全体分のインパルスe,fを計算する
for i in range(13,len(data)-13):
      for j in range(0,14):
            e[i]+=(alpha**j)*data[i-j]
            f[i]+=(alpha**j)*data[i+j]

#先頭のe(-1)=0
e[12]=0
#末尾のf(+1)=0
f[len(data)-13]=0

#ファイル全体分のスプライン関数の係数aj,bj,cjを計算する
for i in range(13,len(data)-13):
      bj[i]=-3*(3**0.5-1)*data[i]+3*(2*(3**0.5)-3)*(f[i+1]+e[i-1])

for i in range(13,len(data)-13):
      aj[i]=(bj[i+1]-bj[i])/3
      cj[i]=data[i+1]-data[i]-2*bj[i]/3-bj[i+1]/3

for i in range(13,len(data)-26):
      for j in range(0,ss_ratio):
            y_all=np.vstack((y_all,aj[i]*(j/ss_ratio)**3+bj[i]*(j/ss_ratio)**2+cj[i]*(j/ss_ratio)+data[i]))

#plt.plot(y_all)

x=np.arange(0,len(data),1)
plt.xlim(24,55)
#(24,55)@1k_5ms
#(24,35)@10k_500us
plt.step(x,data[x])
plt.title(fname+" NOS Zoom in")
plt.show()

x=np.arange(0,len(y_all),1)
plt.xlim(220,350)
#(110,170)@1k_5ms_ss2
#(220,350)@1k_5ms_ss4
#(900,1400)@1k_5ms_ss16
#(0,17)@10k_500us_ss2
#(0,34)@10k_500us_ss4
#(0,80)@10k_500us_ss16
plt.step(x,y_all[x])
plt.title(fname+" SS"+str(ss_ratio)+"x"+" Zoom in")
plt.show()

x=np.arange(0,len(y_all),1)
plt.xlim(0,len(y_all))
plt.step(x,y_all[x])
plt.title(fname+" SS"+str(ss_ratio)+"x"+" All over")
plt.show()
########################ここまで########################

ダウンロード - 20240716python_ssdac000.py


今回、コードで使用するための44.1kHz16bitサンプリングの短いWAVファイルを用意しました。これはefu氏によるWaveGeneによって生成したもので、Lチャンネルに方形波、Rチャンネルに正弦波を録音してあります。

ダウンロード - 1k_5ms.wav

ダウンロード - 10k_500us.wav


まず、コードの9,10行目で、WAVファイルのディレクトリとファイル名を設定しています。

data_dir = 'C:\\MyData\\Python'
fname = '1k_5ms.wav'

ここはご利用の環境に応じて適宜変更してください。

次に14行目でスーパーサンプリング比を設定しています。これは現在の生データから次の生データまでの間を何倍のデータで補間するかを設定します。現在頒布しているSSDAC基板では、SSDAC128なら128倍、PCM1704やI2Sデバイスを使ったSSDACは16倍になっています。

ss_ratio=4 #スーパーサンプリング比

66行目以降はグラフ表示の部分で、ここでは入力信号の周波数とスーパーサンプリング比によって適切なズーム倍率で表示されるように、plt.xlimの値を変更する必要があります。これは注釈としてコード中に記載してあるので、適宜変更します。
なお、グラフ表示にあたっては、実際のD/Aコンバータと同じく0次ホールドでグラフを描画しているため、ステップ表示になります。

その他の注意点としては、上で述べたとおり、24bit精度でスプライン関数を計算するために、現在のデータの前後13データが必要になるため、ファイルから読み込んだデータの先頭と末尾に13個の0データを付け加えています(18~22行目)。

それではさっそく実行してみましょう。
まずは1k_5ms.wavを使って、4倍スーパーサンプリングの波形を見てみます。ファイルのディレクトリだけ注意して、あとは上のコードのままでいけるはずです。次のグラフが表示されれば成功です。

1k_5ms_nos
図3.1kHzの方形波および正弦波のNOS(元)データ

1k_5ms_4xss
図4.1kHzの方形波および正弦波の4倍スーパーサンプリングデータ(ズーム)


1k_5ms_4xss_all
図5.1kHzの方形波および正弦波の4倍スーパーサンプリングデータ(全体)


図3が元のデータ、いわゆるNOSでのグラフで、図4が4倍スーパーサンプリング処理をしたものです。
図4ではデータが4倍スーパーサンプリングされて、ギザギザ(量子化ノイズ)が細かくなっている様子がわかります。

次に、同じ1kHzの信号を16倍でスーパーサンプリングした波形を見てみます。
プログラムは、14行目
ss_ratio=16 #スーパーサンプリング比
と75行目
plt.xlim(900,1400)
のように変更します。

1k_5ms_nos
図6.1kHzの方形波および正弦波のNOS(元)データ


1k_5ms_16xss
図7.1kHzの方形波および正弦波の16倍スーパーサンプリングデータ(ズーム)


1k_5ms_16xss_all
図8.1kHzの方形波および正弦波の16倍スーパーサンプリングデータ(全体)


図7を見ると、ほとんど段差が見られないほどなめらかになっています。

次に10kHzの信号ではどうでしょうか。10行目を

fname = '10k_500us.wav'

14行目を

ss_ratio=4 #スーパーサンプリング比

とし、67行目を

plt.xlim(24,35)

75行目を

plt.xlim(0,34)

に変更して実行します。

10k_500us_nos
図9.10kHzの方形波および正弦波のNOS(元)データ


10k_500us_4xss
図10.10kHzの方形波および正弦波の4倍スーパーサンプリングデータ(ズーム)


図9の元データでは、正弦波の面影はなくなってしまっていますが、図10の4倍スーパーサンプリングではかろうじて正弦波が復元されているように見えます。ここでは全体データは図10とほぼ同じくなるため省略します。

次に同じ10kHzの信号を16倍スーパーサンプリングします。14行目を

ss_ratio=16 #スーパーサンプリング比

に変更し、75行目を

plt.xlim(0,80)

とします。

10k_500us_16xss
図11.10kHzの方形波および正弦波の16倍スーパーサンプリングデータ(ズーム)


元のデータは図9と同様です。
16倍スーパーサンプリングでは図10と比べてかなりなめらかになりました。全体波形は図11とほぼ同じなため省略します。


スプライン関数によって信号補間を行うSSDACの動作がご理解いただけたでしょうか。
このプログラムにより、今回ご用意した1kHz、10kHzの正弦波、方形波の他にも任意のWAVファイルを処理することができ、スーパーサンプリング倍率も任意に設定可能です。ぜひいろいろな波形、いろいろな条件で試していただきたいと思います。

さて、この記事の続編として、今回と同じくPythonで記述したソフトによってスーパーサンプリングした信号をファイルとして取り出し、擬似的にハイレゾ化する検証をする予定です。つまりスーパーサンプリングによるSRC(サンプリングレートコンバーター)です。

通常、アップサンプリングしたからといって音質が良くなるわけではなく、条件によってはFIRフィルタの使用によってプリエコー、ポストエコーが付加されるなど、百害あって一利無し、と考えられますが、スーパーサンプリングによってアップサンプリングし、それを市販のDACで再生した場合、発生するプリエコー、ポストエコーの周波数はスーパーサンプリングの倍率分高くなりますので、聴感上の悪影響が減少すると考えられます。

関連記事
SSDACをパソコン上のPythonで実装する ②

SSSRC( スーパーサンプリング・サンプリングレートコンバータ ) ソフトウェア公開





| | | コメント (0)

2023年11月 7日 (火)

SSDAC128 and デジタルRIAAイコライザ デュアル基板(基板頒布あり)

Dpeq_titlepic

前回の記事で、SSDAC128_I2S基板に装着するデジタルRIAAフォノイコライザ・サブ基板を発表しました。

これは従来のSSDAC128_I2S基板のFPGA回路を、デジタルRIAAフォノイコライザに書き換えることで実現しました。
従来通りAmaneroCombo384からのUSB入力で信号再生可能ですが、AmaneroCombo384の代わりにデジタルRIAAフォノイコライザ・サブ基板DPEQ000を装着することにより、レコードプレイヤーから直接入力ができ、リアルタイムでの再生が可能です。
ただし、デジタルRIAAフォノイコライザとして使用するためにFPGAの書き換えが必要で、再びSSDACとして使用するには再度FPGAをSSDACに書き換える必要がありました。

今回は、SSDAC128_I2S基板で使用するFPGAを、10M08SCE144C8Gから10M08SAE144C8Gに変更することで、SSDACとデジタルRIAAフォノイコライザ回路の両方を実装し、電源投入時のDIPスイッチの設定で選択できるようにしました。生基板は従来と共通のSSDAC128_I2S基板です。

レコードファンにとってはかなり便利になったと思います。
また、デジタルRIAAフォノイコライザ・サブ基板DPEQ000にはカートリッジ出力をプリアンプで増幅した信号がRCAで出力されているので、レコードの生音をパソコンでリッピングするときに便利で、レコードの生音を使ったソフトウェアフォノイコライザの検証などに役立ちます。

この記事の下の方にすべての資料とFPGAのオブジェクトファイルを公開します。自力で製作したい方は次の手順で行ってください。

①回路を組む
回路図を参照して、回路を組んでください。
ユニバーサル基板でもできると思いますが、回路規模を考えると、生基板を購入されることをお勧めします。
FPGAは10M08SAE144C8Gです。従来の10M08SCE144C8Gではないので購入時に間違えないように注意してください。
SSDAC128_I2S基板は、従来と比較してジャンパ配線が一箇所、LEDと抵抗をそれぞれ3個ずつ追加となります。資料を参照してジャンパ線と部品の追加を行ってください。

②FPGAにオブジェクトファイルを書き込む

PCと製作した基板をダウンロードケーブル(USB-Blaster)で接続し、FPGAにSSDACとRIAAイコライザのデュアルブートが可能なオブジェクトファイル(SS_RIAA.pof)を書き込みます。このオブジェクトファイルはデュアル・コンフィギュレーションのオブジェクトなので、QuartusPrime Programmerで図1のように、CFM0,CFM1の2つにチェックを入れて書き込みます。


Ssdac_riaa_write
図1.QuartusPrime Programmerによる書き込み
     CFM0とCFM1にチェックを入れて書き込みます。


これで、電源投入時のDIP SWの設定によってSSDACとRIAAフォノイコライザが選択できる基板の完成です(^-^)

詳しい仕様は、以下の資料をご参照ください。

製作マニュアル(SSDAC128_I2SDual)
図表(SSDAC128_I2SDual)
取扱説明書(SSDAC128_I2SDual)
電気学会論文

製作マニュアル(DPEQ000)
図表(DPEQ000)
取扱説明書(DPEQ000Dual)

FPGAオブジェクトファイル(10M08SAE144C8G用)


次の5種類を頒布します。(すべて税、送料込み)

①全部品実装基板セット(SSDAC128_I2SDualとDPEQ000のセット) 77000円
・全部品を実装し、動作確認済みの基板セットです。
・AK4490にはAK4490REQを使用しています。
・Amanero COMBO384は含まれません。
・すべて手実装です。
・DPEQ000のOPAMPはNJM4556AD。
・納期:2週間程度(受注生産)

②全部品実装基板(SSDAC128_I2SDualのみ) 72000円
・全部品を実装し、動作確認済みの基板です。
・すべて手実装です。
・納期:1週間~10日程度(受注生産)

③書き込み済みFPGA実装基板SSDAC128_I2SDual 27000円
・書き込み済みFPGAのみ搭載した基板です。
・すべて手実装です。

・納期:1週間程度(受注生産)

④全部品実装基板セット(動作確認済み)、AmaneroCOMBO384、電源トランスセット 98000円
・全部品を実装したSSDAC128_I2S基板、DPEQ000基板およびAmaneroと電源トランスのセットです。
・すべて手実装です。
・AC電源ケーブルおよび電源スイッチ、ヒューズ等はご用意ください。
・納期:2~3週間程度(受注生産)

⑤生基板セット 4700円
・AK4490EQおよびAK4490REQに対応したSSDAC128_I2SとDPEQ000の生基板セットです。
・生基板のみの販売です。FPGA用pofファイルをダウンロードしてお使いいただけます。
・納期:3~5日程度


購入ご希望の方は表題に「SSDAC_RIAA基板頒布希望」とお書きのうえ、
dj_higo_officialアットhigon.sakura.ne.jp(アットを@に換えて)までメールにて
お申し込みください。
※ご希望のセット番号と、お名前、ご住所、電話番号をお書きください。
折り返し、代金振込先等のご案内をお送りします。

製造・頒布はSLDJ合同会社が行います。

| | | コメント (0)

2023年10月28日 (土)

デジタルRIAAフォノイコライザ・サブ基板(基板頒布あり)

Dpeq_titlepic
写真1.デジタルRIAAフォノイコライザ・サブ基板を搭載したSSDAC128_I2S基板
128倍スーパーサンプリングD/Aコンバータ基板SSDAC128_I2Sに対し、サブ基板を追加して、FPGAを書き換えることでデジタルRIAAフォノイコライザを構成しました。


【参考記事】
RIAAフォノイコライザをIIRデジタルフィルタで実装する ①準備編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ②係数計算編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ③シミュレーション編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ④実装・評価編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ⑤Octaveによる位相検証


以前、FPGAによるデジタル回路でRIAAフォノイコライザを構成する検討しましたが、今回はその総集編として、SSDAC128_I2S基板にサブ基板を追加する形でデジタルRIAAフォノイコライザを製作しました。ADCスペックは96kHzサンプリング24bitです。

もともと、デジタルフィルタでフォノイコライザを製作することにはあまり意味がないと考えていました。
というのは、レコードをよい音で聞こうと思ったら、まじめに作ったCR型のフォノイコライザを通して、アナログアンプで増幅して聴けばよいと考えていたからです。
それなら、なぜデジタルRIAAイコライザを作ったのかというと、デジタルフィルタとFPGA(VHDL)の練習をするのにとてもよい課題だと思われたからです。
当時バラックでデジタルRIAAイコライザを組み立てて、動作を確認してデータをとり満足したので、もう作る必要はないと考えていましたが、SSDAC基板が完成した今、USB入力インタフェイスであるAmaneroの代わりに、I2Sを出すことのできる小基板を載せれば、SSDAC基板は汎用のオーディオDSP基板として使えるということに気がつき、その応用例としてデジタルRIAAフォノイコライザを作ってみました。

実際に作って音を聴いてみると、思いのほか音がよいことに驚きました。
アナログでフォノイコライザを組む際には、イコライザ回路に使うコンデンサに何を選ぶかに悩まされ、ここでお財布とも相談する必要があったりします。
その点デジタルフォノイコライザでは、コンデンサはカップリングとパスコンや平滑コンしかないのであまり悩む必要はなく、主に音質に影響を与える部品はプリアンプのOPAMPにほぼ限られ、ソケットにしておけば後から変更も可能です。
今回はプリアンプの出力をRCAで取り出せるようにしたので、パソコンにつないでレコードの生音をリッピングして、パソコンのソフトでイコライザの検討をするなど、いろいろな応用ができます。

今回製作したサブ基板を写真2に示します。

Inout1114
写真2.デジタルRIAAフォノイコライザ・サブ基板

このサブ基板を、SSDAC128_I2S基板のAmaneroの代りに挿し、FPGAの回路をデジタルRIAA回路に書き換えることで、デジタルRIAAイコライザ基板として使えるようになります。

主な特徴は次の通り

・ADCデバイスにPCM1808(96kHz24bit)を使用
・プリアンプゲインは0~470倍可変(ジャンパピンにより0~47倍も可)
・プリアンプ出力RCA端子搭載により、パソコンなどの外部機器へダイレクト出力が可能
・Amaneroを使用して、ダイレクトリッピングした音楽信号をパソコンから入力してRIAAイコライジング出力が可能
・プリアンプ用のOPAMPは2回路入りDIP8PINを採用し、ソケットとすることで換装可能
・出力はDAC8820、AK4490、PCM5102のすべてから選択可能
※FPGAをデジタルRIAAに書き換えると、スーパーサンプリングは機能しません。NOSまたは各DACデバイスのオーバーサンプリング処理となります。

詳しい仕様は、この記事冒頭にリンクした過去記事と、下にリンクした資料をご参照ください。

製作マニュアル
図表
取扱説明書
FPGAオブジェクトファイル(10M08SCE144C8G用)

次の2種類を頒布します。(すべて税、送料込み)

①全部品実装基板(動作確認済み)5800円
・すべて手実装です。
・OPAMPはNJM4556AD
・納期:2週間程度(受注生産)

②生基板 1600円
・生基板のみの販売です。

※本基板を使用するには、別途SSDAC128_I2S基板が必要です。

購入ご希望の方は表題に「DPEQ基板頒布希望」とお書きのうえ、
dj_higo_officialアットhigon.sakura.ne.jp(アットを@に換えて)までメールにて
お申し込みください。
※ご希望のセット番号と、お名前、ご住所、電話番号をお書きください。
折り返し、代金振込先等のご案内をお送りします。

製造・頒布はSLDJ合同会社が行います。


ぜひお試しください!

| | | コメント (0)

2023年10月16日 (月)

各種SSDAC基板 頒布再開のお知らせ

FPGA入手難につき、各種SSDAC基板の頒布を中止しておりましたが、

このたびようやくFPGAが入手できましたので、頒布を再開いたします。

引き続きよろしくお願いします。

| | | コメント (0)

2023年4月24日 (月)

各種SSDACの信号ひずみ率 THD+N の比較(20230506データ追加)

【20230506】SS128基板のPCM5102出力および市販DAC(AK4396、PCM2704、ES9018K2M)のデータを追加しました。

デジタル音楽データをスプライン関数で補間するSSDACについて、実際に波形がどのように補間されているかはこれまで波形を紹介してきたが、今回は1kHzの正弦波信号を再生した場合の全高調波歪率+雑音(THD+N)がどうなっているかを紹介する。
比較参考用として、同じ測定系で市販DACデバイスAK4396、PCM2704、ES9018K2Mの測定を行った(20230506追加)。

測定条件は次のとおり。

パソコンOS  :windows XP
正弦波発生   :WaveGene1.4    44.1kHz、F32bit
FFT       :WaveSpectra1.4  96kHz、24bit
サウンドカード  :SoundBlaster Premium HD

windowsXP上のWaveGeneで正弦波を発生させ、USBでSSDACのAmaneroに入力、
SSDACのアナログ出力をSoundBlasterのラインに入力し、WaveSpectraで測定した。

SSDACの測定結果を表1に、市販DACの測定結果を表2にそれぞれ示す。

表1. 1kHz正弦波再生時の全高調波歪+雑音(THD+N)
20230506thd_table2_20230506160801


表2.市販DACの1kHz正弦波再生時の全高調波歪+雑音(THD+N)
20230506thd_table3


スーパーサンプリングのTHD+Nが最小なのはSSDAC128基板AK4490出力の0.00268%、最大だったのは同基板PCM5102出力の0.00907%だ。これは+Nの部分が支配的だが、耳で聞いてわかるほどの差はない。
また、NOSのTHD+Nは多くが4%前後と、非常にわるい結果となっているが、これは信号周波数1kHzとサンプリング周波数44.1kHzのエイリアシングが出ており、測定系が96kHzであったために観測された(下記参照)。
PCM5102NOS出力のTHD+Nは他の4%前後より大幅に低い0.0933%になっているが、これは出力回路のローパスフィルタのカットオフが低いため、44.1kHz±1kHzのエイリアシングのレベル低下による。

代表例としてSSDAC128の16bitDAC、DAC8820の128倍スーパーサンプリング出力のFFTを図1に、同NOS出力のFFTを図2に示す。

Ss8820
図1.SS128のDAC8820スーパーサンプリング出力


Nos8820noise
図2.SS128のDAC8820 NOS出力


図1、図2の比較において顕著なのが図2のAで示したエイリアシングで、これがTHD+NがNOSで約4%になっている主な原因だ。信号周波数が1kHzに対して、サンプリング周波数が44.1kHzであるため、44.1kHz±1kHzのエイリアシングが発生している。
また、Bで示した範囲にもノイズが発生していることがわかる。
これらのノイズは、図1のスーパーサンプリング出力では抑えられている。

以上のとおりTHD+Nは同じスーパーサンプリングでも、デバイスやスペックの差により最小0.00268%から最大0.00907%と開きがあるが、音を聞く限り、この差はあまり音質に影響していない。
音の傾向に影響をもたらすのは、マルチビットかΔΣか、あるいは中間型のアドヴァンスドセグメントかの違いが大きいのではないかと思われる。

主観的な傾向としては、PCM1704、PCM1702およびDAC8820のマルチビットDACは表情が繊細、アドヴァンスドセグメントのPCM1795はビビッドで鮮烈、AK4490やPCM5102はそれらの中間のような印象がする。



| | | コメント (0)

2023年4月16日 (日)

【修正情報】SSDAC使用時のWindows10の設定について

[Correction Information] Windows 10 settings when using SSDAC

パソコンからSSDACを使用する場合に、
過去記事「SSDAC使用時のパソコン設定について」においてCDからリッピングした16bit 44.1kHzサンプリングのWAVファイル再生について、windows10のコントロールパネル→サウンド→Amanero(使用する再生デバイス)のプロパティ→詳細で、「既定の形式」を「2チャンネル、16ビット、44100Hz(CDの音質)」を設定することとしていましたが、windows10の仕様(あるいは不具合)により、16bit設定時のみノイズが発生することを確認しました。つきましては、16bit設定を使用せず、24bitまたは32bit設定を使用してください。

【例】CDからリッピングしたWAVファイル(16bit 44.1kHz)を再生する場合、windowsの「既定の形式」を
●「2チャンネル、24ビット、44100Hz(スタジオの音質)」
●「2チャンネル、32ビット、44100Hz(スタジオの音質)」
のいずれかに設定します(16ビットは使わないでください)。

つまり、サンプリングレートを再生するファイルに合わせ、ビット深度は24ビットまたは32ビットを選択してください。

詳細については以下のとおりです。

When using SSDAC from a computer, regarding playing WAV files ripped from a CD at 16-bit 44.1kHz sampling in the past article "Regarding computer settings when using SSDAC", it was recommended to set the "default format" in Control Panel -> Sound -> Amanero (playback device used) properties -> Advanced to "2 channel, 16 bit, 44100Hz (CD quality)". However, it has been confirmed that noise occurs only when the 16-bit setting is used due to Windows 10 specifications (or a bug). Therefore, please use the 24-bit or 32-bit setting instead of the 16-bit setting.

For example, when playing a WAV file (16-bit 44.1kHz) ripped from a CD, set Windows "default format" to either "2 channel, 24 bit, 44100Hz (studio quality)" or "2 channel, 32 bit, 44100Hz (studio quality)" (do not use 16 bits).

In other words, please select 24-bit or 32-bit depth depending on the file's sampling rate for playback.

For more information, please refer to the following.


【詳細説明】

過去記事「SSDAC使用時のパソコン設定について」において、パソコンのサウンドの設定を、再生する音声ファイルのフォーマットに合わせるということを書いたが、
その後の調査で、パソコンのサウンド設定の「既定の形式」が16bit(44100Hz、48000Hz、88200Hz、96000Hzのすべて)の場合のみ、無音時にノイズが乗る現象を確認した。現象は以下のとおり。

●16bit 44.1kHzサンプリングフォーマットの1kHz正弦波Lchのみ(Rchは無音)を、パソコンのサウンド設定「既定の形式」を「2チャンネル、16ビット、44100Hz(CDの音質)」に設定して再生した場合の、AmaneroCombo384のI2S出力を図1に示す。

[Detailed Explanation]

In the past article "Regarding computer settings when using SSDAC," it was mentioned to adjust the sound settings on the computer to match the format of the audio file being played. However, after further investigation, it was confirmed that when the "default format" of the computer's sound settings is set to 16-bit (all of 44100Hz, 48000Hz, 88200Hz, and 96000Hz), noise occurs during silent periods. The phenomenon is as follows:

Figure 1 shows the I2S output of the Amanero Combo384 when playing only a 1kHz sine wave on the L channel (with R channel silent) of a 16-bit 44.1kHz sampling format, with the computer's sound settings set to "2 channel, 16 bit, 44100Hz (CD quality)" as the "default format."




3_20230416101101
図1.16bit 44.1kHz設定時のAmanero I2S出力
Figure1.I2S output of the Amanero Combo384 when playing only a 1kHz sine wave on the L channel (with R channel silent)


図1はAmaneroCombo384のI2S出力で、上の紫色の波形がDATA、下の緑色の波形がLRCKだ。
LRCKが”L”のときLチャンネル、”H”のときにRチャンネルのデータがDATAに出力される。
この元データは、Lチャンネルに1kHzが入っており、Rチャンネルは無音のためデータは無い。
ところが図1を見ると、データが出ないはずのLRCK=”H”の区間にノイズが出ている。このノイズの部分を拡大したものを図2~図4に示す。

Figure 1 is the I2S output of the Amanero Combo384, with the purple waveform at the top representing DATA and the green waveform at the bottom representing LRCK. When LRCK is "L", data for the L channel is outputted to DATA, and when LRCK is "H", data for the R channel is outputted to DATA. The original data in this case has a 1kHz signal in the L channel, and no data in the R channel due to it being silent.
However, as shown in Figure 1, noise appears in the interval where LRCK="H" when there should be no data outputted. Figures 2 to 4 show an enlarged view of this noisy section.




1_20230416101101
図2.ノイズパターン1
Figure2. Noise pattern1


2_20230416101101
図3.ノイズパターン2
Figure3. Noise pattern2




3_20230416101201
図4.ノイズパターン3(出力なし)
Figure4. Noise pattern3(No output)


図2において、MSBが16bitの最上位ビット、LSBが16ビットの最下位ビットを示しているので、このときのデータは
0000 0000 0000 0001
となっている。

図3においては、16bitすべてがHになっているので、このときのデータは
1111 1111 1111 1111
である。

図4においては、16bitのすべてがLになっているので、このときのデータは
0000 0000 0000 0000
である(つまりデータなし=無音)。

I2Sのデータは「2の補数表現」というフォーマットになっていて、たとえば16ビットのデータなら表1のようになっている。

In Figure 2, MSB represents the most significant bit of the 16-bit data and LSB represents the least significant bit of the 16-bit data. Therefore, the data at this time is 0000 0000 0000 0001.

In Figure 3, all 16 bits are set to "H," so the data at this time is 1111 1111 1111 1111.

In Figure 4, all 16 bits are set to "L," so the data at this time is 0000 0000 0000 0000 (i.e., no data = silence).

I2S data is in the "two's complement representation" format, and for example, for 16-bit data, it looks like Table 1.



表1.16ビットデータの「2の補数表現」
Table1."Two's complement representation" of 16-bit data.
2_20230416102901

16ビットデータとは、2の16乗=65536段階のデータであり、これを2の補数表現にすると、表1のように-32768~ +32767の範囲のデータとして定義される。
ここで、先ほどの図2~図4に示したノイズデータはどうだったかというと、-1、0、1の値が出ていることがわかる。
つまり、無音(DATA=0)であるはずのRチャンネルに、-1、0、1の値のノイズが出ているということだ。

windowsのサウンド設定の「既定の形式」を24bit 44.1kHzに設定した場合のI2S出力を図5に示す。

16-bit data refers to data with 65536 levels, which is defined as data within the range of -32768 to +32767 when represented in two's complement format, as shown in Table 1.
Regarding the noise data shown in Figures 2-4 earlier, it can be seen that values of -1, 0, and 1 are present.
In other words, noise with values of -1, 0, and 1 are present in the R channel, which should be silent (DATA=0).

Figure 5 shows the I2S output when the default format of the Windows sound settings is set to 24-bit 44.1kHz.




44100_24bit
図5.24bit 44.1kHz設定時のI2S出力波形
Figure 5. I2S output waveform at 24-bit 44.1 kHz setting.


図5ではRチャンネル(LRCK=H)の区間は正しく無音(データなし)の状態になっている。これは32bit 44.1kHzに設定しても同様だった。

以上の検証は、手持ちのwindows10パソコン3台、AmaneroCombo384およびAmaneroのコンパチ基板で確認したが、すべて同じ結果となった。

以上により、windows10において、サウンド設定の「既定の形式」を16ビットに設定すると、無音時にノイズが発生するため、
これを回避するために、「既定の形式」のビット深度は24ビットまたは32ビットに設定することをおすすめします。

In Figure 5, the interval for the R channel (LRCK=H) is correctly in a state of silence (no data). This was also the case when set to 32-bit 44.1kHz.

The above verification was confirmed with three Windows 10 computers, an AmaneroCombo384, and a compatible board from Amanero, all resulting in the same outcome.

Therefore, in Windows 10, setting the "default format" of the sound settings to 16-bit will result in noise during silent periods. To avoid this, it is recommended to set the bit depth of the "default format" to 24-bit or 32-bit.

| | | コメント (0)

2022年8月20日 (土)

SSDAC使用時のパソコン設定について(2023/4/16修正)

【修正情報】この記事は2023/4/16に修正しています。
こちらの記事もあわせてご参照ください。

SSDACのユーザーの方より、
「方形波再生時に、SSDACの特徴であるプリエコー、ポストエコーが抑えられた波形にならず、リンギングが発生している」
とのお問い合わせがあり調査したところ、再生するファイルのフォーマットと、パソコンのサウンド設定が違っている場合に、ご指摘のような現象が出ることを確認しました。
つきましては、SSDACの性能を十分に楽しんでいただくために、PCのサウンドの再生の「既定の形式」において、サンプリング周波数を再生するファイルフォーマットに揃え、ビット深度を24ビットまたは32ビットに設定してお使いください。
特にwindows10においては、「既定の形式」を16ビット設定時にノイズが発生することが確認されましたので、16ビットの設定は使用しないでください。(2023/4/16記事参照


CDからリッピングしたファイル形式(44.1kHz 16bit wav)の場合の設定方法は次の通りです。

【windows10の場合】
コントロールパネル→サウンド→再生タブ→デジタル出力(Amanero Technologies USB Driver X.X.XX)※1 をダブルクリック
→詳細タブ→既定の形式
「2チャンネル、24ビット、44100Hz(スタジオの音質)」
または
「2チャンネル、32ビット、44100Hz(スタジオの音質)」
に設定
→OK

※1 SSDACでご使用のDDコンバータ

【MACパソコンの場合】
アプリケーションホルダのユーティリティの中の、「Audio MIDI」設定で同じように出力設定を
再生ソースにあわせてください(CDの場合は44.1kHz16bit)。

また、再生時に使用するソフトウェアによっても上記の現象が出る場合があります。
当方のパソコンで調べたところ、次の通りでした。

・WindowsMediaPlayer(windows10Pro 21H2)
再生するファイル形式のサンプリング周波数が、パソコンの「既定の形式」とそろっていれば問題なし。

・iTunes(12.7.4.80)
再生するファイル形式のサンプリング周波数が、パソコンの「既定の形式」とそろっていれば問題なし。

・VLC media player(3.0.2)SSDACには使用不可!
再生するファイル形式と、パソコンの「既定の形式」のサンプリング周波数がそろっていても、リンギングが発生する場合がある。

・MixVibesHome
「既定の形式」が44.1kHz24bitまたは32bitであり、再生するファイルのサンプリング周波数が同じ44.1kHzであれば問題なし。

詳細については以下の通りです。


1.SSDACの特徴
SSDACの最大の特徴は、オーバーサンプリングとデジタルフィルタを使わずに、各データ点の間を3次自然スプライン関数で補間することによって、過渡的な信号を再生する際に生じるプリエコー、ポストエコーの発生を抑え、より原音に忠実に再生することです。

Es9018k2m_1ktr_20220820103001
図1.ES9018K2Mのプリエコーとポストエコー(リンギング)

Pc44116_44116
図2.SSDACによりプリエコー、ポストエコーが抑えられた波形


図1に示すのは1kHz方形波をES9018K2Mで再生した波形で、典型的なプリエコー、ポストエコーが発生しています。
図2は同じ波形をSSDACで再生した場合で、プリエコー、ポストエコーが抑えられています。

このように、現在主流のオーバーサンプリングとデジタルフィルタをつかったD/Aコンバータでは、図1のようなプリエコー、ポストエコーが発生し、音質に影響を与えます。
これを嫌って、一切のオーバーサンプリングを行わず、素のデータのまま再生するNOS(Non Over Sampling)DACを使う人がいます。
SSDACを発明した小林芳直氏は、NOSDACの歯切れのいい音を聴いて感動し、NOSDACの歯切れ良さと、オーバーサンプリングの微細さを併せ持つDACができないかと考え、オーバーサンプリングとデジタルフィルタを使わずに、3次スプライン関数でデータを補間するスーパーサンプリング方式を考案しました。
スプライン関数でデータを補間すること自体は誰でも思いつきそうですが、スプライン関数をすべて計算するためには、曲の初めから終わりまでのすべてのデータを使うので、読込と演算に時間がかかり現実的ではありません。そこでデータ数を適当な個数で区切り、両端のデータを始点と終点と仮定して計算する方法がありますが、これだと誤差が出て波形が歪みます。
小林氏が3次スプライン関数について研究を進めたところ、データが現在の点(中心点)から遠ざかるほど、その区間のスプライン関数に与える影響が小さくなり、たとえば24bitデータの場合は前後13サンプリングデータより遠くのデータは、スプライン関数に与える影響が24bit分解能以下となり、無視しても影響がない、ということを発見し、リアルタイムで誤差が発生しないスプライン関数の導出方法を発見しました。これを応用したのがSSDACです。


2.パソコンの設定による再生不具合について
この記事の冒頭で、再生するファイル形式と、パソコンの「既定の形式」がそろっていることが必要だと書きましたが、実際の再生でそろっている場合とそろえていない場合にどのような差があるのか具体的に紹介します。

①パソコンの「既定の形式」を44.1kHz 16bitに設定した場合
この設定で、フォーマットが同じものとフォーマットが異なるwavファイルを再生した場合の波形を以下に示します。
PCはlenovo X230、windows10 21H2、Windows Media Playerで再生しました。

まずは、再生ファイルが既定の形式と同じ44.1kHz 16ビットの再生波形を図3に、ビット深度が違う44.1kHz 24bitの再生波形を図4にそれぞれ示します。

Pc44116_44116
図3.パソコン設定44.1kHz16bitで、同じ44.1kHz16bitのファイルを再生。正常。


Pc44116_44124
図3.パソコン設定44.1kHz16bitで、44.1kHz24bitのファイルを再生。正常。


パソコンの「既定の形式」と同じファイル形式と、サンプリング周波数が同じでbit深度のみ違うファイル形式は正常に再生されました。

次に、同じくパソコンの「既定の形式」を44.1kHz16bitとし、ファイル形式が48kHzサンプリングと96kHzサンプリングのものを再生した波形を図4~図7に示します。

Pc44116_4816r22k
図4.パソコン設定44.1kHz16bitで、48kHz16bitのファイルを再生。約22kHzのプリエコー、ポストエコーが出ている。


Pc44116_4824r22k
図5.パソコン設定44.1kHz16bitで、48kHz24bitのファイルを再生。約22kHzのプリエコー、ポストエコーが出ている。


Pc44116_9616r22k
図6.パソコン設定44.1kHz16bitで、96kHz16bitのファイルを再生。約22kHzのプリエコー、ポストエコーが出ている。


Pc44116_9624r22k
図7.パソコン設定44.1kHz16bitで、96kHz24bitのファイルを再生。約22kHzのプリエコー、ポストエコーが出ている。


ここまでの波形はすべて1kHz方形波です。
方形波ではなく正弦波の場合は、設定が異なっても問題なく再生されます。1kHz正弦波の再生波形を図8に示します。

Pc44116_9624sin
図8.パソコン設定44.1kHz16bitで、96kHz24bitの正弦波ファイルを再生。問題なし。



②パソコンの「既定の形式」を96kHz24bitに設定した場合
この設定で、フォーマットが同じものと異なるwavファイルを再生した場合の波形を以下に示します。

Pc9624_9624
図9.パソコン設定96kHz24bitで、同じ96kHz24bitのファイルを再生。問題なし。


Pc9624_9616
図10.パソコン設定96kHz24bitで、同じ96kHz16bitのファイルを再生。問題なし。


Pc9624_44116r22k
図11.パソコン設定96kHz24bitで、44.1kHz16bitのファイルを再生。約22kHzのプリエコー、ポストエコーが出ている。


Pc9624_44124r22k
図12.パソコン設定96kHz24bitで、44.1kHz24bitのファイルを再生。約22kHzのプリエコー、ポストエコーが出ている。


Pc9624_4816r22k
図13.パソコン設定96kHz24bitで、48kHz16bitのファイルを再生。約22kHzのプリエコー、ポストエコーが出ている。


Pc9624_4824r22k
図12.パソコン設定96kHz24bitで、48kHz24bitのファイルを再生。約22kHzのプリエコー、ポストエコーが出ている。


Pc9624_44116din
図13.パソコン設定96kHz24bitで、44.1kHz16bitの正弦波ファイルを再生。問題なし。


以上①、②では、方形波再生時、パソコンの「既定の形式」とファイル形式において、サンプリング周波数が一致しているものは正常に再生され、サンプリング周波数が異なるものはプリエコー、ポストエコーが発生しました。
正弦波については、形式の異なるファイルでも正常に再生されました。
これらはWindows Media Playerを使って検証しましたが、iTunes(12.7.4.80)でも同じ結果でした。


③ソフトによって不具合が出るもの
VLC media player(3.0.2)による波形再生結果を以下に示します。


Pc44116_44116_20220820130501
図14.パソコン設定44.1kHz16bitで、VLCで同じ44.1kHz16bitのファイルを再生。問題なし。


Pc44116_44124r18k
図15.パソコン設定44.1kHz16bitで、VLCで44.1kHz24bitのファイルを再生。約18kHzのプリエコー、ポストエコーが出ている。


Pc9624_9624r40k
図16.パソコン設定96kHz24bitで、VLCで同じ96kHz24bitのファイルを再生。約40kHzのプリエコー、ポストエコーが出ている。


Pc9624_9616_20220820130501
図17.パソコン設定96kHz24bitで、VLCで96kHz16bitのファイルを再生。問題なし。


以上より、VLC media playerでは、サンプリング周波数が同じでもビット深度の違いによりプリエコー、ポストエコーが発生し、またパソコン設定を96kHz24bitにした場合は、96kHz16bitのファイルを再生した場合問題なく、設定と同じ96kHz24bitのファイルを再生した場合にプリエコー、ポストエコーが出るという謎の結果となりました。
VLC media playerは非常に便利な万能プレイヤーですが、SSDACでの再生には向いていないようです。


3.なぜ「既定の形式」とファイルの形式が違うとプリエコー、ポストエコーが出るのか
パソコン側の「既定の形式」と再生するファイルのデータ形式が違う場合、使用ソフトの内部でSRC(Sampling Rate Converter)を使って、サンプリングレートの変換を行っていると考えられます。
SRCの内部構造は一般的に、
①入力データをオーバーサンプリングしデジタルフィルタを通す
②データを間引いて、目標のサンプリングレートにリサンプリングする
という構造になっており、とくに①の工程でデジタルフィルタ(FIR)を使うことで、過渡的な波形に対してはプリエコー、ポストエコーが付加されてしまいます。つまりSSDACに渡されるデータにはすでにプリエコー、ポストエコーが付加されている、と考えられます。
SRCの詳しい説明はこちらのサイトが参考になると思います。

ご自分で確かめたい方は、テスト用のwavファイルを用意しましたのでお使いください。

ダウンロード - test_wav.zip

 

| | | コメント (0)

2022年8月19日 (金)

SSDAC用のDDコンバータとMCLK(CM6631A使用品のFW対応)

SSDAC用のDDコンバータ(USB to I2S)について、新たなお知らせです。
すでにSSDAC対応DDコンバーター(USB to I2S)について【20220610追記】にて最新の情報をお知らせしましたが、今回は追加情報です。

SSDACはDDコンバータとしてAmanero Combo384または互換品を使用する前提で開発しています。
これは事実上の業界標準なので、互換品についても各信号のフォーマットは同等であるという前提で考えていましたが、使用可能として紹介したCM6631A使用のDDコンバータの製品に、MCLKに互換性のないものがあるとの情報が寄せられました。つきましてはCM6631AによるDDコンバータをお使いの方に、ファームウェアアップデートによる対処方法を紹介します。

はじめに、Amanero Combo384のI2S信号フォーマットを表1に示します。

表1.SSDAC対応DDコンバータのクロック一覧
Ddcon

SSDACは表1に示すクロック条件で設計されています。
ところが、CM6631Aを使用したDDコンバータ製品の中に、44.1kHzと48kHzのMCLKがそれぞれ11.2896MHz、12.288MHzのものがあるらしいのです。つまりAmaneroのMCLKの1/2です。
この場合、SSDACは動作しますが、スーパーサンプリング倍率が半分になってしまいます。
この対策として、表1のMCLKが出力されるファームウェアに書き換えることで、CM6631Aを使ったDDコンバータが正しく使えるようになります。次のとおりファームウェアのアップデートを行ってください。

①書き込みツールのダウンロード
このサイトにCM6631A用の各種ツールがアップされていますので、この中から"Mhdt Labs DACs Firmware Tools"をダウンロードします。

②ファームウェアのダウンロード
SSDAC用にビルドしたファームウェアを用意しましたのでダウンロードしてください。
ダウンロード - 20220819forssdac9624.hex

③書き込み
CM6631AのDDコンバータボードをUSBでパソコンに接続し、①でダウンロードしたファイル群の中の"FWUpdate.exe"を起動し、ドロップダウンリストから該当するVIDのものを選びます(私が持ってるボードは0D8Cでした)。
まず、Erase FWを押して、現在書き込まれているファームウェアを消去します。
次にUpdate FWを押し、上でダウンロードしたhexファイルを選択してOKを押して書き込みます。

以上でファームウェアの更新は完了で、MCLKは最適化され、SSDACは正常動作します。

これに関連して、PCのサウンドの設定によってSSDACが正しく動作しない場合の対処方法を近くアップする予定です。

| | | コメント (0)

より以前の記事一覧