2007年5月18日金曜日

発散!発散!発散!Orz

とりあえず今作っているプログラムが動作テストできる段階までビルドすることが出来ました。
今まではモジュールを中心に作成しており、今日までそれを組み合わせる作業とモジュールに与える処理ルーチンを書いていました。
で、なんとか処理フローを記述し終わりまして、実行テスト。
ま、予想通りではあるけれどバグバグ。途中で変更したちょっとした仕様の差異による直し忘れによる例外スローがちょこちょこと。
まぁその程度であればさしたる問題でもなく、箇所も2、3箇所と少なかったのでささっと修正。
思い違いによる処理結果の間違いが1箇所。フーリェ変換してから初期化しないといけない配列をフーリェ変換前に誤って初期化してしまってフーリェ変換の結果がALL0とかいう素敵状態に。
こーゆー間違いならすぐ気がつくからまだいいんだけど(いや情けないミスなのでよかーないけれどOrz)。
そんでもってそれらのバグを潰してプログラムを走らせる。例外や明らかなミスは無い。
が、結果は発散。原因を調べる。途中結果にさほどおかしい感じは見られな・・・と思いきや。
周波数領域にてフィルタ係数の更新処理を行い、それを逆フーリェ変換して時間領域の係数を取り出すのですが、周波数領域にて直流成分のみがInfで発散。どうも0割が発生している模様。
更新式から言って0が分母に来ることはないだろうと思っていたのですが甘かった。初期のフィルタ係数の与え方が悪かったらしく、不幸にも0が分母に表れる結果となってしまってました。
これは初期値を適切に与えれば解決でいるということで解決。
したけれどもまだ収束せず。
こうなると考えられる原因は、更新式が間違っていること。更新式を入力する際に入力ミスを犯したか、あるいは紙に書いた更新式が間違っているか。紙に書いた更新式はMaximaで求めた式を書き写したもので、そのときに書き間違えた可能性もある。
あるいはMaximaに入力した式が間違っていた可能性もある。ややこしい式だし、間違っていることもありえない話じゃない。
さらに考えたくは無いけれど、更新式の導出方法がそもそも間違っている可能性も。
まぁ、これが正しいかを確認するためにプログラムでシミュレーションを行っている訳だから100%正しいとは言いきれないのが辛いところだけれど、少なくとも理屈の上からは矛盾は見出せていない。理論上あの式で動作するはずだ。
ただ、以前求めた方法と今回求めた方法が異なっており、その結果も異なっているという状態なので、今回求めた結果が実は間違っていた、ということもありえる。
6元連立方程式だしなぁ。前は力ずくで解いたけど、今回は行列式を使ってクラメルの公式で求めてみた。だいぶすっきりしたけど結果が異なっているあたりが気になる。
いやまぁ、式を整理したら案外同じ結果になるのかもしれないが・・・。
あ、ちなみにすっきりしたとはいっても分母分子それぞれで3x3の行列式が2つ掛けられる項が2つでてきてそれの差をとるという計算をしなくちゃいけないから処理量は莫大(苦笑) このまんまじゃ100%DSPで動かせないという重量級。まぁ動作確認だけだから今はあまり気にしなくていいのだけれど。
とりあえずプログラムとして動かせる段階にきたから、はやいところミスをつぶさないと。今月中になんらかの結果を出すと宣言した訳だし、あまり悠長にもしてられないわ。
あぁ、一番地味で苦痛な作業だわ・・・Orz


子供が生まれたら犬を飼いなさい。
子供が赤ん坊の時、
子供の良き守り手となるでしょう。
子供が幼年の時、
子供の良き遊び相手となるでしょう。
子供が少年の時、
子供の良き理解者となるでしょう。
そして子供が大きくなった時、
自らの死をもって、死の悲しさ、
命の尊さを教えるでしょう


青空の見える丘 藤宮 翠
聖書に書かれてる言葉だっけか。別離というのはとても悲しいものだけれど、きっとそこからたくさんのものを得ることが出来るんだろうな。
私は残念ながら動物を飼った経験は無いのでそのあたりの感覚は疎いですが^^;
世話をすることで責任感も生まれる。うむ、小学校で鶏とかを飼って世話をさせるのは実に理にかなっていたんだな^^

0 件のコメント:

コメントを投稿