【エンジニア向け保存版】DSD完全ガイド〜DSDからPCMへの変換サンプルコードまで

この記事はAmazonをはじめとした各種広告を含みます。

簡易紹介:こうたろう

1986年生まれ
音大卒業後日本、スウェーデン、ドイツにて音楽活動
その後金田式DC録音のスタジオに弟子入り
プログラミング(C)を株式会社ジオセンスのCEO小林一英氏よりを学ぶ
現在はヒーリングサウンド専門のピアニスト、またスタジオでは音響エンジニア、フォトグラファーなどマルチメディアクリエーターとして活動中
当記事ではプログラマー、音響エンジニアとして知識とスキルをシェアしていきます。
トレードに関するブログサイトではより本格的な金融に関するPythonのサンプルコードを公開中!

SOUND WARRIOR

リニアPCM44.1k~384kHz/16~32bit、DSD2.8M~11.2MHzの再生に対応。

DACには音質に定評のあるESS Technology製 高性能オーディオ用DAC IC「ES9018K2M」を搭載。

Sabaj A20d

旭化成社の最新フラッグシップDACチップ組み合わせ「AK4499EX」+「AK4191」を搭載し、チップ性能を限界まで引き上げ、業界最高水準の低歪率に達し、0.00006%(-123dB)という驚くほど超低歪みを備える。

S.M.S.L DL200

「PLFC」高性能ヘッドホンアンプ回路が搭載され、0.00009%(-120dB)驚くほど超低歪みと16Ωで3Wまでの高出力を得ることができ、高(+11dB)/低(0dB)出力ゲイン調整可能、4.4mm/6.35mmのヘッドホン出力端子を備え、様々なヘッドホンに簡単に対応!

DSD Native再生

DSEE Ultimate/DSD リマスタリングエンジン搭載 膨大な楽曲データを学習しているAI(人工知能)技術により、リアルタイムに楽曲の情景を分析し、 最適に高音質にアップスケーリング。

DSDレコーダー

現状だとDSDで録音を求められる機会はそこまでないと思います。

目的としては文化的な音響の保護だったり、よほどオーディオに詳しいクライアントからの希望となるでしょう。

録音エンジニアとしては、自然界のロケなどもう2度といけないような場所の音響は是非DSDで残したいですし、一期一会の音楽もDSDで残したいと思うものです。

今回はDSD録音が可能なレコーダーのいくつかのオプションを見つけました。

Korg MR-2000S 1-bit Studio Recorder

KorgのMR-2000SBK SSDは、高品質なDSD録音を提供するプレミアムなオーディオアーカイブシステムです。

128GBのSSDドライブを搭載し、スタジオや劇場システムにも適しています。

現在は生産終了と販売終了状態となっています。

TASCAM DA-3000 Stereo Master Recorder and AD/DA Converter

TASCAMのDA-3000は、スタジオやライブサウンドでの超高品質な録音を簡単に行えるラックマウントレコーダーです。

24ビット/192kHz PCMリニア録音または最大5.6MHzのDSDフォーマット録音が可能です。

すでに生産完了品となっていますが、かなりの名機で音は素晴らしいものでした。

Master Recorderですので、専門知識がないと扱えません。

Sony Corporation – DSD

ソニーはDSD録音技術を提供しており、CDをはるかに超える音楽表現を実現しています。

具体的な製品モデルはサイトで確認する必要があります。

DSDファイルの編集ステップ

後述しますが、現段階ではDSDをネイティブ編集するソフトは限定的且つ高額なため、需要に対する導入のメリットはそこまで高くありません。

現状としては、まずDSDファイルを一旦PCMフォーマット(例えば24ビット/96kHzや24ビット/192kHzなど)に変換する必要があります。

この変換は、音質の劣化を最小限に抑えるために高品質な変換ソフトウェアやPythonライブラリを使用して行うことが一般的です。

