2017-05-06 15 views
0

私はこれらの係数を計算するためにlibmfccライブラリを使いたいと思います。しかし、私はフロートの配列を持っています。そして、関数getCoefficinetは2倍の配列を必要とします。私はこの関数のパラメータを上書きしようとしましたが、それでも動作しません。最善の解決策は、私がこの関数から浮動小数点を取得する場合です。そして、パラメータの大きさは何ですか、それは入力配列のサイズですか、それとも何か違うのですか?floatの配列をlibmfccライブラリに与える

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++では不可能です。そして、それらをキャストしようとしないでください、あなたは最悪の場合に最良のケースとセグメンテーション違反で醜い結果を得るでしょう。

あるアレイのすべての値を他のアレイにコピーする必要があります。コンパイラはfloatをdouble型にキャストする処理を行いますが、ループを書く必要があります:)これは簡単な作業です.2行のコードといくつかの中カッコがあります。

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

おっと!

+0

いくつかの詳細を共有しますか?何を正確にしましたか?コンパイラエラーはありますか?リンカのエラー?期待通りの結果が得られますか?申し訳ありませんが、私はあなたの心を読むことができません。 – craesh

+0

Btw:あなたの質問を上記の詳細で更新することができます。あなたはここにそれらを提供する必要はありません(コメントは非常に限られています)。 – craesh

+0

私はあなたのソリューションを試しましたが、GetCoefficient関数はまだ動作しません。 エラー:GetCoefficientへの未定義の参照(double *、uint、uint、uint、uint); プロジェクトからファイルを削除して追加しますが、それは役に立ちません。再構築もクリア。あなたは何か考えているのですか?それはなぜですか? https://paste2.org/CDY2JJXO –

0

クイック答えは、入力のFFT配列を待っlibmfcc、限りシーケンスは次のようにということである:

ドキュメントの

は、彼らがしているその配列を指摘:第一、第二

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

私はこれを少し助けてくれることを願っています。返事遅れてすみません。

関連する問題