Skip to content

広帯域ノイズとハムのリペア ​

広帯域ノイズと電源ハムは別の欠陥です。デノイズは時間変化するスペクトルを推定してゲインマスクを適用します。デハムは基音と倍音を追跡します。実際に聴こえる欠陥に対応する検出器を使い、持続する音楽的な音がノイズと誤認されていないか確認してください。

このページの用語

  • STFT(短時間フーリエ変換):信号を nFft サンプルずつ、hopLength ごとに重なり合うフレームに切り、それぞれを周波数ビンのスペクトルにしたもの。スペクトログラムと STFT を参照してください。
  • ゲインマスク:ビンとフレームごとに、下限と 1 のあいだのゲインをひとつずつ持つもの。デノイザーはスペクトルにこれを掛けてから音声に戻します。
  • ノイズ推定器:各ビンのノイズの大きさを求める方法。quantile は最も静かな 10% のフレームを平均して固定のスペクトルをひとつ作り、mcra・imcra・spp はフレームごとにノイズを追跡して、変化するノイズフロアにも追従します。MCRA と IMCRA(minima-controlled recursive averaging、最小値制御の再帰平均)はスペクトルの最小値をたどってノイズフロアを追い、SPP は音声が存在する確率で更新の重みを決めます。
  • MMSE-STSA/LogMMSE:ビンごとに推定した信号対雑音比からゲインを決める規則。スペクトル減算は、ゲインの代わりにノイズのパワーを差し引きます。決定指向型の平滑化(ddAlpha。各フレームのゲインを前のフレームの推定と混ぜます)が、ゲインのちらつきによる「ミュージカルノイズ」(マスクをたまたま通り抜けた孤立したビンが、かすかな音のようにちらちら鳴る現象)を抑えます。
  • 基音と倍音:電源ハムは 50 Hz または 60 Hz の音と、その整数倍の音でできています。subtract モードは追跡した正弦波でそれぞれを打ち消し、notch モードは狭いノッチでそれぞれを取り除きます。Q は中心周波数を帯域幅で割った値で、50 Hz で Q 20 なら幅 2.5 Hz のノッチです。PLL(位相同期ループ)は、ずれていく電源周波数を追いかける追跡器です。

段を選ぶ ​

欠陥検出リペア主なリスク
定常的なヒス、マイクのノイズフロア、テープノイズmasteringRepairDetectNoiseFloormasteringRepairDenoiseClassical静かな音楽も推定ノイズフロアと一緒に下がることがある。
50/60 Hz の音と倍音masteringRepairDetectHummasteringRepairDehum同じ周波数にある意図した音楽成分もノッチで削ることがある。

ハム検出器が報告するのは定常的な線だけで、繰り返すキックは fundamentalProminence が 1.0 になります(線形の比で、1.0 はピークなしを意味し、ロックの旗ではありません)。どちらの段もラウドネスプロセッサではありません。完成したミックスから音源を分離する処理でも、クリック、クリップ、部屋の残響を直す処理でもありません。

先に検出してから適用する ​

リクエストオブジェクト形式にすると、サンプルレートとオプションが明示されます。decodedMonoPcm は Float32Array とします。nFft より短いバッファは解析のためにパディングされ、元の長さで返ります。

ts
import {
  init,
  masteringRepairDenoiseClassical,
  masteringRepairDehum,
  masteringRepairDetectHum,
  masteringRepairDetectNoiseFloor,
} from '@libraz/libsonare';

await init();

const sampleRate = 48_000;
const samples = decodedMonoPcm;
const noise = masteringRepairDetectNoiseFloor({
  samples,
  sampleRate,
  nFft: 1024,
});
const hum = masteringRepairDetectHum({ samples, sampleRate });

console.log(noise.floorDbfs, noise.bandFloorDbfs);
console.log(hum.fundamentalHz, hum.harmonics, hum.harmonicDbfs);

// レポートと試聴で根拠を確認した段だけを残す。
const dehummed = masteringRepairDehum({
  samples,
  sampleRate,
  adaptive: true,
});
const cleaned = masteringRepairDenoiseClassical({
  samples: dehummed,
  sampleRate,
  reductionDb: 26,
});

この例は固定されたリペア順、つまりデハムをデノイズより先に置く順序に従っています。アプリケーションでは、値が正だったというだけで全量を除去せず、レポートと試聴で判断して各呼び出しを条件分岐してください。

デノイズ設定 ​

masteringRepairDenoiseClassical は STFT 領域で動く古典的デノイザーです。オプションは公開 TypeScript の DenoiseClassicalOptions です。オーバーロードの全体は API リファレンスを参照してください。

