フリーの数式処理システム2006年04月01日 16:11

フリーの数式処理システムがありました。
試してはいませんが。

http://phe.phyas.aichi-edu.ac.jp/~cyamauch/maxima/
http://www.ma.utexas.edu/users/wfs/maxima.html

GPL なのでこれを組み込んでの商用利用はできませんが、これで計算した結果を使うのは OK だと思います。
ロボット制御用のリンクパラメータ計算なんかに使えそうです。

次バージョン (V1.30) 予告2006年04月02日 21:39

まだ公開は先ですが、この辺でまとめておきます。

現在バグ修正版の V1.21 が最新版です。
http://cessna373.asablo.jp/blog/2006/02/22/263918

V1.20 -> V1.21 の修正点は以下のとおりです。
- カーソル表示中の設定変更が周波数グラフに反映されないバグ修正
 http://cessna373.asablo.jp/blog/2006/02/19/259359
- 窓関数にフラットトップ窓追加
 http://cessna373.asablo.jp/blog/2006/02/18/259052
- [正弦波作成] にチャープ波作成機能追加
- オプション設定の保存と読み込み機能追加

V1.30 ではさらに以下の変更があります。
- キャプチャー画面のちらつき回避
 http://cessna373.asablo.jp/blog/2006/03/02/275329
- 録音データのタブ位置入れ替え、タブ名変更の機能追加
- 自己相関係数、相互相関係数の計算
- サンプリングレート追加
 http://cessna373.asablo.jp/blog/2006/03/11/285978
- 32/64 bits Float 形式追加
 http://cessna373.asablo.jp/blog/2006/03/21/298413
- [UFF インポート] で正規化せず 32 bits Float に変換
- [録音データ加工] に正規化しないオプション追加
- [正弦波作成] に指数チャープ波作成機能追加
 http://cessna373.asablo.jp/blog/2006/03/31/310915
- …

ホワイトノイズ2006年04月04日 22:24

以下のサイトでホワイトノイズの wav ファイルをダウンロードできます。
http://www.partnersinrhyme.com/soundfx/noise.shtml

google で whitenoise.wav を検索すれば、いろいろ見つかります。
同じ要領でピンクノイズなども見つけることができます。

他にも以下のようなソフトウェアがありますね。
http://www.vector.co.jp/soft/win95/art/se097634.html

当面 RH1 FFT では、正弦波(およびチャープ波)以外の波形作成機能を追加する予定はありません。
いつもと同じく、リクエストがあれば検討します。

相関関数2006年04月05日 22:43

相互相関関数
次バージョンでは、自己相関関数と相互相関関数の機能を追加します。
機能の紹介は後ほど行うとして、まずは相関関数について簡単に説明しておきます。
といっても直感的な説明しかしませんので、詳しくは参考資料
 http://cessna373.asablo.jp/blog/2006/01/27/228275
で紹介している 『ディジタル信号処理の基礎』 などを参照してください。

さて、上の絵で分かる人がどれくらいいるのか…。
連続と離散が交じり合った絵になっていますが、そこは適当に解釈してください。
スケール補正など瑣末なものは省略しています。
要するに 「t だけずらしたときにグラフがどれぐらい重なっているか」 を表すものです。

オリジナルデータと雑音が混じったデータの相互相関関数をとることにより、時間がどれくらいずれているか、あるいはどれぐらい原型を留めているかを調べることができます。

一方、自己相関関数は自分自身との相関関数です。
「時間をずらしたときに自分自身とどれくらい重なるか」 ということなので、信号の周期性を調べることができます。

相関関数のスケーリング2006年04月07日 22:25

相関関数の定義をみると、積分値 (あるいは積和値) を対象データの長さ (あるいは数) で割ったもののようです。
しかし
 http://cessna373.asablo.jp/blog/2006/04/05/317192
の絵を見ても分かるように、有限長のデータの相関関数を取ると、ずれが大きくなるにしたがって重なっている部分が小さくなります。
そのため相関関数の値は、ずれの量に反比例して小さくなります。

これを避けるために、RH1 FFT では対象データの数ではなく重なっている部分の数で割ることによって、スケールを正規化しています。
それはそれでいいのですが、重なっている部分の数が少なくなればなるほど (ずれの大きいところほど) 精度が悪くなることに注意が必要です。
例えばサンプル数が N 個の場合、ずれが 0 のときの値は N 個の積和の平均値であるのに対して、ずれが N-1 のときの値は単に最初と最後のデータを掛け合わせたものになります。
相関関数としての意味を持つのは、ずれが比較的少ない部分に限られるということです。

さて上の絵は、
 http://cessna373.asablo.jp/blog/2006/04/04/315953
で紹介しているサイトの whitenoise.wav の自己相関関数を上述のように計算したものです。
理想的なホワイトノイズの自己相関関数は、ずれが 0 のときのみ正の値を持ち、それ以外は 0 になります。
上の絵を見ると左の方 (ずれが小さい) は概ねそのようになっていますが、右の方 (ずれが大きい) ではかなり乱れていることが分かります。
解釈の仕方にもよりますが、相関関数として意味があるのは全体の半分程度までと考えておけばいいでしょう。

次バージョン予告 : 相関関数機能2006年04月09日 13:30

