我想使用libmfcc
库来计算这些系数。但是我有一系列的花车。和功能getCoefficinet
想要一系列双打。我试图覆盖此功能的参数,但它仍然不起作用。最好的解决方案是,如果我从此功能中获得了浮动。什么是参数大小,它是输入数组的大小还是不同的?
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);
您不能将一种类型的数组传递给期望另一种类型数组的函数。在其他语言中可能是可能的,但是在C/C 中是不可能的。而且请不要试图施放它们,在最坏情况下,您会在最佳情况下获得丑陋的结果。
您需要将一个数组的所有值复制到另一个数组。编译器将负责将浮子施放给双倍,但是循环需要由您编写:)这是一项简单的任务,两行代码以及一些括号。
您的变量size
显然是样本的数量。您需要循环。
一个小建议:即使这是有效的代码
for (int i = 0; i < mfccCount; i++)
mfccArray[i] = getCoefficient(realPartArray, freq, filter, size, i);
请考虑每次使用if
,for
,while
语句使用括号。下次您想扩展该语句时,您将知道为什么
for (int i = 0; i < mfccCount; i++)
std::cout << i << std::endl;
mfccArray[i] = getCoefficient(realPartArray, freq, filter, size, i);
ouch!
快速答案是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
第一,第二:
在文档中,他们指出,他们正在等待获得的数组可能会使用FFTW3库准备。因此,伪代码就像:
#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;
}
我希望这会有所帮助。对不起,回答较晚。