将浮点数组提供给 libmfcc 库

Giving array of float to libmfcc library

我想使用 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);

每次有 ifforwhile 语句时,请考虑使用大括号。下次您想扩展该语句时,您就会知道为什么

for (int i = 0; i < mfccCount; i++)
    std::cout << i << std::endl;
    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

那第一、第二:

在文档中,他们指出他们正在等待获取的数组可能是使用 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;
}

我希望这对我们有所帮助。抱歉回复晚了。