基本的なエコー処理はこのようなアルゴリズムで示されますが、これはデジタル信号処理のフローそのものなので簡単に実装できそうです
![イメージ 2](https://cdn-ak.f.st-hatena.com/images/fotolife/O/O3I/20190804/20190804130330.jpg)
まず処理の中心的役割であるディレイ部分を作ってみます。
たとえばサンプリング周波数がfsのとき、データバッファがfs個あれば1秒分のデータを保持できそれをサンプリング間隔ごとにシフトしていけば1秒のディレイをつくれます。
FIRデジタルフィルタでは時間遅れ要素Z^-1をデータ転送命令DMOVで実現していましたがこれではバッファを全て舐めるのにサンプリング間隔内では処理しきれません。
そこで外部のデータメモリにリングバッファを用意し、そこへの書込みポインタ、読出しポインタを制御することで仮想的なシフトレジスタを構成します。
データメモリは32kWORDありますが他の変数でもつかうのできり良く16kWORD。
サンプリング周波数が25kHzなので約0.65秒のディレイを作り出せます
![イメージ 1](https://cdn-ak.f.st-hatena.com/images/fotolife/O/O3I/20190804/20190804130326.jpg)
書込みポインタを追いかけるように読出しポインタをインクリメントし
0x3FFFでマスクすることで0x4000の剰余系である0x0000~0x3FFFのリングバッファとなります。リングバッファに最初の1周分データが書き込まれるまでは、ゴミデータを読み出して異常音が出ないようにバッファをクリアしておき、割込み待ちの永久ループに入ります