そこから編集後にさらにDSDにコンバートして保管するというやり方がいいでしょう。

DSDからPCMに変換するソフトウェア

KORG AudioGate

KORGのAudioGateは、DSDファイルをPCMフォーマットに変換するための強力なツールで、もう10年以上前からあったと思います。

公式サイト

Weiss Saracon

Weiss Saraconは、高品質なDSDからPCMへの変換を提供するプロフェッショナルなソフトウェアです。

参考サイト

Sonoma Wire Works DSD Converter

Sonoma Wire Worksは、DSDからPCMへの変換機能を提供しています。

公式サイト

Pythonを使用したDSDからPCMへの変換

Pythonを使用してDSDからPCMに変換することも可能ですので、シェアしておきます。

ffmpeg

Python自体には直接的なDSD処理機能は組み込まれていないため、例えば、ffmpegというコマンドラインツールをPythonから呼び出してDSDからPCMへの変換を行うことができます。

以下はその一例です。

import subprocess

def convert_dsd_to_pcm(dsd_file, pcm_file):
    # ffmpegを使用してDSDからPCMへの変換を行うコマンド
    command = ["ffmpeg", "-i", dsd_file, "-ar", "44100", "-ac", "2", pcm_file]
    
    # コマンドを実行
    subprocess.run(command)

# 使用例
convert_dsd_to_pcm("input.dsf", "output.wav")

SoX (Sound eXchange)

Windowsの方はSoX公式サイトからインストーラをダウンロードして実行します。

macOS では Homebrew を使用してインストールできます。

SoX (Sound eXchange)も非常に便利なので覚えておいてください。

brew install sox

Linuxの場合だと例えば、Ubuntu で以下のコマンドを使用します。

sudo apt-get install sox

ラズベリーパイの内部処理にも使えるので便利です。

SoX を使用して DSD (一般的に .dsf または .dff ファイル) から PCM 形式 (例えば WAV ファイル) へ変換する基本的なコマンドは以下のようになります。

sox input.dsf output.wav

ここで input.dsf は変換したい DSD ファイルの名前、output.wav は生成される PCM ファイルの名前です。

追加で覚えておきたい!

SoX は非常に多機能なツールで、様々なオプションを提供しています。
例えば、サンプリングレートやビット深度を指定することもできます。
以下はサンプリングレートを 44.1 kHz、ビット深度を 16 ビットに設定する例です。

sox input.dsf -r 44100 -b 16 output.wav

プログラムを使わない方法だと意外と面倒なことだったりします。

Pythonライブラリを使用した方法(複雑)

Pythonを使用してDSDからPCMへの変換を行うカスタムスクリプトを作成する方法をガイドします。

このプロセスには、Pythonの標準ライブラリとサードパーティのライブラリを組み合わせて使用します。

必要なライブラリ

  • NumPy: 数値計算を行うためのライブラリ。
  • SciPy: より高度な数学処理や信号処理機能を提供するライブラリ。
  • soundfile: オーディオファイルを読み書きするためのライブラリ。

これらのライブラリは pip を使用してインストールできます。

pip install numpy scipy soundfile
import numpy as np
import scipy.signal
import soundfile as sf

def dsd_to_pcm(dsd_data, rate):
    # DSDデータをPCMに変換する処理をここに記述します
    # これは単純な例で、実際にはより複雑な処理が必要になることがあります
    pcm_data = scipy.signal.decimate(dsd_data, 64, ftype='iir')
    return pcm_data

# DSDファイルの読み込み(この部分はカスタマイズが必要です)
dsd_data, dsd_rate = read_dsd_file('path_to_dsd_file.dsf')  # この関数は仮定のものです

# DSDからPCMへの変換
pcm_data = dsd_to_pcm(dsd_data, dsd_rate)

