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/ 以下にある。

2012年9月13日木曜日

一般ユーザーの sudo パスワードなし実行

一般ユーザー(user1 というユーザー名だとする)の sudo パスワードなし実行を設定する。
Ubuntu12.04 では、visudo して下記の一行を追記すれば良い。
%user1 ALL=NOPASSWD: ALL

isc-dhcpd-server

ubuntu 12.04 で isc-dhcpd-server を apt-get install し、service isc-dhcpd-server start で起動しようとしたが、うまく動かない。dhcpd -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcpd/dhcpd.conf で起動したらうまくいった。
dhcpd.conf の設定は、下記を dhcpd.conf の末尾に追加した。

subnet 192.168.10.0 netmask 255.255.255.0 {
  range 192.168.10.10 192.168.10.30;
  option domain-name-servers 192.168.10.1;
  option domain-name "hoge.piyo";
  option routers 192.168.10.1;
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.10.255;
}

2012年9月9日日曜日

Ubuntu 12.04 で WLI-UC-GNM2

http://somememos.blogspot.jp/2012/06/usblan-wli-uc-gnm2linux.html にある通り、rt2800usb.c を修正したモジュールを利用することにより、Ubuntu 12.04 から WLI-UC-GNM2 を使用することができた。

2012年8月25日土曜日

rint がない

buildroot で wpa_supplicant をコンパイルしたら、rint という関数がないと言われた。
uclibc の libm に入っているのだが、明示的に指定しないと見えないらしい。
wpa_supplicant の Makefile のライブラリ指定のところに -lm を付けたら通った。

具体的には、output/build/wpa_supplicant-0.7.3/src/drivers/drivers.mak
の、nl80211 の DRV_LIBS に -lm を追加。

2012年8月19日日曜日

TLMu で ARM Linux

■ TLMu で ARM Linux
http://www.hdlab.co.jp/web/a050consulting/b009armcpumodel/ から環境をダウンロードして動かしてみた。

環境は、Ubuntu 12.04
- systemc-2.2.0.tgz
- TLM-2.0.1.tgz
- scml-2.1.1-pv-20111213.tgz
を利用し、tlmu_arm_example/INSTALL に従ってインストールを行う。

ただし、途中 g++ のコンパイルで mutable のエラーに何度かあうので -fpermissive を付けた。

tlmu.20120529/Makefile.target で、--whole-archive オプションがあるとエラーになるので外した。

tlmu_arm_example で、LIBS に pthread を追加。また、ライブラリの順序を変えないとコンパイルが通らなかった。また、hdlab_lib/ip/versatile_vic.c cpp で、uint32_t が未定義だと言われたので、typedef unsigned int uint32_t; を追加。


無事コンパイルが通り、./run.x を実行すると xterm が立ち上がり linux が起動できた。

