Linuxを中心とした話題を投稿予定。 使用ディストリビューションであるFedoraが中心になると思われます。http://oedipa.wiki.fc2.com/にてTips Wikiを公開してます。
C#版WAVEファイル読み出しライブラリ作成
そろそろ研究用のプログラムを作っていかないとまずいという事実に気がついてしまったため、固定小数ライブラリはひとまず置いておくことに。
昨日のポストで「符号部1bit、整数部11bit、小数部12bit」を目指す、としていたんですが、これは大きな勘違いでした。少なくとも、今の実装(32bit整数型を小数として扱う)では乗算でほぼ間違いなくオーバーフローしちゃいますね・・・。これじゃ誤差どころの話じゃなくなっちゃう;;
乗算でもそれなりの精度を保持したいなら、整数部と小数部で別々に計算して加算し、外向きには固定小数に見せかけるとかの方法がありますが・・・、また内部ロジックを考え直さないと行けないので後回しですね。
つーわけで今日は以前C++で作成したWAVEファイル読みだしライブラリをC#へ移植しました。
の、つもりでしたが、全面的に書き換えちゃいました(てへっ
まぁANSI C++ってのと.NETのC#ってのではバイナリファイルの扱い方とかに差が出ますからねぇ。ANSIにない便利機能は使っていきたいところですし。 C++版にも逆移植はするつもりですが。
とりあえず読み出しは完成したので明日以降はいよいよロジック部分ですね。とりあえずは畳み込みかな。これをもっとスマートに書きたいんだよなぁ・・・。実機移植を考えないなら間違いなくサイクルバッファを実装するんだけど・・・、昔実装したものをもう一度見て書き直すか。あの頃に比べたらC#もだいぶ分かってきたし。
ま、サイクルバッファだろうと見た目ただの配列として使えた方がいいからなぁ。プロパティは必須か。探せばありそうではあるけれど、軽く探して見つからなかったら己で実装かな。教授の春巡業が終わるまでにシミュレータは完成させたいのぅ。
スポンサーサイト



固定小数ライブラリあらかた完成
とりあえず、符号部1bit、整数部16bit、小数部15bitの固定小数ライブラリがほぼ完成しました。固定小数同士の四則演算以外に、double型との四則演算を定義しておきました。こうしておくことでdouble型に暗黙的にキャストされる全ての型の四則演算が実現できます。
が、パフォーマンスを考えると整数はInt32を用意しておいたほうがいい気がする。コンパイラが最適化してくれることを期待してもいいけれど、double型にキャストされちゃったら利かない気がするしなぁ。
とりあえず値型で作成して、感覚としても一般の定義型と同じように扱えるハズ。まぁちゃんとWAVEファイルを扱いやすいように整数を固定小数として保持するメソッドも作ったし。
後は実際に組み込んでみて、誤差がどの程度出てくるのかを調べなきゃなぁ。本来なら誤差もある程度予測できるはずだけれど、あいにくその計算方法をよく知らない(ぁ これまた勉強しとかなきゃな^^; う~ん、16bitのWAVEファイルを読み込んだとして、その値をそのまま小数部として扱ってはいるのだけれど・・・、値が小さくなればなるほど有効桁数が追いつかないから精度が怪しくなるよなぁ。やっぱ小数部の桁数もっと増やすか・・・。ぶっちゃけ整数部に16bitも必要ないと思うしなぁ。たたみ込みでどの程度値が大きくなるかやけど・・・、利得を1にしておけばそこまで大きくはならない・・・かな?
とりあえず、正しい四則演算結果を返すようにはできたから次は符号部を1bit、整数部11bit、小数部20bitって振り分けくらいにしてみるかな。ん~、この場合かけ算実行したあと何bit右にシフトしたらいいんだ・・・? それに桁あふれが起きそうだしな・・・。そこは気をつけておかないと。桁あふれ起こすと負の数になるっけ・・・? それは困るからなぁ。確かラウンドチェックはC#にあったよな・・・要チェックだ。
あ、作ってから気付いた。これC#で作っちゃったよ・・・。C++で作るつもりだったが・・・、まぁいいか。実用レベルになってからC++に移植しよう。移植はまーそこまで手間かからんだろう。演算子をオーバーライドしたから「+=」とか「-=」の追加はあるけど^^; まーなくても動く(ぁ
とりあえず、明日も頑張るってことだ!