Filter Designerでフィルターを設計してみる
前回はwavファイルからオーディオデータを解析したが、今回はSignal Processing Toolboxのフィルターデザイナーという便利な機能を使って、フィルターを設計&適応し、オーディオデータのノイズを減らしてみたいと思う。
ちなみにwavファイルは先日RaspberryPiでやった電子オルゴールの動画から音声だけ取り出したもの。
取り出したオーディオデータがこちら。
基本的にはあまりノイズはのってないが、冒頭に少しオルゴール以外の音が入っていたり、全体的にわずかにノイズがのってたりするので、これをなるべく低減できるようにフィルターを作ってみようと思う。
ちなみに私は音声処理については全くの素人なので、試行錯誤でやってみる。
開発環境
MATLAB online
MATLAB R2022a
Signal Processing Toolbox
フィルターデザイナーを起動してバンドパスフィルターを設計する
まず、MATLABから以下のコマンドを実行する。
filterDesigner
これで以下のようにフィルターデザイナーが起動する。
ここで前回オーディオデータをFFTで変換して表示した周波数スペクトルを振り返ってみる。電子オルゴールの音の主成分は2kHz~5kHzあたりに集中していそう。
ということで、試しに強くピークが出ている2kHz ~ 5kHzだけ残して、他の部分の周波数成分を落とすようなバンドパスフィルターを設計してみる。
今回は以下の画像のようにバンドパスフィルターを設計してみた。
- 応答タイプはバンドパスを選択
- 周波数仕様はオーディオのサンプリング周波数48kHz、2kH~5kHz成分以外を減衰させるように周波数を設定
して、その他のパラメータはデフォルトのままで「フィルター設計」をクリックすれば、以下のように振幅応答が表示される。
あとはエクスポートすればOK。ファイルからエクスポートを選ぶ。
これで変数名を書いて、エクスポートをクリックすればワークスペースに設計したフィルターが保存される。
ちなみに、ファイルから「セッションを保存する」を選べば、.fdaファイルという名前でフィルターの設定値も保存することができる。
オーディオデータにバンドパスフィルターを適応する
フィルターを適応するには以下を実行する。
y2 = filter(fir_bandpass, 1, y);
あとは前回と同様にFFTで変換して、グラフにプロットしてみる。
S2 = abs(fft(y2)); K2 = length(S2); x2_freq = [1:K2/2]/K2*Fs; y2_freq = S2(1:K2/2);
plot(x2_freq, y2_freq); xlabel('Frequency[Hz]'); ylabel('Amplitude');
以下がフィルター適応前のオーディオデータy1_freq(左のグラフ)と、適応後のオーディオデータy2_freq(右のグラフ)を比較したもの。2kHz~5kHz以外の周波数帯で、信号のレベルが落ちていることがわかる。
この状態でaudiowriteしてwavファイルを保存し、実際のオーディオデータも聞き比べてみたのだが、この程度だとあまり違いがわからず。これだと面白くないので、もう少しノイズの主成分と思われる低域の周波数成分をごっそりとそぎ落としてみることにした。
具体的には、3.5kHz以下の周波数成分を落とすようなハイパスフィルターを設計して適応してみる。
オーディオデータにハイパスフィルターを適応する
先ほどと同じ要領でハイパスフィルターを設計する。
あとはエクスポートして、先ほどバンドパスフィルターをかけたオーディオデータy2に、さらにハイパスフィルターを適応する。
y3 = filter(fir_highpass, 1 ,y2);
これでFFTで変換して周波数スペクトルを表示させ、ハイパスフィルター適応前のy2と適応後のy3を比較してみたのが以下のグラフ。3.5kHz以下の周波数ピークがごっそり落ちていることがわかる。
実際に効き比べてみると、ハイパスフィルターを通したオーディオではほぼノイズが無い。ただ、オルゴール部分の低域成分もそぎ落としてしまったようで、少し甲高い印象の音になった。
本当はオルゴール部分の成分は残しながらノイズだけ消したいところだが、ちょっとそこまでやる知識も元気も無いので今回はここまで。フィルターをポチポチGUIで設計できる手軽さは素晴らしい。ディープラニングを活用した音声認識などもできるようなので、引き続き色々と試してみたい。
参考文献
公式ドキュメントと以下の本を読みつつ色々試しています。
MATLAB/Simulink記事まとめ
MATLABとSimulinkの記事は以下にまとめてます。
「MATLABで音声処理その3:フィルターデザイナーで設計したフィルターで雑音除去してみる」に2件のコメントがあります
shu
(2023年1月2日 - 3:03 PM)最後の音声ファイルの出力について、どのようにして生成したのか教えてくれませんか…
wakky
(2023年1月2日 - 11:58 PM)以下のようにaudiowriteで出力してます。
audiowrite(‘buzzer_march_filtered.wav’,y3,Fs);
audiowriteの詳細な使い方はMathWorks社の以下のページに書いてあります↓
https://jp.mathworks.com/help/matlab/ref/audiowrite.html