将浮点数组提供给 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);
每次有 if
、for
、while
语句时,请考虑使用大括号。下次您想扩展该语句时,您就会知道为什么
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;
}
我希望这对我们有所帮助。抱歉回复晚了。
我想使用 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);
哎哟!
快速回答是 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;
}
我希望这对我们有所帮助。抱歉回复晚了。