こちらのサイトを参考にマイクから入力した音にFFTをかけて出力するというプログラムを作成しているのですが、テストで440Hzのサイン波を入力したところ、ピークが本来の周波数の半分である220Hzの部分で出てしまいます。
FFT機能は自作できないので、FFTWや、こちらの質問の回答などを参考に使用しているのですが、どちらの場合でも220Hzでピークが出てしまいます。
それともファイル出力時の周波数部分の計算方法が間違っているのでしょうか
わかる方がおりましたら回答お待ちしております
C++
1case MM_WIM_DATA:{ 2 3fftIn = (fftw_complex*)fftw_malloc(FFT_N * sizeof(fftw_complex)); 4fftOut = (fftw_complex*)fftw_malloc(FFT_N * sizeof(fftw_complex)); 5 6if (!fftIn || !fftOut) { 7 OutputDebugString("failed to allocate memory(-.-)\n"); 8 return false; 9} 10if (p == NULL) 11 p = fftw_plan_dft_1d(FFT_N, fftIn, fftOut, FFTW_FORWARD, FFTW_ESTIMATE); 12 13//入力データ移動 14for (dwCount = 0; dwCount < ((PWAVEHDR)lp)->dwBytesRecorded; dwCount++) 15{ 16 //ハミング窓 17 fftIn[dwCount][0] = (double)((PWAVEHDR)lp)->lpData[dwCount] 18 * (0.54 + 0.46 * cos((double)(2 * dwCount - FFT_N) * M_PI / (double)FFT_N)); 19 fftIn[dwCount][1] = 0; 20} 21//実行 22fftw_execute(p); 23 24//ファイル出力 25ofstream fout("test1.csv"); 26fout << "Freq," << setw(5) << "Re," << setw(5) << "Im," << setw(5) << "Power" << endl; 27for (dwCount = 0; dwCount <= ((LPWAVEHDR)lp)->dwBytesRecorded / 2; dwCount++) { 28 power[dwCount] = pow(fftOut[dwCount][0], 2) + pow(fftOut[dwCount][1], 2); 29 fout << (dwCount * 48000 / FFT_N) << "," << setw(5) << fftOut[dwCount][0] << "," << setw(5) 30 << fftOut[dwCount][1] << "," << setw(5) << power[dwCount] << endl; 31} 32 33//破棄 34if (p) fftw_destroy_plan(p); 35if (fftIn) fftw_free(fftIn); 36if (fftOut) fftw_free(fftOut); 37 38return 0; 39}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/21 10:37
2019/11/21 16:27
2019/11/21 23:31
2019/11/22 00:08