追記1:buildroot により作成されるルートファイルシステムには、/lib 以下が空になっているので、共有ライブラリを参照しているプログラムは動かない(busybox 以外のプログラムは基本的に動かない)。buildroot/output/toolchain/uClibc-<version>/lib/*.so* を /lib にコピーする必要がある。

追記2:起動した Linux でファイルを作成しても、Linux を起動し直すと作成したファイルは消えてしまっている。シミュレーション開始時に ramdisk.img をメモリ上に読み込んでいるが、シミュレーションした結果をもとの ramdisk.img に書き戻していないためである。

2012年8月16日木曜日

TLMu

QEMU で TLM が使えるという TLMu を Ubuntu 12.04 にインストールした。

http://edgarigl.github.com/tlmu/ 参照。


■systemc-2.3.0 をインストール。
% mkdir objdir
% cd objdir
% ../configure --prefix=<install_dir> (なんか prefix の扱いにバグがあるような気が…)
% make
% make install
% make check
※コンパイル時に -fPIC を付けないと make が通らなかった。



■tlmu 取得
% git clone git://github.com/edgarigl/tlmu.git (tlmu というディレクトリができる)

■tlmu ビルド
% mkdir build-tlmu
% cd build-tlmu
% ../tlmu/configure --extra-cflags=-fPIC
% make && make tlmu
% make install-tlmu DESTDIR=/tmp/my-tlmu/
※zlib1g-dev, libglib2.0-dev をインストールしておく必要があった

■tlmu インストールチェック(c_example)
% cd ../tlmu/tests/tlmu
% ln -sf /tmp/my-tlmu/* ./
% make c_example
% LD_LIBRARY_PATH=./lib ./c_example

■tlmu インストールチェック(sc_example)
% cd sc_example
% emacs Makefile
 (SYSTEMC, TLM2 を systemc-2.3.0 をインストールしたディレクトリに変更)
% make sc_example
% cd ..
% LD_LIBRARY_PATH=./lib:<libsystemc のパス> ./sc_example/sc_example

■arm バイナリのコンパイル
AMR926 なので、-march=armv5te を付けてコンパイルする必要あり。






2012年8月14日火曜日

Adaptive Performance Compensation with In-Situ. Timing Error Prediction for Subthreshold Circuits

・worst case を想定した設計では、消費電力が大きくなりすぎる⇒ばらつき量に応じた制御が必要。
・ばらつきの見積もり方法として、critical path replica, razor, canary FF などがある。critical path replica は、sub threshold 回路では、within die ばらつきが大きすぎて効果的ではない。また、razor はタイミング違反を発見して再実行する思想なので、シンプルなプロセッサは再実行には向かない。なので、canary FF が良い。
・in situ とは、本来の場所にてという意味。

JP 2011-199486

2 つのチャネルでそれぞれ、AP, STA として通信している無線 LAN システムにおいて、バッテリ残量が閾値以下に低下したら、1 つのチャネルで AP, STA として通信させるようにチャネルを移動することで、消費電力を削減する特許。

JP 2005-57633

・送信データレートを決定する際に、相手から受信したフレームのサブキャリア毎の振幅の変動値を見て、レートを決定する特許。
・各サブキャリアについて、I^2+Q^2 を計算し、全サブキャリアの平均と分散を計算。分散が大きければ、フェージングの影響が大きいチャネルと判断し、低レートで送信する。

特開2003-110575

送信キューを複数設け、レートが高いフレームをレートが低いフレームより優先度を上げて送信することで、レートが低い STA 間の通信に引っ張られてスループットが落ちることがないようにする特許。

AN OVERVIEW OF TECHNIQUES FOR REDUCING PEAK. TO AVERAGE POWER RATIO AND ITS SELECTION. CRITERIA FOR ORTHOGONAL FREQUENCY DIVISION. MULTIPLEXING RADIO SYSTEMS

AN OVERVIEW OF TECHNIQUES FOR REDUCING PEAK. TO AVERAGE POWER RATIO AND ITS SELECTION. CRITERIA FOR ORTHOGONAL FREQUENCY DIVISION. MULTIPLEXING RADIO SYSTEMS

PAPR 低減技術の紹介論文です。

■ block coding techniques
符号化の段階で、PAPR が高くなるようなパターンが出ないような符号化を行う。サブキャリア数がいくつになっても、またどんなマッピング方法でも PAPR が下がらないように符号を選ぶので、短い符号以外は現実的ではない。

■ sub block coding techniques
符号化率 3/4 の組織符号で、最後のビットが odd parity check にすると、PAPR が低いという性質がある?
"OFDM peak power reduction by sub-block-coding and its extended versions" 参照。

■ selected mapping
同じ内容をマッピングする方法をいくつか用意しておき、その中で最も PAPR が低いものを選択する。
side information として、どのマッピング方法を選択したかを別途送信する必要がある。
"Reducing the peak-to-average power ratio of multicarrier modulation by selective mapping"

■ Interleaving
複数のインタリーブを実行してみて、一番 PAPR が低いものを選択する。
インタリーブを最後まで実行する前に判断することもできる。

■ PTS (partial transmit sequence)
サブキャリアマッピングの後で、いくつかのサブキャリアを回転させる。
どのくらい回転させたかを受信側が知る必要がある。

■ Hadmard transform
入力列をアダマール変換すると、PAPR が 2dB 低減するらしい。

■ dummy sequence insertion
不明
"Dummy Sequence Insertion (DSI) for PAPR Reduction in the OFDM Communication System"

■ tone reservation
いくつかのサブキャリアを PAPR 低減のために利用する。(データ送受信のために使用しない)

■ active constellation
コンスタレーションの点を外側にずらして、PAPR を下げる。demap 時の境界から離れる方向に constellation を
広げるので、BER はよくなるが、送信電力が増加してしまうので、送信電力一定とすると、BER は劣化する。

■ クリッピング
振幅をクリッピングする。BER は劣化する。


A sub-pW timer using gate leakage for ul- tra low-power sub-Hz monitoring systems.

sub-pW timer using gate leakage for ul- tra low-power sub-Hz monitoring systems.

・ゲートリークを利用したタイマ。
・ゲートリークを電流源として使用し、キャパシタの電荷を徐々に放出していく。電圧が一定以下になることをコンパレータで検出するとタイムアウト。
・ゲートリークは、サブスレッショルドリークに比べて温度依存性が低い。バイオメディカル用途で、数十度の温度変動を仮定すれば十分実用的。Process ばらつきは事前に補正する。

0.5-V Input Digital Low-Dropout Regulator (LDO) with 98.7%. Current Efficiency in 65 nm CMOS

0.5-V Input Digital Low-Dropout Regulator (LDO) with 98.7%. Current Efficiency in 65 nm CMOS

・conventional LDO は、(出力電圧と参照電圧を比較する)オペアンプと(オペアンプの出力に接続され、出力電圧を制御する) 1 つの Power Transistor から成るが、0.5V 電源ではオペアンプは動作しないし、Power Transistor のゲート制御もできない。
⇒0.5V でもデジタル回路を動作させることはできるので、デジタル的に LDO を構成する。
・オペアンプはコンパレータ、Power Transistor は低電圧で動作する Transistor(=switch) array に置き換えて、0.5V 動作。