Armadillo 将 wav 文件加载到 mat
Armadillo load wav file to mat
我想使用 matlab 中的 Armadillo. It looks like wavread 函数将 wav 文件读入 mat:
[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);
我的问题:
- 这种方式正确吗?似乎我只能读取固定数量的样本。
- 如何将示例数据转换为
mat
或 vec
?
- 有没有办法像这样的 matlab 代码通过冒号范围索引访问矩阵:
sample_data = sample_data(1 : sample_rate * 1.5);
?
是的,这样正确。如果您需要获取所有样本,您可以这样做:
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);
例如这样:
mat m1(vec.size(),sample_chanels);
for( size_t i=0;i<vec.size();i++)
m1.row(i) = mat(vec[i]).t();
无法完整类比,但可以使用std::copy(),因为mat有成员函数begin()
arma::vec D(shift);
if(shift < m1.size())
std::copy(m1.begin(),m1.begin()+shift,D.begin());
Link 到完整的例子:
http://pastebin.com/X4fgzBrR
我想使用 matlab 中的 Armadillo. It looks like wavread 函数将 wav 文件读入 mat:
[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);
我的问题:
- 这种方式正确吗?似乎我只能读取固定数量的样本。
- 如何将示例数据转换为
mat
或vec
? - 有没有办法像这样的 matlab 代码通过冒号范围索引访问矩阵:
sample_data = sample_data(1 : sample_rate * 1.5);
?
是的,这样正确。如果您需要获取所有样本,您可以这样做:
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);
例如这样:
mat m1(vec.size(),sample_chanels); for( size_t i=0;i<vec.size();i++) m1.row(i) = mat(vec[i]).t();
无法完整类比,但可以使用std::copy(),因为mat有成员函数begin()
arma::vec D(shift); if(shift < m1.size()) std::copy(m1.begin(),m1.begin()+shift,D.begin());
Link 到完整的例子: http://pastebin.com/X4fgzBrR