音声信号処理の勉強ノート - 1. 基礎編
はじめに
リアルタイム音声エフェクトを作るために、音声信号処理の勉強を始めました。
全体像をよく掴むように、この過程で学んだことの中で個人的に重要だと思う部分や面白い部分をまとめていきます。
内容が長くなりすぎないよう、各概念については簡単に触れるだけで、詳細には踏み込まないことにしています。興味のある方は、詳しい資料をぜひ探してみてください。また、この記事ではあくまでも一般的な知識を中心にまとめていますが、続きのメモは別記事にする予定です。
*日本語はまだ勉強中のため、文中に不自然な表現や曖昧な部分が含まれているかもしれません。温かい目で見守っていただけると幸いです。
音声信号処理で扱うもの
デジタル信号処理(DSP)では、アナログ信号をデジタル信号に変換し、その信号にいろんなエフェクトをかけることができます。例えば、音質を調整したり、ノイズを減らしたり、エコーやリバーブを加えたりするのがDSPの役目です。まずは、信号がどんな特性を持っているかを知っておくと、エフェクトのかけ方や注意すべき点が理解しやすくなります。
PCMとは
PCM(Pulse Code Modulation、パルス符号変調)は、アナログ音声信号をデジタル信号に変換する最も基本的な方法です。PCMでは、連続したアナログ信号を一定の間隔でサンプリングし、そのサンプルごとの振幅(音の大きさ)を数値として記録します。この一連の数値が、デジタルオーディオデータとなります。
サンプリングレート(Sample Rate)
サンプリングレートは、アナログ音声信号をデジタル化する際に、1秒間にどれだけのサンプルを取るかを示す数値です。サンプリングレートが高いほど、アナログ信号を細かく記録できるため、よりオリジナルに近いデジタル音声が得られます。しかし、サンプリングレートが高くなると、データ量が増えるため、ファイルサイズが大きくなり、処理にも時間がかかるというデメリットがあります。
なぜ44.1kHzと48kHzが一般的なのか
44.1kHzと48kHzは、音質とデータ量のバランスが取れているため、広く使用されています。44.1kHzは人間の耳が聞こえる最高周波数(約20kHz)の2倍以上で、ナイキスト定理を満たすために必要です。この定理により、サンプリングレートは再現したい最高周波数の少なくとも2倍である必要があることが分かっています。
エイリアシング(Aliasing)とは
エイリアシングは、ナイキスト定理に従っていない場合に発生します。たとえば、サンプリングレートが44.1kHzだと、元の信号に22.05kHz以上の周波数成分が含まれている場合、それらの成分が「折り返し」現象を起こして、22.05kHz未満の周波数として誤って再現されます。
エイリアシングを防ぐ方法
エイリアシングを防ぐための一般的な方法として、サンプリングの前にローパスフィルタを適用することがよく行われます。ただし、サンプリング後にエイリアシングを防ぐために、サンプリングレートを一時的に上げてから下げる方法もあります。この方法の手順は以下の通りです。
- アップサンプリング: 元の信号のサンプリングレートを上げて、データ点の数を増やします
- ローパスフィルタを適用: 高周波成分を除去するために、ローパスフィルタをかけます
- 信号処理を実行: 必要な信号処理をこの段階で行います
- 再度ローパスフィルタを適用: ダウンサンプリング前にもう一度ローパスフィルタを適用し、処理後に新たに発生する可能性のある高周波成分を取り除きます
- ダウンサンプリング: 最後にサンプリングレートを元のレートに戻します
ビット深度(Bit Depth)と量子化(Quantization)
音声信号をデジタル化する際に、アナログ信号の振幅(音の大きさ)をデジタルでどれだけ細かく表現できるかを決定するのがビット深度です。このビット深度は、信号の「量子化」プロセスと関係しています。
量子化(Quantization)とは
量子化とは、アナログ信号をサンプリングした後、その振幅をデジタル値として表現するプロセスです。アナログ信号は連続的に変化するため、無限の値を取ることができますが、デジタル信号ではその値を有限のステップに丸め込む必要があります。この丸め込みの作業が量子化です。
ビット深度が量子化に与える影響
ビット深度が高いほど、量子化の精度が上がります。例えば、16ビットのビット深度の場合、各サンプルの振幅は2の16乗(65,536)段階で表現されます。24ビットの場合、2の24乗(16,777,216)段階で表現でき、より細かい振幅の変化を捉えることができます。
量子化ノイズとビット深度
量子化ノイズは、信号をデジタル化する際に不可避的に発生するノイズです。ビット深度が低いと、量子化による丸め誤差が大きくなり、量子化ノイズが増えます。一方、ビット深度が高いと、丸め誤差が小さくなり、量子化ノイズは少なくなります。
- 16ビット音声: これは音楽CDの標準的なビット深度で、ダイナミックレンジが約96dB(デシベル)です。通常のリスニング環境では十分な音質が得られます
- 24ビット音声: プロフェッショナルな音楽制作や録音でよく使用されるビット深度です。ダイナミックレンジは約144dBで、非常に高い音質を提供します
人間が聞こえるダイナミックレンジ
人間の耳が聞き取れる音の最も静かな部分から最も大きな部分までの範囲は、通常約0dBから120dBと言われています。
- 0dBは、聞こえるか聞こえないかの境界線にある音のレベルです
- 120dBは、例えば飛行機のエンジン音やロックコンサートのような、非常に大きな音です。これ以上の音は聴覚にダメージを与える可能性があります
16ビット音声は、96dBのダイナミックレンジを持っており、多くの音楽リスニング環境では十分な品質を提供します。通常の音量(例えば、部屋で音楽を聴く程度の音量)では量子化ノイズはほとんど聞こえません。しかし、音量を極端に上げた場合、特に静かな部分やフェードアウト中にノイズが聞こえる可能性があります。
ディザリング(Dithering)とは
ディザリングは、元の信号にごく小さなランダムノイズを追加することで、量子化ノイズを平均化し、信号全体に分散させる技術です(画像の処理でもよく使われる)。例えば、音楽制作の最後に24ビット音声を16ビットに変換する場合、その過程で量子化ノイズが生じ、音質が劣化することがあります。この時、ディザリングを使用することで、この劣化を目立たなくすることができます。
音声信号処理でやること
時間領域で直接に動作するDSP
時間領域でのDSP処理は、信号のサンプルを直接操作する方法であり、FFTなどの周波数領域への変換を必要としません。以下は、時間領域での代表的なDSP処理の例です。
コンプレッション
コンプレッションは、信号の振幅を一定の範囲内に収めるための処理です。信号が設定した閾値を超えると、信号を圧縮して振幅を抑えます。これは時間領域で行われ、リアルタイムで音量の変動を抑制するのに使われます。
ノイズゲート
ノイズゲートは、信号の振幅が設定された閾値より低い場合に、信号を完全にカットする処理です。これにより、無音部分や非常に小さなノイズを除去できます。この処理も時間領域で行われ、特定の音量以下の信号を削除します。
リバーブ
リバーブは、エコーを複雑に重ね合わせたもので、音が反響しているような効果を作り出します。時間領域で複数のディレイを組み合わせて信号に加えることで、音が広い空間で反射しているように感じさせることができます。
フィルター(ローパスフィルターを例とする)
ローパスフィルターは、低周波数成分を通過させ、高周波数成分を減衰または除去するフィルターです。これにより、信号の高周波ノイズを除去し、音を滑らかにすることができます。ローパスフィルターは時間領域でも実装することができ、FFTなどの周波数領域の変換を必要としません。
極端なケースとして、信号を1サンプル遅らせて元の信号に加算する場合、ナイキスト周波数(サンプリングレートの半分の周波数)の成分が完全に除去されることがあります。これにより、特定の高周波成分がフィルタリングされます。
*フィルターデザインは、信号処理において非常に重要なテーマであり、ローパスフィルターを含むさまざまなフィルターが設計されています。重要な概念:IIRフィルター、FIRフィルター、Z変換など。
周波数領域で処理するDSP
時間領域で行われるDSP処理は多くありますが、信号を周波数領域に変換してからの処理もあります。この場合、FFT(高速フーリエ変換)が用いられます。FFTを使うことで、信号を周波数成分に分解し、それに基づいて複雑な処理を行うことが可能になります。ここでは、FFTが必要となる代表的な処理の一つであるピッチシフトについて説明します。
ピッチシフト
ピッチシフトは、音声や音楽信号のピッチ(音の高さ)を変える処理です。音の高さを変えると同時に、再生速度を変えることなく元のタイミングを保つためには、FFTを用いて信号を周波数領域で処理する必要があります。
- 手順としては: 信号をフレームに分割する -> 各フレームにFFTを適用する -> 周波数成分を操作する -> 逆FFTで信号を時間領域に戻す -> オーバーラップアド
*重要な概念:STFT(短時間フーリエ変換)、フェーズボコーダー(Phase Vocoder)など
まとめと次のステップ
ここまで、音声信号処理に関する基本的な概念から始まり、時間領域と周波数領域でのDSPの代表的な処理について説明してみました。
次の記事では、リアルタイムDSPについて、実際のプログラムに関する話にも触れていきます。