パスワードを忘れた? アカウント作成
494766 journal
スラド

fslashtの日記: [SPYDER08] ロストテクノロジー 6

日記 by fslasht

STATUS: 故障中x2

 1bit PCM(最近の1bitオーディオとかじゃなくてホントの1bit量子化したやつ)ってどうやってつくるんだっけーってネットって調べてたら、こんなページみつけた。

お前らが知ってた今役に立たない技術を語れ (2ch 過去ログ)

 うはー。懐かしい役に立たない知識がいっぱい。
 でも、1bit PCMの作り方はわかった。とりあえずゼロクロス法で作ろう。PWMだと手間がかかりそうだし(どこかにソフトあると思うけど)。

 何に使うかって、もちろんUSBSPYDER08でPCM再生するためです。
 圧電ブザーで…
 MC9S08QG4だとピン数がすくなすぎて音源チップつながらないんだよぅ。

 データ容量だけど、FlashROMは4Kbyteあるから、32Kbit。
 サンプリングレート8kHzだったら最大4秒。4kHzだったら最大8秒間再生できるな。音質はともかく。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • PWMだと速度が厳しいし。
    やり方は...
    0.出力しようとする値をv0、誤差をd(後述)、v0とdを足した値をv1とする。
    1.v1が値が半分を超えてたら1、半分未満なら0を出力(これはゼロクロスと同じ)。
    2.1を出力したら+のフルスケールからv1を引いたものを、0を出力したら-のフルスケールにv1を足したものを誤差(d)とする。
    3.次の値v0を取ってきて1から繰り返す。
    みたいな感じ。誤差のスペクトルは三角ノイズ。
    • bitの集まりでデータを保持するならあらかじめ計算しておいてもいいね。
      あー、でもサンプリングレートが可聴域だとΔΣじゃ死ぬるな。サンプリングレート付近で強いノイズが出るから。
      親コメント
    • 前回切り捨てちゃった分を加算するのですね。
      これはそんなに難しくなさそう。

      PWMでも(サンプリング周波数もたかだか8KHzなので)速度的には問題無いはず。
      あと、PWM変換するんだったらターゲットマシンでリアルタイムでPWM変換したほうが容量は有利になりますね。
      親コメント
      • >PWMでも(サンプリング周波数もたかだか8KHzなので)速度的には問題無いはず。
        そうかなー?分解能が8bitsでも2MHzでカウントする必要があるよ(このくらいはできるだろうけど)。分解能が16bitsになった日には500MHzだし。

        それはそうと、ADPCMは基本的にPCMなデータを4bitsでΔΣ変換したものなので元データがADPCMなら分解能を4bitsにしてADPCMデータを4bitsづつ流すという手もあるね。基本的にというのは0000とかにコントロールコードが割り当てられてることがあるからなんだけど。
        親コメント
        • うひゃひゃ。ブザーに分解能は8bitは贅沢ですよぅ。
          そんなことしたら、4KbyteのROMが0.5秒で埋まってしまうデス
          4bitもあれば御の字かなあと思ってました。
          4bitにしても、今度は代わりにサンプリング周波数を半減しないとROMが厳しい・・・。分解能とサンプリングレートはどの編がベストな割り振りなのか悩みます。(この貧乏システムでは、1ビットが丁度いいのか?)

          前のコメントでも書いていただきましたが、8KHzでPWMすると可聴波でピーとかなりそうですね。
          4倍の32Khzで動かして、元の1データにつき、PWMを4回やるってのはどうでしょう。これまた、余計なことになるでしょうか?

          ADPCMは誤差が蓄積されて、そのうち+側か-側に突き抜けてしまうような不安があるのですが、あれってなんで大丈夫なんでしょう?大丈夫なようにエンコードしてるからだとは思いますが・・・
          親コメント
          • >前のコメントでも書いていただきましたが、8KHzでPWMすると可聴波でピーとかなりそうですね。
            >4倍の32Khzで動かして、元の1データにつき、PWMを4回やるってのはどうでしょう。これまた、余計なことになるでしょうか?

            基本的にはそれでもOKだけど64kspsはあった方がよいやも。あるいはアナログ側でフィルタするとか。
            あるいは予めΔΣしたビット列をハフマンな圧縮するだけでもだいぶ小さくなりそうだけどね。0と1が交互に出やすそうだし。
            # 音声合成するならF0の周波数と各フォルマントの強度、それに子音で結構声になるからもっと圧縮効くんだけどー(ぉ
            ## 全くフィルタせずにフォルマントを出すだけでも「声っぽい」音になるよ。怪しいけどw

            >ADPCMは誤差が蓄積されて、そのうち+側か-側に突き抜けてしまうような不安があるのですが、あれってなんで大丈夫なんでしょう?

            あるとき+の誤差があったら+に出力しすぎなわけだから次でその分を引くという動作なので問題ないよ。
            親コメント
typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...