ソフトウェア エンジニアとして、信号処理の問題に取り組んでいるときに、いくつかの問題に直面しています。私はこの分野での経験があまりありません。
私がやろうとしているのは、44100 のサンプリング レートで環境音をサンプリングし、固定サイズのウィンドウで特定の周波数 (20KHz) が存在し、しきい値よりも高いかどうかをテストすることです。
CでFFTWを使用してPortAudioからサンプルから周波数情報を抽出する方法の完璧な答えに従って私が行うことは次のとおりです
102400 サンプル (2320 ミリ秒) が 44100 サンプリング レートのオーディオ ポートから収集されます。サンプル値は 0.0 から 1.0 の間です
int samplingRate = 44100;
int numberOfSamples = 102400;
float samples[numberOfSamples] = ListenMic_Function(numberOfSamples,samplingRate);
ウィンドウ サイズまたは FFT サイズは 1024 サンプル (23.2 ms)
int N = 1024;
ウィンドウ数は100
int noOfWindows = numberOfSamples / N;
サンプルをそれぞれ N (1024) サンプルのサイズを持つ noOfWindows (100) ウィンドウに分割する
float windowSamplesIn[noOfWindows][N];
for i:= 0 to noOfWindows -1
windowSamplesIn[i] = subarray(samples,i*N,(i+1)*N);
endfor
各ウィンドウにハニング ウィンドウ関数を適用する
float windowSamplesOut[noOfWindows][N];
for i:= 0 to noOfWindows -1
windowSamplesOut[i] = HanningWindow_Function(windowSamplesIn[i]);
endfor
各ウィンドウに FFT を適用する (実数から複素数への変換は FFT 関数内で行われます)
float frequencyData[noOfWindows][samplingRate/2];
for i:= 0 to noOfWindows -1
frequencyData[i] = RealToComplex_FFT_Function(windowSamplesOut[i], samplingRate);
endfor
最後のステップでは、次のリンクで実装されている FFT 関数を使用します: http://www.codeproject.com/Articles/9388/How-to-implement-the-FFT-algorithm ; FFT関数を最初から実装することはできないためです。
確信が持てないのは、N (1024) サンプルを FFT 関数に入力として与えると、samplesRate/2 (22050) デシベル値が出力として返されることです。それはFFT関数が行うことですか?
ナイキスト周波数のせいで、最大でサンプリング周波数の半分の周波数を検出できることを理解しています。しかし、samplingRate/2 (22050) Hz までの各周波数のデシベル値を取得することは可能ですか?
ありがとう、ヴァヒト