犰狳加载wav文件到mat

Armadillo load wav file to mat

本文关键字:mat 文件 wav 加载      更新时间:2023-10-16

我想使用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. 如何将样本数据转换为matvec ?
  3. 是否有任何方法通过冒号范围索引访问矩阵,如matlab代码:sample_data = sample_data(1 : sample_rate * 1.5); ?
  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