「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



散々オイラを悩ませてきたバグがようやく見つかった。

見つかっちゃえば大した事じゃなかったんだけど、
思い込みが災いしてるから、アタマで考えてもこれは
見つからないよな…


何かというと、演算子の演算順位の勘違い。

long型(正確にはunsigned long型)の、4バイトの
うち上位2バイトを整数部、下位2バイトを小数部と
仮定して、四捨五入をするんだけど、その前の按分
計算とからめて、整数部だけの按分、小数部だけの
按分を計算した後で、小数部からの繰上げ処理を
if文で行ってて、桁あふれが有る場合には
 
  16ビット右シフトして、1を足す

という処理を書いたつもりなのに、実際は

  16+1ビット右シフトする

という処理になってたというお話。


割り算をライブラリ処理に任せると遅いから、
当然65536で割ると言えば、右16ビットシフト
となるわけだけど、頭の中では「割り算」でも、
実際の計算は「ビットシフト」。

んで、ビットシフトは加減算よりも優先順位が
低いから、先に16+1が行われちゃう…。
すると計算結果が半分になっちゃうと。


探してみたら、
http://www.6809.net/tenk/html/cgokai/enzanjun.htm
↑ここにも、そういうお話が書いてあった。


言語によっても演算子の優先順位って異なるだろうし、
そういう意味で、オイラいつもこの手の計算はカッコ
をつけて明示する癖をつけてるはずなんだけど、
頭の中で「割り算」って思いこんでると、つい、
足し算より割り算の方が先って信じちゃうんだな。
駄目だな。


んで、プログラムをサクッと修正し、あらためて実行
しなおしてみる。

まず、修正前の実行結果から数値をダンプしてみたもの。



これだけ見てもなんのこっちゃって感じだけど、
色付いたセルがアッチコッチに乱雑になってる
ってところが見れればok。

コイツが、バグ修正後には、



こんな風に、緑色の薄い矢印マークの様に、半音の
なかで「S字」を描いているところがポイント。

ちなみに、この表の見方。

一番上が440Hz、一番下が260Hzで、1Hzごと。色が
変わるごとに半音ずつ低くなっていくというイメージ。

横方向はそれぞれ、-32cent、-16cent、-8cent、-4cent、
-2cent、-1cent、0cent、1cent、2cent、4cent、8cent、
16cent、32centに割りあたってて、各周波数の音を
半音単位の音階に振り分けたときに、その音階からの
ズレ量をAMDFで計算した値。一番小さい値になる
ところが、求めるcent値。

これが各半音単位の中で、綺麗なS字を描いてくれる
のが当初の想定。バッチリ。


音源に使ったDDSファンクションジェネレータが、
1Hz単位でしか発声できないので、どうしても中心
付近が飛び飛びになっちゃうんだけど、仕方ない。
(1centあたり、およそ1/4Hzとかだから)


このあたりをもう少しわかりやすくグラフ化すると、



こんな。

左上から右下に向かって、階段状の濃い青い線は
ラ(440Hz)からド(262Hz)までの各音階。
薄い水色は、入力された周波数が、それらの各音階
から何centズレているかの値。つまり、さっきの
S字を描いている部分。

思ったとおりのグラフが出てきてなにより。


とりあえず、コア処理部分は動くようになった。
まだコードを眺めると、汚いところとか、無駄な
ところとか、さらにはテスト用コードがいっぱい
残ってたりするので、その辺の整理だな。

それにしても、浮動小数を排除したのに、処理速度
は全然期待値以下だなぁ。周波数精度はともかく、
速度だけならFFTの方が速く計算できちゃうんだよ
なぁ、現状は。


まぁ、とりあえず処理が一通り動くようになってきた
ので、改めてArduinoのハード云々でアレコレを
再調査。

調べてみて愕然の事実発覚。

Arduino Uno(R1~R3まで全部)で使われている発振子
は、クリスタルじゃなくてセラロックだった…。

http://search.murata.co.jp/Ceramy/CatalogAction.do?sHinnm=?%C2%A0&sNHinnm=CSTCE16M0V53-R0&sNhin_key=CSTCE16M0V53-R0&sLang=ja

誤差0.5%だって…。

これまでテストで使ってきたのは、秋月製基板を使った
オイラ謹製Arduino互換ボードだから誤差は50ppm程度に
収まってるはずなんだけど、0.5%って…計算してみると
5000ppmくらい。精度が二桁違うな。

ちなみに0.5%って、8centくらい?駄目ジャン。


Duemilanove以前のやつとか、
http://www.switch-science.com/catalog/980/
Seeeduino V3.0みたいな互換基板なら、クリスタル
が搭載されてる。Seeeduinoの互換基板、結構良いな。



http://jp.techcrunch.com/2014/01/22/20140121smartwatch-keyboard-video-minuum/
スマホとかの日本語入力。「Minuum」って、以前
耳にした気がするんだけど、こういう風に動画で
入力風景を見てみると、こんなに小さい画面でも、
かなり良い出来だな。

ただ、オイラはスマホとかのタッチパネルで文字を
入力するのがどうしても嫌いなんだよな。理由は
一つ。予測変換を大前提にしたこの手の入力は、
画面をずっと注視することを強制するから。

ガラケーなら、親指の感覚でほぼタッチタイプが
出来るから、画面見ずに入力できるメリット。
(ちなみに、オイラは予測変換オフで使う派)



http://icon.jp/archives/6545
女子大生チップチューナー、TORIENAさん。

ゲームボーイ音源って、てっきり本体からチップを
抜き出して、別のハードで鳴らすものとばかり
思っていたけど、

http://dic.nicovideo.jp/a/little%20sound%20dj

「LSDj」なんていうソフトがあったのか。知らなかった。
おいらにとってゲームボーイは「テトリス」と「魚探」
の専用機だったからなぁ…。

ページに貼ってある音楽再生窓から、早速聴いてみた。
うん。良いテイスト。こんな曲作れるのか。へぇ。

それにしても、美人だし、良いテイストの曲だし、
このインタビュー記事を読むと「のめりこみ具合」
とか、ベース技術の厚みとか、熱さとか伝わって
くる。なにより美人だ。大事なことなので2(略)

http://www.nicovideo.jp/watch/sm3244040
LSDjって、こんな感じなんだな。オイラのころには、
弄れる音源って、MMLくらいしかなかったんだよな。



三菱銀行を名乗る詐欺メールが、オイラのところにも
届いた。どう見ても日本人が書いた文章じゃない
んだよな。お客に向かって「貴様」呼ばわりはねーよ。
一発でバレバレ。もうすこしがんばりましょう。
ちなみに、送信元メールとか、送信先メールとか、
アドレスがメチャメチャアヤシイ。バレバレ。



コメント ( 0 )