Armadillo загрузить WAV файл в коврик

Я хочу прочитать WAV-файл в мат, используя броненосец. Это выглядит как wavread функция в Matlab:

[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 или же vec?
  3. Есть ли способ получить доступ к матрице по индексу диапазона двоеточия, как этот код Matlab: sample_data = sample_data(1 : sample_rate * 1.5); ?

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 (), потому что в мате есть функции-члены begin ()

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

Ссылка на полный пример:
http://pastebin.com/X4fgzBrR

4

Другие решения


По вопросам рекламы [email protected]