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;
}