# PCMデータをWAVファイルとして書き出し
sf.write('output_file.wav', pcm_data, dsd_rate // 64)  # サンプリングレートは適宜調整

細や機能については、各公式サイトで確認してください。

pip install numpy scipy soundfile

以下は、DSDファイルを読み込み、PCM形式(例えばWAVファイル)として書き出す基本的なPythonスクリプトの例です。

import numpy as np
import scipy.signal
import soundfile as sf

def dsd_to_pcm(dsd_data, rate):
    # DSDデータをPCMに変換する処理をここに記述します
    # これは単純な例で、実際にはより複雑な処理が必要になることがあります
    pcm_data = scipy.signal.decimate(dsd_data, 64, ftype='iir')
    return pcm_data

# DSDファイルの読み込み(この部分はカスタマイズが必要です)
dsd_data, dsd_rate = read_dsd_file('path_to_dsd_file.dsf')  # この関数は仮定のものです

# DSDからPCMへの変換
pcm_data = dsd_to_pcm(dsd_data, dsd_rate)

# PCMデータをWAVファイルとして書き出し
sf.write('output_file.wav', pcm_data, dsd_rate // 64)  # サンプリングレートは適宜調整

このスクリプトは、DSDファイルが既に適切なフォーマットでPythonで扱える形(後述します前処理)になっていることを前提としています。

DSDファイルの読み込みには専用のライブラリや事前の変換が必要になる場合があります。

次にその前処理について見ていきましょう。

DSDIFFとDSFの前処理

DSDファイルのフォーマットに応じた専用の読み込み処理について詳しく説明します。

DSDファイルには主にDSDIFF (DFF) とDSFという二つの主要なフォーマットがあります。

これらのフォーマットを扱うためには、ファイルの構造を理解し、適切にデータを読み込む必要があります。

DSDIFF (DFF)

DSDIFFは「Direct Stream Digital Interchange File Format」の略で、.dffファイル拡張子を持ちます。

このフォーマットは、チャンクベースのフォーマットで、複数の異なるタイプのチャンクを含むことができます。

重要なチャンクには、「FRM8」(フレーム)、「DSD」(音声データ)、および「PROP」(プロパティ)などがあります。

DSDIFFファイルを読み込むには、まずファイルの構造を解析して、DSDデータチャンクを特定する必要があります。

その後、DSDデータチャンクから1ビットのDSDオーディオデータを抽出し、必要に応じて変換処理を施します。

DSF

DSFは「Direct Stream Digital Stream File」の略で、.dsfファイル拡張子を持ちます。

このフォーマットはメタデータとオーディオデータを含むシンプルな構造を持っています。

DSFファイルにはヘッダー部分が含まれ、その後に音声データブロックが続きます。

DSFファイルを読み込む際には、まずヘッダー情報(サンプリングレート、チャンネル数、ビット深度など)を解析します。

その後、音声データブロックからDSDデータを抽出し、必要に応じて変換処理を行います。

データの読み込みと変換プロセスの解説

DSDファイルから抽出した生のデータは、通常は1ビットのDSDストリームです。

このデータをPCM形式に変換するには、いくつかの処理ステップが必要です。

デシメーションDSDのサンプリングレートは非常に高い(例:2.8224 MHz)ため、通常、PCM形式に変換する際にはデシメーション(ダウンサンプリング)が必要です。
フィルタリングデシメーションを行う前に、適切なフィルタリングを行うことで、エイリアシングノイズを減らすことができます。
低域通過フィルターは、DSDデータの高周波ノイズを除去するのに役立ちます。
ノイズシェーピングDSDは1ビットデータであるため、高いダイナミックレンジを得るためにはノイズシェーピングが必要です。
PCMに変換する際にも、適切なノイズシェーピングを行うことで、音質を改善することができます。

これらの処理ステップは、Pythonなどを使った手動処理を実行する際にDSDからPCMへの変換において重要です。

既存のソフトウェアを使う場合、これらの処理を任意に調整できないために音質の大幅な劣化が生じてしまいます。

デシメーション、ノイズ処理、フィルタリング

デシメーション、フィルタリング、およびノイズシェーピングの基本的な処理を行います。

実際のDSDファイルを扱う場合は、ファイル形式に応じた読み込み処理が追加で必要です。

以下のコードは、サンプルのDSDデータを生成し、それをPCMに変換するための基本的な手順を示しています。

この例では、NumPyとSciPyを使用しています。

import numpy as np
import scipy.signal
import matplotlib.pyplot as plt

# サンプルのDSDデータを生成(実際にはファイルから読み込む)
fs_dsd = 2822400  # DSDのサンプリングレート(例:2.8224 MHz)
duration = 1  # 1秒間
t = np.arange(0, duration, 1/fs_dsd)
dsd_data = np.random.choice([-1, 1], size=t.shape)  # DSDデータは1ビット、-1か1の値を持つ

# デシメーション(ダウンサンプリング)のパラメータ
decimation_factor = 64  # デシメーション係数
fs_pcm = fs_dsd // decimation_factor  # PCMのサンプリングレート

# ローパスフィルタを設計(例:カットオフ周波数を20kHzに設定)
nyquist = 0.5 * fs_pcm
cutoff = 20000  # 20kHz
numtaps = 101  # フィルタのタップ数
lpf = scipy.signal.firwin(numtaps, cutoff / nyquist)

# フィルタリング
filtered_data = scipy.signal.lfilter(lpf, 1.0, dsd_data)

# デシメーション(ダウンサンプリング)
pcm_data = scipy.signal.decimate(filtered_data, decimation_factor, n=numtaps, ftype='fir')

# 結果のプロット
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(t[:200], dsd_data[:200], label='DSD Data')
plt.title('DSD Data')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.grid()

plt.subplot(2, 1, 2)
plt.plot(np.arange(0, duration, 1/fs_pcm)[:200], pcm_data[:200], label='PCM Data')
plt.title('PCM Data')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.grid()

plt.tight_layout()
plt.show()

デシメーション係数やローパスフィルタの設計は、変換するオーディオの品質や要件に応じて調整する必要があります。

DSDのサンプリングレート

DSD(Direct Stream Digital)は、非常に高いサンプリングレートで記録された1ビットのオーディオフォーマットです。

DSDのサンプリングレートは通常、CDのサンプリングレート(44.1 kHz)の64倍、128倍、またはそれ以上になります。例えば:

  • DSD64: 2.8224 MHz(44.1 kHz × 64)
  • DSD128: 5.6448 MHz(44.1 kHz × 128)
  • DSD256: 11.2896 MHz(44.1 kHz × 256)

デシメーション係数

デシメーションは、サンプリングレートを減少させる(ダウンサンプリングする)プロセスです。

デシメーション係数は、このサンプリングレートの減少の度合いを決定します。

例えば、デシメーション係数が64の場合、入力信号のサンプリングレートは64分の1になります。

DSDからPCMへの変換では、このデシメーション係数は元のDSDのサンプリングレートと目的のPCMサンプリングレートに基づいて選択されます。

フィルタのタップ数

フィルタのタップ数は、デジタルフィルタの特性を定義します。

タップ数は、フィルタの係数の数です。この数が多いほど、フィルタの応答(特に周波数応答)はより精密になりますが、計算コストも増加します。

高いタップ数は、フィルタの遷移帯域をより急峻にし、カットオフ周波数近くの周波数成分をより効果的に減衰させます。

DSDネイティブ編集

さて、ここまでPCM変換を前提としてきましたが、当然DSDネイティブ編集が実現すればそれにこしたことはありません。

Pyramix by Merging Technologies

プロフェッショナルな音楽制作、マスタリング、TVおよび映画のポストプロダクションに使用されるデジタルオーディオワークステーションです。

多くの一流のプロデューサーやエンジニアが作品の録音、編集、ミックスに Pyramix を利用しているのには十分な理由があります。
品質が重要な場合、Pyramix は他の DAW よりも多くの DSD および DXD トラックを提供し、優れた編集と最高のトラック数、低レイテンシーのミキサーを提供します。
ネイティブの VS3 および VST プラグインは、ポストプロダクション、復元、および多数のオーディオ エフェクト用に豊富にあります。
Pyramix は最高のマスタリング ツールです。
驚くべき HEPTA サンプル レート コンバーター、ステレオまたはマルチチャンネル マスタリング、同時アルバム パブリッシング、そして伝説的なサウンド ニュートラル性により、ほぼすべてのサンプル レートを受け入れることができます。
世界中のトップマスタリングハウスが Pyramix に切り替えているのも不思議ではありません。

公式サイト

公式サイト

Sonoma Wire Works

高品質なオーディオソフトウェア、ハードウェアインターフェース、モバイルアプリを提供しています。

公式サイト

SADiE 6 by Prism Sound

高信頼性のオーディオ編集と録音に対応したソフトウェアです。

公式サイト

これらのソフトウェアは、DSDフォーマットのネイティブ編集に特化しており、プロフェッショナルなオーディオ制作に適しています。

DSDレコーダー開発のための創案

現状ではDSDレコーダーの開発は簡単ではありません。

ちなみにラズベリーパイを使った通常のレコーディングツールの作成はこちらの記事を参照してみてください。

そしてDSDレコーダーのボードとしてはいくつかすでに開発されており、I2S (Inter-IC Sound) 接続のものに絞ると数種類から選ぶことができます。

I2S (Inter-IC Sound) 接続とは?

I2S (Inter-IC Sound) 接続は、デジタルオーディオデバイス間でオーディオデータを転送するための通信プロトコルです。

主にオーディオアプリケーションで使用され、高品質なオーディオストリームの伝送に適しています。

I2Sは、フィリップス社によって1980年代に開発されました。

例えば、オーディオ機能が主要な目的ではないデバイスや、USB、HDMI、Bluetoothなど他のオーディオインターフェースを使用するデバイスでは、I2S接続は必ずしも採用されているわけではないということ。

そのため、I2Sはオーディオ専門のアプリケーションやデバイスに特化していると言えます。

I2Sの主な特徴

  • 3つの線: I2S通信は通常、3本の線で構成されます。ビットクロック線(BCLK)、ワードセレクト線(WSまたはLRCLK)、およびシリアルデータ線(SD)です。
  • ビットクロック(BCLK): 各ビットのタイミングを提供します。
  • ワードセレクト(WS): 左右のオーディオチャンネルを識別します。この線は、左チャンネルと右チャンネルの間で切り替わります。
  • シリアルデータ(SD): 実際のオーディオデータが転送される線です。

I2Sの利点

  • 高品質: I2Sは、オーディオ品質を低下させることなく、デジタルオーディオデータを正確に伝送することができます。
  • 低ジッター: ビットクロックが直接伝送されるため、ジッター(タイミングのばらつき)が少なくなります。
  • 柔軟性: サンプリングレートやビット深度など、オーディオフォーマットの多様性に対応できます。

I2Sの使用例

  • DACとの接続: Raspberry Piのようなシングルボードコンピュータと外部DAC間での接続によく使用されます。
  • オーディオ機器間: 例えば、CDトランスポートとDAC、またはオーディオプロセッサ間の接続に使われます。

I2S且つラズパイとの互換性あるボード

Allo Katana DAC、Terra-BerryDAC 2+、PecanPi DACはいずれもRaspberry Piとの互換性を持つI2S接続のDAC(デジタル・アナログ変換器)です。

これらのDACは高品質なオーディオ出力を提供し、Raspberry Piを高性能な音楽デバイスに変える能力を秘めています。

Allo Katana DAC

特徴

Allo Katana DACは、高性能でコストパフォーマンスに優れた高級DACです。
このDACは、3段階にわたる精密なモジュール設計を採用しています​。

​ESS ES9038Q2M変換チップを使用しており、THD+N(全高調波歪+ノイズ)が-120dBに達します。

PCMでは最大32ビット384kHz、DSDではDSD 128とDoPをサポートしています​​。

また、2つの超低ジッターNDK NZ2520SDAクロック(45.1584 / 49.1520 MHz)を使用し、ジッターをわずか390fsに抑えています​​。

他にもSparkoS Labsの高性能オーディオコンポーネントを使用し、6つの単純SS3601 PDOを内蔵。

THD+N補正を行い、-112.75dBに達しています​​。

出力系統ではステレオRCA出力を直接搭載し、バランスXLR出力もはんだ付けができれば使用可能となっています。

Raspberry Pi 3 B、3 B+と互換性がありますが、4に関しては互換性に注意してください。

DietPiやVolumioなどのソフトウェアとも互換性があります​。

Terra-BerryDAC 2+

特徴

Terra-BerryDAC 2+は、Raspberry Pi HAT互換の形状を持ち、内蔵マイコンを使用してDAC/SRCの制御を行います。
ドライバは不要です。​

​AKM製のAK4137 SRCとAK4490を使用し、PCMでは最大768KH/32ビット、DSDでは11.2MHzまで対応しています​​。

位相雑音特性に優れた小型水晶発信器をマスタークロックとして内蔵し、マスタークロックは自動で切り替えます​​。

出力系統はバランス/アンバランス出力があり、DAC用の5V電源入力専用端子があります。

Raspberry Piからの給電も可能です​​。

Raspberry Pi、Combo384、Odroid C1/C2と互換性があります。

PecanPi DAC

特徴

PecanPi DACは、AKMの最新のAK4499EXEQチップをベースにしています。
このデバイスは、最新のマルチビットスイッチ抵抗DAC方式を採用し、VELVETSOUND™テクノロジーを使用しています​​。

Asahi Kasei Microdevices(AKM)の最新のAK4499EXEQチップをベースにしたDAC(デジタル-アナログ変換器)です。

このDACは、マルチビットスイッチ抵抗DAC方式を採用し、VELVETSOUND™テクノロジーを使用しています。

デジタル処理はAK4191で行われ、D/A変換はAK4499で行われます。

これにより、アナログ出力内のデジタルノイズの影響が最小限に抑えられ、信号対ノイズ比が向上しています。

PecanPi DACは、Raspberry Piのモデル2B、3B、3B+、4B、Zero、ZeroWと互換性があり、Volumio、moOde Audio、Ropieee、DietPi、piCorePlayer、OSMC、RaspianなどのRaspberry Pi用ソフトウェアとも互換性があります​

PecanPi DACの優れた特徴は、そのダイナミックレンジ、デュアルDACチップ構成、そして内蔵された高品質なヘッドフォンアンプにあります。

これにより、シングルボードコンピューターを高性能な音楽プレーヤーに変換することができます。

参考価格

まとめ&レコーダー構想

PecanPi DACのようなDSD対応のADCもあるわけですから、実質開発は可能であると思いますが、現状ではPythonで使えるライブラリが不足しているという点と、データ量の重さから、どうしてもラズベリーパイでの処理に限界がある点。

どうしてもそれなりのスペックのデバイスが必要になってきます。

またPCMへの変換プロセスも、音質を維持したままであると、それなりのスペックを必要としますし、具体的に携帯型のDSDレコーダーを作るとなると

  1. raspberrypiの処理能力の向上
  2. Pythonなどの言語ライブラリの充実
  3. 再生ソフトの開発
  4. 需要の増加

などが主な問題点として挙げることができるでしょう。

中でも実は需要の増加が一番の課題なのではないかという、エンジニアとしてではなく音楽家としての思考回路が発動してしまいます。

また状況変わりましたらレポートしたいと思います。