オーディオストリームに存在する静的またはノイズの量を定性的に処理しようとしています。ストリームの通常のコンテンツは音声または音楽です。
私はサンプルの標準偏差を取得することを試みてきましたが、それは音声と空のチャネルノイズの存在をある程度処理することができます(つまり、標準偏差が高い場合は通常、音声または音楽を示します)
他の誰かがこれについていくつかの指針を持っているかどうか疑問に思っていました。
オーディオストリームに存在する静的またはノイズの量を定性的に処理しようとしています。ストリームの通常のコンテンツは音声または音楽です。
私はサンプルの標準偏差を取得することを試みてきましたが、それは音声と空のチャネルノイズの存在をある程度処理することができます(つまり、標準偏差が高い場合は通常、音声または音楽を示します)
他の誰かがこれについていくつかの指針を持っているかどうか疑問に思っていました。
ピーク値はあなたに答えを与えませんか?優れたADCからの信号を見ている場合、周囲レベルは1または10カウントである必要がありますが、音声または音楽は数千カウントになります。この戦略を機能させないような自動ゲイン制御はありますか?
より複雑なものが必要な場合は、ピークとRMSの比率は、単純なRMSレベル(RMS = stddev)よりも少し信頼性が高い可能性があります。純粋なノイズの比率は約3〜5ですが、たとえば正弦波のピークとRMSの比率は1.4です。ただし、信号のスペクトルを調べることで、より多くの識別を得ることができます。静的は通常、スペクトル的に滑らかまたは平坦ですが、音声と音楽はスペクトル的に構造化されています。したがって、フーリエ変換はあなたが探しているものかもしれません。たとえば、0.5秒に相当するデータを含む信号xを想定すると、Matlabコードは次のようになります。
Sx = fft(x .* hann(length(x), 'periodic'))
HANN関数はハンウィンドウを適用してスペクトル漏れを減らし、FFT関数はフーリエ変換をすばやく計算します。これで、いくつかの選択肢があります。信号xが静的なものか音声/音楽で構成されているかを判断する場合は、スペクトルのRMS比に対するピークを取得します。
pk2rms = max(abs(Sx))/sqrt(sum(abs(Sx).^2)/length(Sx))
純粋なスタティックのピークとRMSの比率は(再び)約3〜5であると思いますが、音声/音楽は少なくとも1桁高くなります。これは、純粋なホワイトノイズが時間領域と周波数領域で同じ「構造」を持っているという事実を利用しています。
ノイズレベルの数値推定を取得する場合は、平均を使用して、時間の経過に伴うSxのパワーを計算できます。
Gxx = ((k-1)*Gxx + Sx.*conj(Sx))/k
時間の経過とともに、Gxxのピークは出入りするはずですが、ノイズフロアに対応する一定の最小値が表示されるはずです。一般に、オーディオスペクトルは、dB(対数垂直)スケールで見やすくなります。
注:
1。xの長さとして0.5秒を選択しましたが、ここでの最適値がわかりません。短すぎる値を選択すると、xはあまり構造になりません。その場合、信号のDC成分は多くのエネルギーを持ちます。ただし、最初にDCに対応するSxのビンを捨てる場合は、ピークからRMSディスクリミネーターを使用できると思います。
2. kの適切な値が何であるかはわかりませんが、その方程式は指数平均に対応します。おそらくkを試して、最適な値を見つけることができます。これは、短いxで最適に機能する可能性があります。
ノイズにはさまざまな種類があります。白、ピンク、茶色。ノイズは多くの場所から発生する可能性があります。60ヘルツのハムノイズまたは信号ですか?
ホワイトノイズの場合、fftを調べて最小値を見つけ、ノイズフロアが何であるかを確認します。