2013年8月25日日曜日

minstrel の概要

・よくある RSSI を用いたレート制御は、マルチパスを考慮していないため、適切なレートになっていないことがある。 ・minstrel は mac80211 上に実装されているが、もともと MadWifi の一部だった。さらには、博士論文にまでさかのぼる。 ・全レートを試し、あるレートで送信成功ならそのレートを使い、失敗なら使わないようにする。 ・どのレートで送信成功・失敗したかの記録を全てとっておき、基本的には送信成功しそうなレートを使っていく。  ときどき、最適と思われるレート以外のレートも使って、送信成功するようになったかの調査を行う。 ・(再送などにより)送信に著しく時間がかかると、Linux カーネルの TCP 実装では次のフレームの送信を遅らせるようになっている。 ・4回再送できるとしたら、再送のレートは次の順序で出す。  最速のスループットが出るレート・2番目に速いスループットが出るレート・もっとも送信成功しやすいレート・基本のレート  ただし、スループットの定義は、(そのレートでの送信成功率)× (そのレート [Mbps]) ・EWMA(指数加重移動平均) により、古い結果より最近の結果を重要視するので、環境の変化に追随できる。

2013年6月23日日曜日

相関を持つ乱数の生成

相関を持つ正規分布な乱数を生成するためには、コレスキー分解を用いる。
下記はその確認用の matlab プログラム。

大きさ 1 を持つ N x 4 個の複素数の乱数 x を生成する。
実部・虚部それぞれが標準正規分布している。

また、4 列の列方向の乱数列どうしはそれぞれ独立である。
相関行列 corrcoef(x) の i,j 成分が対角成分以外ほぼ 0 になることから確認できる。

複素相関行列 R のコレスキー分解 chol(R) の下三角行列を x に乗算して、
相関のある乱数列 y を得ることができる。
y の相関行列 corrcoef(y) を計算すると、もとの R とほぼ等しくなっている。



N = 10000;

x = 1/sqrt(2) * (randn(N,4) + randn(N,4) * I);

corrcoef(x) # correlation matrix of y                                                                                   

r = [        1, -0.7+0.2I,  0.2+0.4I, -0.5+0.1I;
     -0.7-0.2I,         1,  0.3-0.2I,  0.4-0.2I;
      0.2-0.4I,  0.3+0.2I,         1,  0.3+0.1I;
     -0.5-0.1I,  0.4+0.2I,  0.3-0.1I,         1]

y = transpose(chol(r, 'lower') * transpose(x));

corrcoef(y) # correlation matrix of y 

2012年10月18日木曜日

関数の入口出口で関数を呼ぶには

gcc でコンパイルする場合、関数の入口と出口で別の関数を呼ぶことができる。
まず、コンパイル時に -finstrument-functions を付けて、コンパイルしておく。
すると、各関数の入口と出口で

void __cyg_profile_func_enter(void* func_addr, void* call_site);
void __cyg_profile_func_exit(void* func_addr, void* call_site);
が呼ばれるので、これらの関数を共有ライブラリとして用意しておいて使う。

2012年10月17日水曜日

あるカーネルモジュールで定義したグローバル変数を別のモジュールから参照する

あるカーネルモジュールで定義したグローバル変数を別のモジュールから参照する。

まず、最初のカーネルモジュール A で外部に見せたい変数を EXPORT_SYMBOL() で囲む。
次に、別のカーネルモジュール B で、その変数を参照するわけだが、これで通常のコンパイルをすると、その変数は undefined だと言われる。

これを解決するためには、カーネルモジュール B をコンパイルする際に、
make -C ... M=... KBUILD_EXTRA_SYMBOLS=<path>/Module.symvers modules
のように、KBUILD_EXTRA_SYMBOLS にモジュール A の Modules.symvers のパスを指定するとうまくいく。

2012年9月23日日曜日

syslogd

syslog は UNIX domain socket を利用しているので、カーネルのコンフィギュレーションで UNIX domain socket をサポートさせるようにしないと利用できない。

buildroot で生成したクロスコンパイル環境のパス

buildroot で生成したクロスコンパイル環境は、./output/host/usr/bin/ 以下にある。