前回の続きです。
今回は前回作成した関数を用いてPCMからDSDへの変換のシミュレーションを行います。
シミュレーションの流れ
前回でもお伝えしたかと思いますが、ここで改めてシミュレーションの流れを伝えます。
- 浮動小数点数で正弦波を作る
- 正弦波を浮動小数点数から符号付き整数(リニアPCM)へ変換
- リニアPCMを0次ホールドで64倍に補間(I2SのBCLKを模擬するため)
- 補間したデータを1次ΔΣ変調
- 変調したデータをローパスフィルタに通しリニアPCMの正弦波と比較
ざっとこんな感じです。
シミュレーションプログラム
シミュレーションプログラムは下記GitHubにアップロードしています。
実行して得られた画像は下の通りです。振幅は[-1, 1]の区間に正規化しています。
最初DSDを通すローパスフィルタは実回路を模すためにIIRで試したんですが、発散してしまいグチャグチャになったので今回は簡単のため10タップの移動平均フィルタです。このあたりもしっかり勉強しなくちゃですね・・・・
10タップと次数が小さいのでアレですが、平均化されたデータとPCMデータの振幅値はほぼ一致していますね。
1次ΔΣ変調はちゃんと機能していそうです。
ということで、次回からこの「リアルタイムDSDコンバータ」をFPGA内部の回路として落とし込んでいきます。
実は低次のΔΣ変調であればシミュレーションプログラムをコーディングするよりもFPGAに落とし込む方が簡単だったりします。
もちろん、FPGAに落とし込むために作成したVerilogコードもGitHub上で共有できればと思います。