【问题标题】:Armadillo load wav file to mat犰狳加载wav文件到垫子
【发布时间】:2015-10-16 04:04:44
【问题描述】:

我想使用Armadillo 将 wav 文件读入 mat。它看起来像 matlab 中的 wavread 函数:

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

好像犰狳不支持这个,所以我尝试使用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. 如何将示例数据转换为matvec
  3. 有没有办法通过冒号范围索引访问矩阵,如 matlab 代码:sample_data = sample_data(1 : sample_rate * 1.5);

【问题讨论】:

    标签: c++ matlab armadillo libsndfile


    【解决方案1】:
    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. 没有完整的类比,但是可以使用std::copy(),因为mat有成员函数begin()

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

    完整示例的链接: http://pastebin.com/X4fgzBrR

    【讨论】:

    猜你喜欢
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多