1

Armadilloを使って wav ファイルを mat に読み込みたい。matlab のwavread関数のように見えます。

[sample_data,sample_rate] = wavread('test.wav');
sample_data = sample_data(1 : sample_rate * 1.5);

Armadillo はこれをサポートしていないようなので、libsndfile libを使用しようとしました。

SNDFILE     *infile = NULL ;
SF_INFO     sfinfo ;
infile = sf_open(filename, SFM_READ, &sfinfo);

int N = 1024;
double samples[N];
double sample_rate = sfinfo.samplerate;
sf_read_double(infile, samples, N);

私の質問:

  1. この方法は正しいですか?固定量のサンプルしか読み取れないようです。
  2. matサンプル データをorに変換するにはどうすればよいvecですか?
  3. この matlab コードのように、コロン範囲インデックスで行列にアクセスする方法はありますsample_data = sample_data(1 : sample_rate * 1.5);か?
4

1 に答える 1

4
  1. はい、この方法で正しいです。すべてのサンプルを取得する必要がある場合は、次のようにします。

    auto sample_chanels = sfinfo.channels;
    
    std::vector<std::vector<double>> vec;
    
    std::vector<double> temp(sample_chanels);
    
    while(sf_read_double(infile, temp.data(), sample_chanels))
    vec.push_back(temp);
    
  2. たとえば、次のようにします。

    mat m1(vec.size(),sample_chanels);
    
    for( size_t i=0;i<vec.size();i++)
       m1.row(i) = mat(vec[i]).t();
    
  3. 完全な類推は利用できませんでしたが、mat にはメンバー関数 begin() があるため、std::copy () を使用できます。

      arma::vec D(shift);
    
      if(shift < m1.size())
        std::copy(m1.begin(),m1.begin()+shift,D.begin());
    

完全な例へのリンク: http://pastebin.com/X4fgzBrR

于 2015-07-26T19:41:24.867 に答える