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秒間再生できるな。音質はともかく。
ΔΣがいーんじゃない? (スコア:1)
やり方は...
0.出力しようとする値をv0、誤差をd(後述)、v0とdを足した値をv1とする。
1.v1が値が半分を超えてたら1、半分未満なら0を出力(これはゼロクロスと同じ)。
2.1を出力したら+のフルスケールからv1を引いたものを、0を出力したら-のフルスケールにv1を足したものを誤差(d)とする。
3.次の値v0を取ってきて1から繰り返す。
みたいな感じ。誤差のスペクトルは三角ノイズ。
Re:ΔΣがいーんじゃない? (スコア:1)
あー、でもサンプリングレートが可聴域だとΔΣじゃ死ぬるな。サンプリングレート付近で強いノイズが出るから。
Re:ΔΣがいーんじゃない? (スコア:1)
これはそんなに難しくなさそう。
PWMでも(サンプリング周波数もたかだか8KHzなので)速度的には問題無いはず。
あと、PWM変換するんだったらターゲットマシンでリアルタイムでPWM変換したほうが容量は有利になりますね。
Re:ΔΣがいーんじゃない? (スコア:1)
そうかなー?分解能が8bitsでも2MHzでカウントする必要があるよ(このくらいはできるだろうけど)。分解能が16bitsになった日には500MHzだし。
それはそうと、ADPCMは基本的にPCMなデータを4bitsでΔΣ変換したものなので元データがADPCMなら分解能を4bitsにしてADPCMデータを4bitsづつ流すという手もあるね。基本的にというのは0000とかにコントロールコードが割り当てられてることがあるからなんだけど。
Re:ΔΣがいーんじゃない? (スコア:1)
そんなことしたら、4KbyteのROMが0.5秒で埋まってしまうデス
4bitもあれば御の字かなあと思ってました。
4bitにしても、今度は代わりにサンプリング周波数を半減しないとROMが厳しい・・・。分解能とサンプリングレートはどの編がベストな割り振りなのか悩みます。(この貧乏システムでは、1ビットが丁度いいのか?)
前のコメントでも書いていただきましたが、8KHzでPWMすると可聴波でピーとかなりそうですね。
4倍の32Khzで動かして、元の1データにつき、PWMを4回やるってのはどうでしょう。これまた、余計なことになるでしょうか?
ADPCMは誤差が蓄積されて、そのうち+側か-側に突き抜けてしまうような不安があるのですが、あれってなんで大丈夫なんでしょう?大丈夫なようにエンコードしてるからだとは思いますが・・・
Re:ΔΣがいーんじゃない? (スコア:1)
>4倍の32Khzで動かして、元の1データにつき、PWMを4回やるってのはどうでしょう。これまた、余計なことになるでしょうか?
基本的にはそれでもOKだけど64kspsはあった方がよいやも。あるいはアナログ側でフィルタするとか。
あるいは予めΔΣしたビット列をハフマンな圧縮するだけでもだいぶ小さくなりそうだけどね。0と1が交互に出やすそうだし。
# 音声合成するならF0の周波数と各フォルマントの強度、それに子音で結構声になるからもっと圧縮効くんだけどー(ぉ
## 全くフィルタせずにフォルマントを出すだけでも「声っぽい」音になるよ。怪しいけどw
>ADPCMは誤差が蓄積されて、そのうち+側か-側に突き抜けてしまうような不安があるのですが、あれってなんで大丈夫なんでしょう?
あるとき+の誤差があったら+に出力しすぎなわけだから次でその分を引くという動作なので問題ないよ。