今日の一言
2010/05/28(Fri) 五郎入道政宗! [長年日記] 1:30現在曇 13℃
_ [Linux][Ubuntu][Debian][FC][C++][研究関係][雑記]stringstreamの話(stringを使った文字列の操作)
プログラムで連続したファイル名を生成したい場合等に便利。
こんな感じで使う。
#include<iostream> #include<sstream> int main( int argc, char **argv ) { std::stringstream ss; for( int i=0; i<10; i++ ){ ss.str(""); ss << "hogehoge" << i+1 << ".dat"; std::cout << ss.str() << std::endl; } return 0; }
毎回、str("")で初期化しないと、stringstreamのバッファが残ってしまい、ファイル名がつながってしまうっぽい。
*strはバッファに文字列を代入する関数なので、空を代入することで初期化できる。
*というか、.ckear()というそれっぽいメンバ関数を持ちながら、単にストリームのエラーフラグをクリアするためのものってのは、凄く分かりにくい。
まあ、下のみたいな使い方をすれば、バッファの初期化などそもそも不要な気もするが。
#include<iostream> #include<sstream> using namespace std; int main( int argc, char **argv ) { for( int i=0; i<2; i++ ) { FILE *fpw; stringstream ss; string filename; ss << "hoge" << i+1 << ".dat"; filename = ss.str(); if ((fpw = fopen(filename.c_str(), "w")) == NULL) { printf("file open error!!\n"); return(-1); } } return 0; }
_ [gnuplot][Windows][Linux][Ubuntu][Debian][FC][C++][研究関係][雑記]手軽にスペクトログラムを作成する(gnuplotを使う)
*高確率で間違った情報が混ざっています。気をつけてください。
とりあえず、入力信号にフーリエ変換をかけるプログラムは、FFTWを使えば簡単に出来ると思う。
*ここ(http://www32.atwiki.jp/amaeda/)とかが詳しい。
なので、それを応用して、適当なデータ数(256とか512ぐらい)の長さで区切った短時間フーリエ変換(STFT)を時間毎に行うようなプログラムを書き、その結果をファイルに書き出せるようにする。
ファイルへのデータ出力は、
時間 周波数 強さ
の順で並べておく。
*wikipediaいわく、スペクトログラムでは、STFTの結果の絶対値を2乗したもの強さとして使うらしい。
後は、そのデータファイルをgnuplot(ver.4以上)で読み込み、 pm3dを使って底面だけを2次元表示すればOK。
具体的には、
gnuplot> set pm3d map gnuplot> splot "hogehoge.dat"
とする。もちろん、画像ファイルとしても出力できる。
*枠だけ表示され、データが白紙の場合は、適当な間隔で改行を入れればいい。
詳しくはこちらを(http://www-ise2.ist.osaka-u.ac.jp/~shinkai/gnuplot/)。
思った以上にすぐに出来たので、データの分析がかなりしやすくなった。
まあ、wikipediaでスペクトログラムのページを見て、適当にやっただけなので、正確なものかどうかは微妙だが。
もしかしたら、もっと複雑な処理が必要なのかもしれん。(ウェーブレット変換を使うとか?)