これまでお知らせしてきたとおり、RH1 FFT の次バージョンでは相関関数機能が追加されます。
操作は以下のようになります。
 1. 相関関数を計算したいデータのタブを開く。
 2. [相関関数] ダイアログで相手のデータを選ぶ。
2 で自分自身を選択すれば自己相関関数、別のデータを選択すれば相互相関関数になります。
選択できるデータは、サンプリングレートが自分と同じもののみです。

生成されるデータは Float 32 ビット形式の WAV データになります。
ですので(意味はありませんが)音声データと同様に、再生したり周波数グラフを表示したり、さらに相関関数を計算できたりします。
このようになっているのは、既存のグラフ表示機能を相関関数の表示にも使いたかったからです。
相関関数をテキストデータで欲しい場合は、WAV データをテキストに変換する機能があれば事足ります。
 http://cessna373.asablo.jp/blog/2006/03/23/301128
にも書きましたが、もし希望があればお知らせください。

相互相関関数機能2006年04月12日 01:36

http://cessna373.asablo.jp/blog/2006/04/09/320983
の続きのようなものです。

上の絵は相互相関関数について説明したものです。
相互相関関数では + のデータと - のデータの二つのデータが生成されます。
自分に対して相手を + 方向にずらしたのが + のデータ、- 方向にずらしたのが - のデータです。
- のデータの一番最後と + のデータの一番最初はずらしていない状態での値であり、そこで両者がつながっています。
つなげたものを一つだけ生成してもいいのですが、どこが 0 (ずらしていない状態での値)なのかが分かりやすくなるように、このようにしてみました。

なお自己相関関数では + のデータしか生成されません。
少し考えれば分かるように、自己相関関数の - のデータは + のデータを t = 0 の軸に対して反転したものになります。

pow(x, y) vs. exp(y * log(x))2006年04月13日 00:45

数学的に見ると x = e^(ln(x)) なので x^y = e^(y ln(x)) です。C 風に書けば pow(x, y) == exp(y * log(x)) となります。
しかし PC での計算速度は後者の方が速いようです。もちろん CPU(FPU) にもよるのでしょうが。

 http://homepage1.nifty.com/herumi/adv/adv43.html#004
によると、PIII では各演算のクロック数は大体以下の通りです。
 * : 2
 log : 82
 exp : 142
 pow : 366
したがって、単純計算では以下のようになります。
 pow(x, y) : 366
 exp(y * log(x)) : 226
そのままでも後者の方が速いですが、特定の x について何度も計算を行う場合、log(x) をあらかじめ計算しておけるのでさらに効果が高まります。

それじゃあ pow は使い道がないかというと、そうでもありません。
* と log をはさむとどうしても数値誤差が発生してしまうので、最後の一桁まで正確な値が欲しいときには pow を使用する必要があります。

ちなみに RH1 FFT では、対数目盛りのグラフ表示などにこの計算が使われています。

ところで P4 ではどうなのかなと思って調べてみようとしましたが…どこで調べればいいんでしょうか?
 http://developer.intel.com/design/Pentium4/documentation.htm
の Manuals には載ってなさそうなんですけど。

IEEE Float 形式 wav ファイル2006年04月15日 01:47

http://cessna373.asablo.jp/blog/2006/03/21/298413
にも書いたとおり、次バージョンでは IEEE Float 形式をサポートします。

これは一つのデータを浮動小数点で表すもので、以下の利点があります。
 - 1.0 を超える値を表すことができる。
 - 小さい値でも相対的な分解能を一定に保つことができる。
前者は UFF のインポートで、後者は相関関数で役立ちます。

音声データとして考えた場合は 1.0 が最大音量を表します。
しかし 1.0 を超えていてもデータとしては不正ではないようで、再生時は 1.0 を越えた部分が 1.0 に丸められるようです。

一方 PCM 形式では [-1.0, 1.0] の範囲を整数で表しています。
たとえば 16 ビットだと [-32768, 32767] が [-1.0, 1.0] にマッピングされます。この場合は 1.0 を超える値は表せませんし、どんなに小さい値でも分解能は 1/32767 (1/32768) 固定になります。
上の浮動小数点に対して、こちらは本質的には固定小数点と考えられます。

オープンソースソフトウェア2006年04月16日 23:05

別にポリシーを語るつもりはありません。単なる雑談です。

オープンソースソフトウェアのメッカといえば GNU で知られる FSF (Free Software Foundation) です。
 http://www.fsf.org/
他にホットなところといえば SourceForge.net でしょうか。
 http://sourceforge.net/

RH1 FFT はシェアウェアとして公開していますが、その開発にはオープンソースのツールをいろいろ使用しています。
 http://cessna373.asablo.jp/blog/2006/03/04/277279
で紹介したソースコード管理の TortoiseSVN/Subversion もその一つ。
もちろんソースコードの流用などはしていませんが。

そんじょそこらのソフトウェアより使いやすくて高品質のものが揃っています。
何かツールを探しているときは、立ち寄ってみてはいかがでしょうか。

オープンソースの FFT ソフトもあるようですが、RH1 FFT が無意味になるほどのものは今のところ見当たらないようです。
もしよさそうなものがあれば紹介していきます。