お世話になっております。
音声雑音処理としてウィーナーフィルタを作ろうとしています。
今回雑音とするのは「近くで喋っている人の声以外」です。
近くというのも曖昧ですので具体例を出しますが、雑音かどうかは自己相関を使って決めています。
相関が有れば人の声と判断し、無いなら雑音としています。
現在作ってうまくいってないのですが、基本的な流れを以下に示します。
サンプリング周波数16kHzで128サンプル取得
↓
相関を求め、雑音なら雑音の配列に移動。
この時、ノイズのデータは蓄積されていて、「今までのノイズデータの半分+最新のノイズデータの半分」がノイズの配列に入っています。つまり古いデータになればなるほど、配列内での割合は小さくなっていきます。
↓
ハニング窓をかけ、FFTで音声のデータを周波数毎のスペクトルに変換し、それぞれからノイズの平均スペクトルを減算、0以下になったら0にする。
↓
IFFTで音声に戻す
この流れです。
FFTはオーバーラップを考慮していません。
結果は声が入ってる時の音声が変で、ケロケロした声といった感じです。
ウィーナーフィルタの仕組みはわかっていても、雑音をどのように定義するかが難しく困っています。
相関は0.05〜0.95まで、減算はノイズの平均スペクトルの0.1倍から8倍まで試しましたがうまくいきません。
一般的にウィーナーフィルタとはどのように設計されているのでしょうか?
サンプリング周波数は固定で、FFTの要素数は計算速度の都合上256までに留めています。
言語はc言語です。
あなたの回答
tips
プレビュー