2017-05-06 2 views
0

Ich möchte libmfcc Bibliothek für die Berechnung dieser Koeffizienten verwenden. Aber ich habe eine Reihe von Schwimmern. Und Funktion getCoefficinet will eine Reihe von Doppel. Ich habe versucht, Parameter dieser Funktion zu überschreiben, aber es funktioniert immer noch nicht. Die beste Lösung wäre, wenn ich von dieser Funktion schwebt. Und was ist die Parametergröße, ist es eine Größe von Input-Array oder etwas anderes?Geben Array von float libmfcc Bibliothek

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

Antwort

0

Sie können ein Array eines Typs nicht an eine Funktion übergeben, die ein Array eines anderen Typs erwartet. Das ist vielleicht in anderen Sprachen möglich, aber in C/C++ ist das unmöglich. Und bitte versuche nicht, sie zu werfen, du wirst im besten Fall hässliche Ergebnisse bekommen und im schlimmsten Fall einen Segmentierungsfehler.

Sie müssen alle Werte eines Arrays in das andere kopieren. Der Compiler kümmert sich darum, die Floats in Doubles umzuwandeln, aber die Schleife muss von Ihnen geschrieben werden :) Es ist eine einfache Aufgabe, zwei Zeilen Code plus einige Klammern.

Ihre Variable size ist offensichtlich die Anzahl der Proben. Das brauchst du für deine Schleife.

Ein kleiner Tipp: Auch wenn dieser gültiger Code ist

for (int i = 0; i < mfccCount; i++) 
    mfccArray[i] = getCoefficient(realPartArray, freq, filter, size, i); 

Bitte beachten Sie Klammern verwenden, jedesmal wenn Sie eine if, for, while Aussage. Nächstes Mal, wenn Sie diese Aussage erweitern möchten, werden Sie wissen, warum

for (int i = 0; i < mfccCount; i++) 
    std::cout << i << std::endl; 
    mfccArray[i] = getCoefficient(realPartArray, freq, filter, size, i); 

Ouch!

+0

Wollen Sie einige Details teilen? Was hast du genau gemacht? Erhalten Sie einen Compilerfehler? Linkerfehler? Erhalten Sie ein Ergebnis, das nicht Ihren Erwartungen entspricht? Es tut mir leid, ich kann deine Gedanken nicht lesen. – craesh

+0

Btw: Sie können Ihre Frage oben mit diesen Details aktualisieren, Sie müssen sie hier nicht zur Verfügung stellen (Kommentare sind dafür sehr begrenzt). – craesh

+0

Ich habe Ihre Lösung versucht, aber die Funktion GetCoefficient funktioniert immer noch nicht. Fehler: undefinierter Verweis auf GetCoefficient (double *, uint, uint, uint, uint); Ich lösche Datei von meinem Projekt und füge es dann hinzu, aber es hilft nicht. Rebuild, löschen Sie auch. Hast du eine Idee, warum es das tut? https://paste2.org/CDY2JJXO –

0

Schnell Antwort ist, dass für die FFT-Anordnung auf dem Eingang libmfcc warten, bis die Sequenz nächsten ist:

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 

Das erste, zweite:

in Dokumentation sie das Array stellten sie fest sind warten, um zu erhalten, kann unter Verwendung fftw3 Bibliothek vorbereitet werden. Also wäre der Pseudocode wie folgt:

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

Ich hoffe, dass wir ein bisschen helfen werden. Entschuldigung für die Späte Antwort.

Verwandte Themen