I’m loser, baby.

So why don't you kill me?

ぼくのかんがえたさいきょうのでるたしぐまへんちょう

今日で職業訓練所の前期課程が終了しました。アナログ、デジタル、PLCとやりましたがデジタルが一番密度が濃かったかな。C言語は入所まえの6月から始めましたが、始めた頃よりは大分理解が進んでますがまだまだ全然です。10月はアセンブラ。また楽しみな教科です。

STMで綺麗な音が出て気が落ち着いたのかプラットフォームにこだわらくても良いかと思い至りました。LPCかSTMかってだけでなくて、6月にはPropellerでやっていた訳だし音を出すこととC言語の習得は別のレイヤーな訳だし。色々とマイコンを並行してイジってみても良いかしらと。10月はSTMはデータを集めつつ、CでLPC1114のライブラリを書き、アセンブラの基礎を学びつつ、コンピュータのアーキテクチャを学ぶ、というミッションにします。欲張りですのう。

で、タイトルですが、Propellerで音を出していて今一判っていなかったデルタシグマ変調ですが、自分なりに思い至った原理とか今後の作戦とかメモにしておきます。

  • パルス幅変調ではパルス波のオン/オフ時間の比率を変えてアナログ値を表現していましたが、デルタシグマ変調ではオン/オフの比率は一定のままで、1単位の中のパルスの回数の変化でアナログ値を表現する、という方法です。
  • 電圧が足りない時は積分回路などで電圧をあげますが、十分な電圧があるときは、出力をそのままローパスフィルターに突っ込めばアナログ波形が得られます。
  • パルス幅変調で8bit11kHz相当の音を再現するには256*11025=2822400Hzとなり約2.8MHzクロック処理が必要となりますがデルタシグマ変調ではパルス幅変調の1クロック分にオン/オフが発生するのでこの倍、5.6MHzでの処理が必要となります。最大50MHzで動くLPC1114では8クロック毎に割り込みが必要となる計算なので、ちょっときついかも。なので7〜4bit位にしないと間に合わないと思います。LPCでは思い切って4bitとかにしてしまってファミコン方式の音に近づけるというのも有りかも知れない。
  • ただ、タイマ割り込み一つだけで処理できるので1回ライブラリが完成すれば、スペックに合わせてサンプリング周波数やビットを変えればLPC1114でもSTMでも使えるはずです。(通常のGPIOでいけるから)
  • mbedに用意されているパルス幅変調だとアウトプットの電圧が0V〜3.3Vの間となりますが、自前デルタシグマライブラリでGPIOとGNDをつながず出力と入力をGPIOにすれば正逆の電流が得られるので+3.3V〜-3.3Vの6.6Vが得られS/Nが良くなるはず。後、検証が必要ですが、電圧差の種類が6.6V、3.3V、0Vの3種類が得られるので、サンプリングビットをここで稼げるかも。
  • もし、6.6Vと0Vの2種類でよければ、1サンプリング周期中に出したい8bit値について言えば、値を2倍して1クロック毎に値をデクリメントしていって、奇数の時にはGPIO2つの値の反転、偶数の時には2つともL出力、と決めれば短いソースになるのでは。
  • またこの方式だとローパスフィルターに今使っている電解コンデンサーが使えないかも。セラミックコンデンサーの方が良さそうだし、きちんと抵抗とコンデンサーの数値を設定してあげないと駄目だと思います。