読者です 読者をやめる 読者になる 読者になる

Lynx-EyEDの電音鍵盤 新館

広帯域制御屋の駄文とか

今までとは少し毛色の異なる8pin PSoCオーディオプレーヤ

PSoC DPCM
  • ちょっとした前置き

ADPCMでは「前回のデータ、今回のデータ」から「次回のデータ」を増分予測パラメータから予測し、その予測との誤差を記録していました。しかし、増分予測パラメータとの誤差が大きい場合、当然データは追従できないため、音質は劣化すると考えるのが妥当です。また計算量が多いので、データ長が8bitかつ10MIPSに満たないマイコンでの動作は高サンプルレートの音声の再生は難しいかも知れません。
PSoCは約64MIPS、(3.3V,12MHz動作であるならば約32*1MIPS)であるのでADPCMデコードは骨な作業です。

純粋に差分だけを記録するならば、16bitデータの場合17bit必要になるでしょう。ここでDPCMも工夫が施されています。
例えば、

  1. 適当なインターバルで記録した配列(配列が256個だったら8bitに収まる)
  2. DPCM_data = log10(InData)で記録する
  3. 差分を平方根で記録

今回はこの3番目を採用しました。このId RoQ DPCMアルゴリズムは簡単です。乗算ハードウェアを持つPSoC CY8C24,27,29シリーズなら問題は無いでしょう。24x23シリーズはPSoCブロックが少ないので今回は非採用です。

  • DACについて
    • 今まで通りAN2199を参考に10bit長PWMを一度も外部出力する事無く内部でDA変換しています(一部、AN2199をカスタマイズしている。AN2199参照)また、この出力をLPF2でフィルタリングした後、PGAから外部出力しています。

※この際、GUI画面で謎配線になったため、BBSで質問したところJUNK-BOX氏から的確なお答えを頂戴しました。私のようなアナログブロックの使い方をされる方は参考になると思います。

  • デコーダ
    • PSoC側のハードウェア
    • 同梱のファイルは24MHz(5V)動作用。サンプリング周波数は22.050kHzステレオです。3.3Vの際は12kHzまでです。14kHzまでは対応できるはずですが、サンプリング周波数が中途半端で、iTunes等では生成できないため確認していません。割り込み用カウンタPWM8_3の周期を書き換えてください。(周期計算式=Sysclk周波数[kHz]/8/サンプリング周波数[kHz] )

おいおい、今時5V動作とか時代遅れだろ。小型化させるのに3.3Vで24MHz動作させたい。という方のため。秋月のWithICシリーズ:白色LED用チャージ・ポンプキットに外部抵抗2本で3.3Vから5V生成可能。ノイズも可聴領域では少なくて便利。

  • おまけ

f:id:Lynx-EyED:20100323231900j:image
秋月の白色LED用チャージ・ポンプキットのICで5V駆動中のPSoC

*1:2010年5月11日訂正:とんでもない間違いだ