CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

デジタルディレイ(3)

信号処理のフロー中で信号レベルの調整ができるようにゲイン可変のモジュールを準備しました。
ソース中でうっかり実数型変数をつかうと浮動小数点処理に展開されコード効率がめちゃくちゃに悪くなるので固定小数点演算です
 
イメージ 1
 
中身は単なる16ビット×16ビット=32ビットの掛け算なのですが、入力データをQ15フォーマット、ゲイン調整値を-128~+127(Q7フォーマット)と仮定し結果Q22を7ビット右シフトしてQ15フォーマットに戻しています。
つまり+127をセットすると+1倍、+64で0.5倍、-128をセットすると-1倍となります
 これをつかってエコー処理を記述してみました。
またバッファへのアクセス、ポインタ操作も関数で括り出してメイン処理ループから隠蔽しています処理はフローそのままで
 
 1.A/Dコンバータから現在のデータを読み込み。(DIR)
 2.ディレイモジュールの終端から遅延データを読み込み。(EFC)
 3.そのデータに係数を掛けて減衰させる。ここでは100/127=約80% (FBK)
 4.直接音DIRとフィードバック音(FBK)を加算してディレイモジュールに入力
 5.直接音DIRとエフェクト音EFCを加算して出力データを作成 (OUT)
 6.出力音OUTをD/Aコンバータに書込み。
 
となります。
 
イメージ 2
 
実行結果ですが、入力波形にはサイン波1kHzの1波だけのバーストをくわえ(ch2)
出力には入力と同時に直接音、その後4msおきにディレイループをフィードバックされてきた波形が見えます(ch1)
 
 
イメージ 3
これを音で聞くと、「アッ」という入力に対して「アッアッアッアッアッアッアッ・・・・・」となるわけです。デジタル演算でフィードバックを回しているのでエコー成分は減衰以外まったく劣化しません。現実の反射音は壁の材質によって特性が変化するのでフィードバックループにハイダンプなどのフィルタを挿入することになります。
ところでフィードバック量調整用のゲインセルは負の値も設定できるので-100(-80%)とすると・・・
 
 
イメージ 4
1回ループするごとに位相が反転しているのがわかります。
この位相の変化、しかもモノラルでは耳では判別はできないとは思いますけど。
 フィードバックゲインを+127(100%)にすると全く減衰が起こらず発振状態になってしまいますが、ぎりぎりの+125(98%)で実行した例です
  
イメージ 5
 
延々と反射音が続き、もしディレイ時間を通常の数100msとして入力ソースが楽曲だったりすると音の洪水状態になって何が何だかわからなくなります