オプション値または既定値用途
mode既定は logMmse、ほかに mmseStsa、spectralSubtractionゲイン関数を選ぶ。スペクトルサブトラクションでは overSubtraction と spectralFloor も読む。
noiseEstimator既定は quantile、ほかに mcra、imcra、sppノイズスペクトルの追跡方法を選ぶ。チェーンの上書きも同じ名前を受け付ける(repair.denoise.noiseEstimator、repair.denoise.mode、repair.dehum.mode)。ストリーミングのマスタリングチェーンは既定が spp で、quantile は名前を示して拒否する。機能カタログが記述するのはこのリアルタイムインサートなので、既定値は spp と書かれ、quantile は含まれない。
nFft / hopLength既定は 1024 / 256STFT の窓長とホップ幅を設定する。制約は下記を参照。
reductionDb既定は 26、有限で [0, 120]ゲインマスクの各ビンに許す最大減衰を設定する。ラウドネス目標ではなく残留ノイズの下限。
noiseEstimationQuantile既定は 0.1ノイズスペクトルの推定に使う、静かなフレームの割合。
ddAlpha、speechPresenceGain、gainSmoothingAPI 型を参照decision-directed 平滑化と MMSE ゲイン経路を制御する。

reductionDb: 26 のとき、マスクのゲイン下限は約 0.0501、つまりビンごとの最大減衰量 26 dB です。広帯域ノイズ自体が 26 dB 下がることを保証する値ではありません。大きな値ならより深く減衰できますが、推定の信頼性が上がるわけではありません。レポートの maxReductionDb と floorLimitedFraction で、この上限が結果を決めたかを確認できます。下の図は、1 フレームでこの下限がどう効くかを示したものです。

ゲインマスクを通した 1 フレーム
1001k10k2005002k5k20k1 フレーム(dBFS)−80−60−40−20ゲインマスク(dB)−30−20−100下限 = −reductionDb (−26 dB) ノイズより十分大きい音:ゲイン ≈ 0 dBノイズだけ:下限で止まる周波数(Hz)
  • ノイズを含むフレーム
  • 推定ノイズ
  • ビンごとのゲイン
傾斜したノイズフロアの上に倍音を持つ音がある信号を、48 kHz・1024 点の 1 フレームで見たものです。上:フレームと推定ノイズです。下:既定の logMmse 規則が各ビンに与えるゲインです。倍音がノイズより十分大きいところでは、ゲインは 0 dB 付近に留まります。倍音の間や倍音より上のノイズだけのビンでは、ゲインは −reductionDb(ここでは −26 dB)まで下がり、そこで止まります。このフレームでたまたまノイズが大きく出たビンは、少し多めに残ります。

nFft と hopLength は、すべてのリペア段に共通の STFT の規則に従います。StreamingDenoise(StreamingMasteringChain のライブ経路を含む)にも同じ規則が適用されます。ストリーミングではさらに、再帰的な推定器(mcra、imcra、spp)が必要です。

デハム設定 ​

masteringRepairDehum は基音とその倍音を除去します。すべてのオプションに上限があり、超えると InvalidParameter を投げます。

オプション既定値受け付ける範囲用途
fundamentalHz50(0, 5000]除去する電源周波数。電源が 60 Hz の地域では 60 にする。
harmonics4[1, 16]基音を含む倍音の数。
modesubtractsubtract、notch追跡した正弦波を打ち消すか、ノッチで除去するか。
q20(0, 100]各キャンセラーまたはノッチの選択度(中心周波数 ÷ 帯域幅。大きいほど狭い)。
adaptivefalse真偽値fundamentalHz を信用せず、実際の基音を探索する。
searchRangeHz2[0, 100]fundamentalHz を中心とする適応探索の片側幅。
adaptation、pllBandwidth0.25、0.01[0, 1]適応追跡の速さ。pllBandwidth は基音を追う位相同期ループの帯域幅。
frameSize2048[16, 16384]適応トラッカーの解析フレーム。

ハム検出と適応探索は fundamentalHz ± searchRangeHz の窓を読みます。窓全体が [1 Hz, 0.49 × サンプルレート] の外にある場合は、範囲内に丸められずに拒否されます。リンク形式とストリーミング形式も同じです。

subtract モードでは、各倍音キャンセラーを 0 から始めず、冒頭の窓で全倍音の参照信号を使った 1 回の最小二乗フィットから始めます。そのため短いクリップでも最初のサンプルから減衰します。窓が短くて倍音を区別できない場合は、キャンセラーを初期化しません。22.05 kHz で 440 Hz のトーンに 50 Hz と 100 Hz のハムが重なった 0.25 秒のクリップでは、先頭 1000 サンプルの RMS が 0.1675 から 0.0355 に下がり、トーンだけが残りました。

A/B PROCESS · DEHUMIDLE
デハム修復 — 電源ハムの修復前と修復後

