7

ソフトウェア エンジニアとして、信号処理の問題に取り組んでいるときに、いくつかの問題に直面しています。私はこの分野での経験があまりありません。

私がやろうとしているのは、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 までの各周波数のデシベル値を取得することは可能ですか?

ありがとう、ヴァヒト

4

2 に答える 2

7

FFT の各値の周波数を取得するにはどうすればよいですか? を参照してください。

1024 のサンプル入力から、512 の意味のある周波数レベルを取得できます。

つまり、ウィンドウ内で、ナイキスト周波数のレベルが返されます。

表示される最低周波数レベルは DC (0 Hz) で、次は SampleRate/1024 または約 44 Hz、次は 2 * SampleRate/1024 など、最大 512 * です。サンプルレート / 1024 Hz。

于 2012-08-19T20:24:02.570 に答える
2

FFT では 1 つのバンドしか使用されていないため、適切なウィンドウ処理を行っても、サイドバンド効果によって結果が損なわれることが予想されます。うまくいくかもしれませんが、入力周波数によっては誤検知が発生する可能性もあります。また、信号はニキストに近いため、FFT までのかなり良好な信号経路を想定しています。これは正しいアプローチではないと思います。

この種の信号検出へのより良いアプローチは、高次フィルターを使用することだと思います(要件に応じて、4次または5次と推測しますが、実際にはそれほど高くはありません)。高次フィルターの設計方法がわからない場合は、2 つまたは 3 つの 2 次フィルターを直列に使用できます。「biquad」と呼ばれることもある 2 次フィルターの設計については、次のように説明されています。

http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt

非常に簡潔ではありますが、いくつかの事前知識を前提としています。コーナー周波数をできる限り低くしたハイパス (HP) フィルターを使用します。おそらく 18 ~ 20 kHz です。コーナー周波数でいくらかの減衰があることに注意してください。そのため、フィルターを複数回適用すると、信号が少しドロップされます。

オーディオをフィルタリングした後、RMS または平均振幅 (つまり、絶対値の平均) を取得して、一定期間の平均レベルを見つけます。

この手法には、遅延の改善 (数サンプル以内で検出を開始できる)、信頼性の向上 (スプリアス周波数の大きな信号に応答して誤検知が発生しない) など、現在行っていることよりもいくつかの利点があります。 .

この投稿は関連性があるかもしれません: http://blog.bjornroche.com/2012/08/why-eq-is-done-in-time-domain.html

于 2012-08-20T00:43:05.650 に答える