C++ 向libmfcc库提供浮点数组
我想使用C++ 向libmfcc库提供浮点数组,c++,arrays,parameters,mfcc,C++,Arrays,Parameters,Mfcc,我想使用libmfcc库来计算这些系数。但我有一系列的浮动。函数getcoefficifNet需要一个双精度数组。我试图覆盖此函数的参数,但仍然不起作用。最好的解决方案是,如果我从这个函数中得到浮点数。什么是参数大小,是输入数组的大小还是其他什么 int freq = 44100, filter = 48, size = 1024, mfccCount = 26; //const float realPartArray = new float[size]; //input spe
libmfcc
库来计算这些系数。但我有一系列的浮动。函数getcoefficifNet
需要一个双精度数组。我试图覆盖此函数的参数,但仍然不起作用。最好的解决方案是,如果我从这个函数中得到浮点数。什么是参数大小,是输入数组的大小还是其他什么
int freq = 44100, filter = 48, size = 1024, mfccCount = 26; //const
float realPartArray = new float[size]; //input spectral array
double mfccArray = new double[mfccCount]; //output array
for (int i = 0; i < mfccCount; i++)
mfccArray[i] = getCoefficient(realPartArray, freq, filter, size, i);
intfreq=44100,filter=48,size=1024,mfccCount=26//常数
float realPartArray=新浮点[大小]//输入光谱阵列
double mfccArray=新的双精度[mfccCount]//输出阵列
对于(int i=0;i
不能将一种类型的数组传递给需要另一种类型数组的函数。这在其他语言中是可能的,但在C/C++中是不可能的。请不要试着投下它们,在最好的情况下你会得到丑陋的结果,在最坏的情况下你会得到分割错误
您需要将一个数组的所有值复制到另一个数组。编译器将负责将浮点转换为双精度浮点,但循环需要由您编写:)这是一项简单的任务,两行代码加上一些大括号
您的变量size
显然是样本数。你的循环需要这个
一个小建议:即使这是有效的代码
for (int i = 0; i < mfccCount; i++)
mfccArray[i] = getCoefficient(realPartArray, freq, filter, size, i);
哎哟 快速回答是libmfcc在输入端等待FFT数组,直到序列是下一个:
1: wave signal ---> get window 1 ---> do FFT on window 1 ---> getCoefs
2: wave signal ---> get window 1 ---> do FFT on window 2 ---> getCoefs
...
N: wave signal ---> get window N ---> do FFT on window N ---> getCoefs
第一,第二:
在文档中,他们注意到他们等待获取的阵列可能是使用库准备的。因此,伪代码如下所示:
#include <fftw3.h>
#include <libmfcc.h>
...
double **func(double *in) {
double *out = NULL;
double **mfccArray = NULL;
// allocate memory, set variables...
// Do fft on "in", in real life you'll be using Windows like (Hann, etc.) and
// you will split input into parts with overlapping like this:
// in:[1,2,3,2,1,2,3,4,3,7,4,2,3,4]
// window_size = 4; window_step = 2;
// wnd[1]:[1,2,3,2]
// wnd[2]:[3,2,1,2]
// ...
plan_forward = fftw_plan_dft_r2c_1d(N, in, out, FFTW_ESTIMATE);
// Do MFCC loops here:
mfccArray[i] = getCoefficient(out, freq, filter, size, i);
return mfccArray;
}
#包括
#包括
...
双**功能(双*英寸){
double*out=NULL;
双**mfccArray=NULL;
//分配内存,设置变量。。。
//在“in”上进行fft,在现实生活中,您将使用(Hann等)和
//将输入拆分为重叠的部分,如下所示:
//in:[1,2,3,2,1,2,3,4,3,7,4,2,3,4]
//窗口大小=4;窗口步长=2;
//wnd[1]:[1,2,3,2]
//wnd[2]:[3,2,1,2]
// ...
向前计划=fftw计划dft r2c 1d(N,输入,输出,fftw估算);
//在此处执行MFCC循环:
mfccArray[i]=获取系数(out、freq、filter、size、i);
返回MFC阵列;
}
我希望这能对我们有所帮助。抱歉回答得太晚。您想分享一些详细信息吗?你到底做了什么?你有编译器错误吗?链接器错误?你得到的结果是否与你的期望不符?很抱歉,我看不懂你的心思。顺便说一句:你可以用这些细节更新你上面的问题,你不必在这里提供这些细节(对此的评论非常有限)。我尝试了你的解决方案,但函数GetCourtifier仍然不起作用。错误:未定义对GetConference的引用(double*,uint,uint,uint,uint);我从我的项目中删除文件,然后添加它,但它没有帮助。重建,也清除。你知道为什么会这样吗?“未定义对…”的引用是链接器错误。您是否也在编译文件
libmfcc.c
?仅包含头文件是不够的,还需要编译该代码!或者将其链接为一个库。这里有很多例子,评论部分太有限了,我无法在这里解释。顺便说一句,谢谢你发布代码!但请注意数组大小。preMfccArray
有多大尺寸?1024还是513?请重新检查,否则您将得到意外的结果。
#include <fftw3.h>
#include <libmfcc.h>
...
double **func(double *in) {
double *out = NULL;
double **mfccArray = NULL;
// allocate memory, set variables...
// Do fft on "in", in real life you'll be using Windows like (Hann, etc.) and
// you will split input into parts with overlapping like this:
// in:[1,2,3,2,1,2,3,4,3,7,4,2,3,4]
// window_size = 4; window_step = 2;
// wnd[1]:[1,2,3,2]
// wnd[2]:[3,2,1,2]
// ...
plan_forward = fftw_plan_dft_r2c_1d(N, in, out, FFTW_ESTIMATE);
// Do MFCC loops here:
mfccArray[i] = getCoefficient(out, freq, filter, size, i);
return mfccArray;
}