きれいなコードに、50 Hz のハムと 3 つの倍音を加えています。スペクトルは 0〜1 kHz に拡大しているため、4 本の線が見えます。修復前後の音を比較し、ハムの除去方法を切り替えてください。HUM は 40〜250 Hz の平均レベルの変化です。4 成分すべてをキャンセルまたはノッチした場合は約 11 dB 下がり、基本波だけをキャンセルした場合は約 2 dB しか下がらず、100・150・200 Hz の倍音が残ります。音量合わせは行っていません。

比較
除去方法

チャンネルの扱い ​

1 チャンネルにはモノラル形式、左右のペアにはステレオ形式、複数チャンネルに 1 つのマスクを使う場合はリンク形式を使います。

ts
import {
  masteringRepairDenoiseClassicalLinked,
  masteringRepairDenoiseClassicalStereo,
} from '@libraz/libsonare';

const stereo = masteringRepairDenoiseClassicalStereo({
  left,
  right,
  sampleRate,
  reductionDb: 26,
});

const linked = masteringRepairDenoiseClassicalLinked({
  channels: [frontLeft, frontRight, center],
  sampleRate,
  reductionDb: 26,
});

ステレオ形式とリンク形式はチャンネルの合算パワーからマスクを作り、すべてのチャンネルへ同じマスクを適用します。そのためチャンネル間のレベル差と位相差は動きません。レポートはペアまたは集合について 1 つです。floorDbfs は絶対レベルで、同じチャンネルを 2 本入れるとモノラルより約 3.01 dB、3 本なら約 4.77 dB 高くなります。同じチャンネル数で測った値どうしだけを比較してください。すべての入力チャンネルは同じ長さでなければならず、nFft より短い入力は解析のためにパディングされます。

masteringRepairDehumStereo はチャンネルごとに独立したフィルターまたはキャンセラー状態を持ちますが、adaptive: true では 2 チャンネルで 1 つの基音を追跡します。ハムが強いチャンネルを追跡の参照に選び、元の左右チャンネルの投影エネルギーを合算して周波数を探索し、追跡した 1 つの基音を両方の経路へ渡します。そのため片側だけのハムや逆位相のハムも追跡器に見え、各チャンネルの振幅と位相はそれぞれの状態で処理されます。既定の adaptive: false では、各チャンネルが設定した周波数を独立に処理します。

結果を読む ​

masteringRepairDetectNoiseFloor はゲインマスクを適用する前の floorDbfs と 32 帯域の bandFloorDbfs を返します。減衰量は返しません。masteringRepairNoiseBandBins({ nFft, sampleRate }) はこの 32 帯域の 33 個のビン境界を返し、帯域 k は bins[k] から bins[k + 1] までです。境界が一致する帯域は空で、その値は測定値ではなく、帯域が空であることを示す固定値です。

モノラルのデノイズ呼び出しはサンプルだけを返します。減衰量が必要なときは、masteringRepairDenoiseClassicalStereo、masteringRepairDenoiseClassicalLinked(1 チャンネルのリンク呼び出しも可)、または masteringRepairApply を使ってください。そのレポートには次があります。

  • meanReductionDb はマスクの平均減衰量です。
  • maxReductionDb は実際に適用した最大減衰量です。
  • floorLimitedFraction は reductionDb に到達したマスクセルの割合です。

これらはプロセッサが行ったことを表します。LUFS の整合ではなく、残ったノイズが聴こえないことの証明でもありません。納品目標に必要なら、積分ラウドネスを別に測定してください。

デノイズ A/B を聴く ​

A/B PROCESS · DENOISEIDLE
デノイズ修復 — 修復前と修復後

きれいなコードに広帯域のヒスノイズを加えています。修復前後の音とスペクトルを比較し、デノイズの方式を切り替えてください。追加の音量合わせは行っていません。ノイズ低減は、音楽の立ち上がりや音色にも影響することがあります。FLOOR は高域の平均低減量(dB)です。

比較
アルゴリズム

この A/B は古典的デノイザーを使い、ラウドネス整合を行わないため、ノイズと音色の変化をそのまま確認できます。

限界 ​

デノイザーはバッファ自身からノイズを推定します。較正音、ドローン、長く伸ばした音はノイズと見なされ、ノイズフロアと一緒に減衰することがあります。古典的デノイズは学習済みモデルでもありません。音声強調用のニューラルネットワークは、とくに時間とともに変わるノイズを声から一般によりきれいに取り除きます。一方、このデノイザーは決定論的で、モデルの重みを必要としません。詳しくは 信号処理と学習済みモデルの違い を参照してください。検出器と古典的なヘルパー呼び出しはオフラインです。StreamingDenoise と StreamingMasteringChain では mcra、imcra、spp によるデノイズをブロック処理できますが、全信号を必要とする quantile は拒否されます。共通の順序は オーディオリペアの流れ、正確なレポート型は JavaScript マスタリング API を参照してください。