Я хочу использовать 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;
}
Надеюсь, в этом мы немного поможем. Извините за столь поздний ответ.