「Audacityでノイズ除去」では AudacityのNoise Reductionを紹介しましたが、はたしてどんなアルゴリズムなのでしょうか。気になったので少し検証してみます。
Audacityのソースコード
https://www.audacityteam.org/download/source/
Noise Reductionのソースを見ると、少なくともFFTは使われているみたいです。
audacity-minsrc-2.4.2/src/effects/NoiseReduction.cppのヘッダのコメント
The first pass is done over just noise. For each windowed sample of the sound, we take a FFT and then statistics are tabulated for each frequency band.
特定の周波数をノイズとして消してみる
周波数領域で帯域ごとにノイズを分析しているのならば、例えば1kHzの正弦波をノイズとしてプロファイルを取得した場合、1kHzと2kHzの正弦波を合成した信号では、ノイズ除去を行うと1kHzだけが消えて2kHzが残るのでしょうか?
1kHzの正弦波を生成
【ジェネレーター】➡【トーン】
まずノイズ音源として、Audacityで1kHzの正弦波を生成します。カーソルを波形の上に置き、Ctrl+スクロールで波形が拡大されます。
2kHzの正弦波を生成(トラックの追加)
【トラック】➡【新しく追加】➡【モノラルトラック】
次にトラックを追加して【トラック】➞【新しく追加】➞【モノラルトラック】、同様に2kHzの正弦波を生成します【ジェネレーター】➞【トーン】。
1kHzと2kHzの波形を合成
【トラック】➡【Mix】➡【新しいトラックにミックスして作成】
2つのトラックを選択して(Ctrl+A)、上記の手順で1kHzと2kHzの正弦波を合成します。
周波数特性
【解析】➡【スペクトラム表示】(Audacityで周波数分析)
1kHzと2kHzの正弦波を合成したトラックを選択して、スペクトラム表示をすると1kHzと2kHzの周波数特性が分かります。
1kHzの正弦波でノイズプロファイルを取得
1kHzの正弦波のトラックを選択 ➡【エフェクト】➡【ノイズの除去】➡ステップ1【ノイズプロファイルの取得】
1kHzの正弦波をノイズとして、ステップ1【ノイズプロファイルの取得】を行います。 Audacityのノイズ除去はこちら(Audacityでノイズ除去)
ノイズの除去:デフォルトパラメータ(ノイズ除去=12dB, 感度=6, 周波数平滑化=3)
波形を選択 ➡【エフェクト】➡【ノイズの除去】➡ ステップ2【OK】
1kHzと2kHzの正弦波を合成したトラックを選択して、ステップ2のノイズの除去を行います。まだ1kHzの影響が残ってはいますが、周期的には2kHzに近くなってます。
周波数特性を見る
【解析】➡【スペクトラム表示】
トラックの波形を選択してスペクトラム表示をすると、1kHzが約12dB減衰しているのが分かります。
ノイズの除去:パラメータを大きく(ノイズ除去=24dB, 感度=6, 周波数平滑化=3)
波形を選択 ➡【エフェクト】➡【ノイズの除去】➡ ステップ2【OK】
もう少しノイズ除去パラメータを大きくして24dBにすると、デフォルトパラメータの12dBに比べ原音に近い波形になります。
周波数特性を見る
【解析】➡【スペクトラム表示】
トラックの波形を選択してスペクトラム表示を見ると、1kHzが約24dB減衰しているのが分かります。