整数値を持つ配列を周波数領域にフーリエ変換する必要があります(後で別のものに乗算するため)。出力配列のサイズは44100でなければなりませんが、入力配列は変化します。C++:fftw3を使って配列を別のサイズの配列にフーリエ変換する方法
私はfftw3がそのための良いツールだと思います。しかし、どのように私は入力と出力のための異なる配列サイズの '計画'を作成するのですか?ここ
私が書いた関数である:
fftw_complex* fourier(int* samples, int numberOfSamples){
fftw_complex* input;
fftw_complex* output;
fftw_plan plan;
input = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*numberOfSamples);
output = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*44100); //cd-quality
plan = fftw_plan_dft_1d(44100, input, output, FFTW_FORWARD, FFTW_ESTIMATE);
// here is the problem because ^this
// array has a different size than
// ^this array
for(size_t index = 0; index < numberOfSamples; index++){
input[index][0] = (double)(samples[index]);
input[index][1] = 0;
}
fftw_execute(plan);
fftw_destroy_plan(plan);
fftw_free(input);
return output;
}
おかげで、離散フーリエ変換を
「44100」は、オーディオサンプリングレートのように見えます。通常、 'fft'配列のサイズはサンプリングレートとは無関係であり、2の累乗です。通常、入力と出力の配列のサイズは、数学的な要件のために一致します。実際の入力データのサイズが配列のサイズと一致しない場合、これを修正するためにウィンドウ処理とゼロパディングの技法があります。この問題については十分な数の文献があります。 – user3078414
他の人はすでに、入力と出力の長さが一致しなければならないと述べています。多分あなたはあなたがしようとしていることについてもう少しコンテキストを与えることができます。そのマジックナンバーに基づいて、あなたはHz(おそらく)あたり1ビンでパワースペクトルを推定しようとしているようです。その場合、44100サンプルまで入力をゼロにするだけで、スペクトルを滑らかにしなければならない入力ブロックにウィンドウ関数(ハニングを試してみる)を適用するだけです。 –