ディレイ(エコー)の信号処理は、遅延させた波形にゲインを掛けてミックスすることで簡単に実現できます。 繰り返しのためのフィードバックとエコーのようにディレイ音が高域減衰するようにハイダンプとして1次のフィルタをフィードバックに持たせます。
τ | ディレイ時間 ( サンプル数 = ディレイ時間/サンプリング時間 ) |
---|---|
FB | フィードバック ±ゲイン |
HF | ハイダンプ ( LPFの係数ゲイン ) |
D | ダイレクト音 |
E | エフェクト音 |
ディレイの信号処理原理は、入力信号をメモリにディレイタイム分記録した後、出力する処理を繰り返すことで実現します。 ディレイ時間が最大数百ミリ秒から数秒にも達するため、DSPなどで実装する場合にはディレイ部を外部メモリのリング・バッファに取ります。
音響処理に利用されるDSPは、信号用のメモリと係数メモリを内蔵しているケースが多いですが、 ディレイに利用するメモリはサンプル数が多いため、外部メモリの補助が必要になるケースがほとんどです。
毎サンプルごとに書き込み、読み出しインデックスが進むアルゴリズムはディレイに限らず、デジタルフィルタなどでも多用されるため、インデックス更新を自動的に処理されるようなアドレッシングが容易になるように設計されています。 そのため、DSPの場合にはディレイタイムの演算に関しては時間からサンプル数を算出する単純な計算のみです。CPUで実現する場合には、リングバッファの進行もソフトウェア処理することで実現します。
フィードバック・ゲインは、正負の両極性を取ることができます。 負の極性の場合には、ディレイメモリを通過する度に極性が反転することになります。
フィードバックの係数が±1.0の値を最大とした場合、絶対値が1.0未満でないとディレイ信号が永続し、発振/発散してオーバーフローを引き起こし、激しいノイズを出すので注意が必要です。
通常、フィードバック係数は、±0.9などのように1.0未満となるように操作設定上制限されています。 ディレイメモリには、フィードバックと入力の加算結果が書き込まれます。
この加算時には、単純に2つの信号を加算するため、最大振幅を超える可能性があります。 音響信号の信号処理では、最大振幅を超えた信号に対して飽和演算(saturate)を行います。DSPの乗加算命令やPCのSIMD(MMX)命令などは、計算結果に飽和演算とラップアラウンド演算が選択できるようになっている場合がありますが、飽和演算を選択します(飽和演算命令を使う)。
ディレイのフィードバック加算部でサチュレーション(saturation)させると、記録されるディレイ音はクリッピングされた結果が繰り返し再生されるため、一次的なミキサーのサチュレーションに比較して品質に対する影響が大きくなります。
フィードバックの乗算結果はゲインによって小さくなる演算になりますから、ゲイン計算から加算までは十分な精度の演算語長を持たないとフィードバック部で音質劣化が発生します。
ディレイメモリは、通常、整数の信号を記録していますので記録する整数語長に丸める必要があります。 ゲインによって信号が小さくなり有効な語長が少なくなって行くため、精度を確保したい所ですが、演算結果は切り捨て方向に丸める必要があります。
切り上げを含む四捨五入のような丸めを行うとゲインによっては整数丸めのために、フィードバックが収束していった最後の1ビットが残り続けて、無音にならなくなります。
フィードバックゲインやディレイタイムなどを動作中に動的に変更する場合には、変化点の信号がディレイメモリに入力されて繰り返されるため、ディレイ出力を停止するなどの処理が行われる場合があります。
フォードバック付きのディレイの場合、全般にディレイの入力信号にノイズを載せるとディレイ時間とフィードバックによって、長時間ノイズがリピートされるため、注意を要する部分です。
ディレイ音を停止、再動作するには、一旦、エフェクト音を高速且つ滑らかにミュートし、ディレイメモリを無音状態にクリアした後、エフェクト音のミュートを解除して再開する必要があります。
無音状態を発生させないで動作するようにするためには、この切替のために複数系統のシグナルブロックが必要になったり、基本ブロック以外のミキサーやボリューム制御が必要となるため、ディレイでは、多くの場合、無音になる仕様とされています。
ディレイ時間を変更する場合も、変更によるノイズが発生するため、同様にミュート処理される場合があります(ダイレクトに変更している場合もあります)。
さらに、ディレイメモリのクリアを入力信号を絞ることで実現しようとすると、仕様上のディレイ時間の最長時間分の時間が必要となるため、ディレイメモリのクリアのためのコード(高速なゼロクリア)が実装されます。 ディレイメモリが必要量の2倍以上取れる場合には、2バンクの切替にすることで高速化することも考えられます。
これらの処理の必要から、実際には、上の図のような基本的なシグナルブロック以外に入力部にボリュームを設けたり、出力段のミキサーの係数を積分器で補間するようにしたりと、もう少し処理が必要となります。
ディレイメモリのクリアや補間の問題は、リバーブなど遅延処理系全般に共通したものです。
出力部のミキサーは、ミュートを兼ねて利用することもあり、補間器付きのボリュームにしておく必要があります。
通常、シグナルフローのゲインは、係数と信号の乗算を表し、係数を変化させると次のサンプリングデータから即時新しい係数で演算されます。
しかし、音声信号のボリュームを1サンプル時間で大きく変更するとクリックノイズが発生しますので、動的に変更するボリュームは、現在のボリュームから次のボリュームへと係数自体を補間するような信号処理を行います。
ミュートスイッチも、係数の乗算で実現されますが、ミュートも1サンプルで動作させるとノイズになるため、ボリュームとミュートは補間器付きのボリュームを共用してノイズの出ないものにする必要があります。
通常、ボリュームとミュートは、柔らかなスイッチ音になる30〜50ms程度の次定数を持たせた積分器を補間に利用します。 積分器の補間カーブは理想的というわけでもなく、他の補間方法でもかまわないのですが、リアルタイムに処理する部分であり、演算量を少なくするのに適しているためです。
ミュートのON/OFFとボリューム値は、制御コードで論理合成したものを使います。
エフェクト値のボリュームは、ディレイの場合にはエフェクトレベル(Wetレベル)が適していますが、コーラスで使われる場合には、ドライ・エフェクトバランスにする方が適しています。
レベルの場合には、dB(デシベル)値で、バランス型の場合には、比率で設定されます。 バランスの場合には、バランスを変更しても音量感が一定になるよう、パワーミックスになるようボリュームを設定します。
ステレオ化は、左右同様の処理を行い、クロスディレイやクロスフィードバックは、左右のディレイメモリの読み出し先(アドレス)を入替えるだけで実現できます。
マルチタップディレイは、ディレイ計算による読み出しと出力レベルの加算の集合になるだけで、簡単な応用範囲で実現できます。
何れの場合でも、ゼロクリアなどの事情は同様です。