2016-07-05 7 views
-3

に「フロート*」「CARRAY&」から引数1を変換できません(this rosettacode.org C++ implementation of FFTvoid fft(CArray &x) { ... }を、あるいは私がC implementationを使うべきなのでしょうか?)、このデータによって与えられた配列に:は、私はFFT適用しようとしている

float *x 
VstInt32 sampleFrames // basically the length of the array 

私が行うと:

fft(x); 

は私が手:

error C2664: 'void fft(CArray &)' : cannot convert argument 1 from 'float *' to 'CArray &' 

この種のエラーを解決する方法は?


+0

?あなたはエラーを表示しましたが、エラーの原因となったコードはありません – EdChum

+0

@EdChumを申し訳ありません。私は 'void fft(CArray&x){...}'を追加し、 'fft(x);と呼んでいます – Basj

+0

なぜこれが動作すると思いますか?このリンクでは、 'typedef std :: valarray CArray;'浮動小数点型 'ではありません。 – EdChum

答えて

1

あなたはCARRAY型の別名に配列を変換する必要があります:

コードの残りの部分だ

http://coliru.stacked-crooked.com/a/20adde65619732f8

typedef std::complex<double> Complex; 
typedef std::valarray<Complex> CArray; 

void fft(CArray& x) 
{ 
} 

int main() 
{ 
    float sx[] = {1,2,3,4}; 

    float *x = sx; 
    int sampleFrames = sizeof(sx)/sizeof(sx[0]); 

    // Convert array of floats to CArray 
    CArray ca; 
    ca.resize(sampleFrames); 
    for (size_t i = 0; i < sampleFrames; ++i) 
     ca[i] = x[i]; 

    // Make call 
    fft(ca); 
} 
+0

ありがとう!これにより、配列のコピーが新しい 'CArray'にコピーされます。コピーしないで 'float *'からCArrayを作成する方法はありませんか? – Basj

+0

私はそうは思わない、あなたのソースデータは浮動小数点型であり、それを複素数に変換する必要があり、Cバージョンでもコピーする必要があるということです。ここではすべてのvalarrayコンストラクタを見つけることができます:http://en.cppreference.com/w/cpp/numeric/valarray/valarray – marcinj

+0

True、thanks @MarcinJędrzejewski。これはとにかくrfftが必要だと思うようになります(実際のFFTはここです:http://docs.scipy.org/doc/numpy/reference/generated/numpy.fft.rfft.html) – Basj

関連する問題