お世話になっております。
c言語を使って音声処理をしようと考えております。
目標としては生活音を取得し、その中の3kHz以下の音声を削除するハイパスフィルタのようなものを作成したいです。
ただし、フィルタ係数等を使ったフィルタ作成ではなく、FFTを用いて特定の周波数のスペクトルを削除するといった手順のフィルタです。これを厳密にフィルタとは呼ばないかもしれませんが、テストとして実際に出来るのかどうかを確かめたいです。
手順としては以下の通りです。
1.音声信号をサンプリング周波数32kHzで256点取得
2.窓関数をかけ、FFTを用いて周波数毎のスペクトルに分解し、結果を256要素の配列に格納
3.周波数3kHz以下のスペクトルを全削除
今回の条件ではFFT結果の両端24要素を削除すれば良いことになります。
4.位相を使って実数、虚数成分にそれぞれ分解して逆変換、その後音を出力
結果としては音が割れます。
正直聞いていられないレベルで割れています。
明らかに該当スペクトルを一気に0にした事が問題ですが、解決策がよくわかりません。
逆変換後の波形と元の波形を比較すると、処理後の方が結構ギザギザしていました。
ただ、3本程度の周波数が離れた正弦波で同様の事をした場合はうまくいきました。
やはり生活音のような複雑な周波数分布の音声はことような処理は適切ではないのでしょうか?
回答5件
あなたの回答
tips
プレビュー