2.PCM再生のやり方ってPWM使うの?
picocalcってどうやって mp3 再生してんのかな?と思いつつソースを見ていくとGPIOをPWMに設定して制御している。
はて?PWMの先にF/Vコンバータでもつながってる?と思って回路図を見ると、ラインバッファ用ICとCRを使ってるだけ。う~ん?
ちなみにpicocalcのmicropythonドライバも音を出せる(ビープ音)。これもPWMを制御してるが、PWMクロックの分周比を設定して、可聴帯域のPWM信号を出している。
そうだよね。これが普通だけど、どうやってPCM音声だしてるん?
PCMのソースを読み進めていくと、PWMの分周比を1(つまり125MHz)、PWMカウンタ上限を2047に設定。そして44KHz の周期処理のコールバック関数内でPWMのデューティ比を設定している。12bitのDAコンバータ相当。
どうやら聞こえない高周波のPWMを出し、そのデューティ比で電圧を作っているようだ。
なるほど、バッファICの後ろのCR回路はそのために存在するのか。
更に調べるとこれはD級アンプの仕組みそのものだったようだ。大昔の知識だと「D級アンプは効率は良いが音質が悪くオーディオ用途には使えない」だったけど時代は変わったなぁ。(デジタル技術の進歩)
ということで、データをデューティに設定して 23us だけsleepするのを繰り返すドライバを組み込んで、python側でPCM用のデータを作成して鳴らしてみた。
なるほど、確かに音が聞こえてくる。不思議だなぁ。
ただ、鳴らしていると徐々に音程が下がっていく。スマホアプリのスペクトラムアナライザを使ってみると、間違いなく落ちていく。なんじゃこりゃ?
まぁ原因はよくわからんが、この処理は周期タイマからのコールバックで実装するから問題なかろう。
データのやりとりはPCMバッファを2面持てば簡単。
次はMP3の再生処理だ。




