Предоставление массива с плавающей точкой в ​​библиотеку libmfcc

Я хочу использовать 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);

0

Решение

Вы не можете передать массив одного типа в функцию, которая ожидает массив другого типа. Это может быть возможно в других языках, но невозможно в 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);

Ой!

0

Другие решения

Быстрый ответ заключается в том, что 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;
}

Надеюсь, в этом мы немного поможем. Извините за столь поздний ответ.

0

По вопросам рекламы [email protected]