RMS値の算出

2バイト長整数を羅列しただけのバイナリファイルからRMS値を算出するには、

rms=`cat temp.raw |\
od -w2 -t d2 -v -An |\
awk '{m+=$1^2} END{print sqrt(m/NR);}'`

echo $rms

だけです。

-w2 は2バイトずつ読み込む、-t d2 は符号付2バイト長整数、 -v は繰り返し省略禁止、-Anはオフセットアドレスの非表示を意味するオプションです。

このあたりのオプションを使いこなせば4バイト長整数や浮動小数点数も計算可能だと思います。またヘッダーやフッターがあってもddコマンドが利用可能です。

 

当初SCILABを使用しました。SCILABでも配列Xに所望のファイルを読み込んだとすると

sqrt(x'*x/size(x,1))

だけで求めることができます。ですから起動さえしてしまえば結構速いのですが、SCILAB自体の起動に時間がかかってしまうため、繰り返しが多い用途には不向きでした。

 

また、bcでも累乗や平方根は計算できるので、オクタルダンプしてforループでbcを回してみました。しかし、これもループに結構時間がかかったため断念しました。

 

その点、awkだと速いし、行数は少ないし、コンパイルしないで済むし、良いことづくめです。