SSDACをパソコン上のPythonで実装する ②
【今回の結論】
・WAVファイル再生時の前処理として、スーパーサンプリングを応用したアップサンプリング処理をしておけば、通常のオーバーサンプリングDACによる再生においても、プリエコー、ポストエコーによる音質への悪影響をSSDACと同程度に軽減できる。
前回の記事では、Windows上でPythonを使ってSSDACを実装し、補間の様子をグラフで確認しました。
今回はPythonで実装したSSDACで、実際のWAVファイルを処理して、結果を同じくWAVファイルで取り出し、効果を確認、検証します。
なお今回も前回に引き続き、PythonによるSSDACの実装コードを公開します。今回は任意WAVファイルに対して、任意のスーパーサンプリング倍率処理を施したWAVファイルを出力するもので、名称はSSSRC(スーパーサンプリング・サンプリングレートコンバータ)です。
SSDAC(スーパーサンプリングD/Aコンバータ)の目的は何かというと、過渡的な信号を再生する際に、従来から行われているオーバーサンプリングで原理的に発生するプリエコー、ポストエコーというノイズを抑えることです。
図1に、一般的なDACデバイスを使用して過渡的な信号を再生した場合の典型的なプリエコー、ポストエコー発生の様子を、図2にSSDACを使用してプリエコー、ポストエコーが抑えられた波形を示します。
図1.ESS9018K2Mによるポストエコー、プリエコー
図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を使用しました。
図3.元波形(1kHz方形波 44.1kHz16bit)
この元波形を、TASCAM Hi-Res Editorを使用して352.8kHz32bitにアップサンプリングしたものを図4に示します。
図4.352.8kHz32bitにアップサンプリング
図4では、プリエコーポストエコーが発生しているのがわかります。これは一般的なDACデバイスによってオーバーサンプリング再生を行った場合と等価な結果です。
次に、元波形に対して今回作成したpythonによるSSSRCを使って2倍のアップサンプリングをした波形を図5に示します。
図5.SSSRCによる2倍アップサンプリング波形
スーパーサンプリングによる補間によって、立ち上がり前後でオーバーシュートが発生する典型的な波形になっています。これは図2で示したSSDACによる波形と等価です。
これは元の波形のフォーマットを44.1kHz16bitから88.2kHz32bitにアップサンプリングしたものであると考えることができます。
次にここで得られた88.2kHz32bitサンプリングの信号を、TASCAM Hi-Res Editorを使って352.8kHz32bitサンプリングにアップサンプリングした波形を図6に示します。
図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( スーパーサンプリング・サンプリングレートコンバータ ) ソフトウェア公開
最近のコメント