« ΔΣ型D-Aコンバータを作ってみる(その1) | トップページ | 「ShortCoding」をナナメ読み »

2008年7月27日 (日曜日)

ΔΣ型D-Aコンバータを作ってみる(その2)

さて、前回の続き。結果的には予想と全く違う(全然低い)音階の音が出力orz。さらにそのトラブルシューティングで色々とワナにはまったのでありました。

とりあえずオーバーサンプリングの回数を動的に変えることができるようにと、

UARTからキーボードの[u]と[d]を受け付けて処理するように変更してみたら今度はキーボードの入力を全く受け付けない。色々コードを替えて試してみた結果分かったのが、

一定の条件下でswitch case文のbreakが上手く動かない事がある

という現象が発生しているということ。具体的には

switch(rec_data){
    case 'u':
        // オーバーサンプリング回数インクリメント
        break;    // →何故かここが無いと動く
    case 'd':
        // オーバーサンプリング回数デクリメント
        break;
}

という動作で、breakが無いと当然インクリメントは機能しない(case'd'の判定へ処理が流れるので)。確かif~else ifとしても同じような挙動になっていたと思う(出力されるアセンブリコードが同じ?)。

結局1つだけ条件判定を持つswitch文(意味ね~)で暫定対応して色々調べると、UARTで出力する文字配列が原因っぽい事がわかる。int→char変換とか面倒くさかったのでsprintfとか使ってたのが良く無い模様。インターフェース2008年5月号のA/D変換の記事であったように、一桁ずつ数値→文字変換するロジックに変えたらあっさりとswitch文が動作しました。あの記事はそれを分かっての事だったんでしょうかね?本当の原因はちょっと不明ですが、今回の本題はそこではないのでまずこれでいい事にする。

その後、自分の欲しい440Hzが出力される場所を探すとこれがなんとオーバーサンプリング回数19~20回付近。と簡単に書いてますが、出力される音声はトラ技の記事にもあるように音楽としてはとても聴けないノイジーな音なので、手持ちのサウンドキャプチャーユニット(UA-3FX)で8bit,8kHz,モノラルで再びサンプリングして1周期分の波形が要する時間から判定。

一応、実際の音声も置いておきますが、音量に注意です。

「plainData.mp3」をダウンロード

「filteredData.mp3」をダウンロード

plainData.mp3がそのまま耳で聞いた音を16bit/44.1kHz/モノラルでサンプリングしたもので、filteredData.mp3が今回想定と同じレート(8bit/8kHz/モノラル)でサンプリングしたもの。

とりあえず、440Hzに近い音は取れたものの、オーバーサンプリング回数の謎が残ったまま。しばらく頭を抱えましたが、答えが分かってしまえばまぁ大したことありません。要は

ΣΔコンバートの処理でえらい時間がかかってて256回分のオーバーサンプリングはとてもムリ

だったということです。えらい時間がかかっててとは言っても、実際は6μsec程度なんですが、0.5μsec間隔で割り込みかかるのにその処理に6μかかってたんじゃねぇ。

と言う事で、その辺加味したら20回程度のオーバーサンプリングでちょうど釣り合いが取れていたという結論でした。

よくよく考えると、初めて買ったパソコン(CPU:i486SX25MHz)で、サウンドカードも無しでむりやりPCM音声を再生させた時の音声ってこんな感じでノイジーで、サンプリングレートも8bit/8kHz程度だったような気がします。RISCでクロック40MHzと言う点ではスペックは上かもしれませんが、この方式だとこれくらいが限界なのかもしれません。

と言う事で、ひとまず実験は終了。そろそろ78K0の方、触っていきたいと思います。

|

« ΔΣ型D-Aコンバータを作ってみる(その1) | トップページ | 「ShortCoding」をナナメ読み »

コメント

0.5us/25ns=500/25=20clk≒20instruction
この時点で処理が間に合わないと思います。
weep

投稿: NSJ | 2008年7月28日 (月曜日) 23時43分

コメントありがとうございます。
なるほど、RISCだからCPUの動作クロックから
実行可能なマシン語コードの命令数がわかって、
そもそもその程度じゃコンバート処理の実現がムリって事ですね。
こっちの分野のプログラミングはまだまだ
(マシン語は十数年前にポケコンでかじっては
いますが)で、毎日勉強の日々です。

投稿: nkgateway | 2008年7月29日 (火曜日) 20時58分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2790/41978600

この記事へのトラックバック一覧です: ΔΣ型D-Aコンバータを作ってみる(その2):

« ΔΣ型D-Aコンバータを作ってみる(その1) | トップページ | 「ShortCoding」をナナメ読み »