トップ «前の日記(2010/05/27(Thu)) 最新 次の日記(2010/05/29(Sat))»
【ソース+水=麦茶色の何か】

半期 四半期 全カテゴリ

今日の一言


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でスペクトログラムのページを見て、適当にやっただけなので、正確なものかどうかは微妙だが。

もしかしたら、もっと複雑な処理が必要なのかもしれん。(ウェーブレット変換を使うとか?)