フィルタ作成入門-①移動平均フィルタ

唐突にメモりたくなったので。

概要

シンセサイザー制作におけるフィルタ作成について実装を残すもの

経緯

フィルタ作成にかかる資料ってのは電気回路とかそういうところから読み解く必要があり、
ソースコードに落とし込んだ資料みたいなのは割と少ない。

自分が必要な言語の資料になるとまったくもって少ない。
(ここらへん自分がシンセサイザーの記事をQiitaに書いたときとそれほど状況は変わってないな)

よって、自分が使う言語のシンセを作る羽目になった管理者が実装をメモるもの。
で、Unity+C#を使っているため、C#で書いてます。
ただ、C++とかに移行するのも難しくないかと。
(あるものは参考文献とかも書いておきます)

移動平均フィルタ

経過前後を加算し、最後にサンプル数で割るというシンプルな構成。
特性として、高周波域で階段上にフィルタ処理が発生する。

public class SimpleMovingAverage{
  double[] past_buffer;
  int cnt=5;
  public int sampling_rate;
  public SimpleMovingAverage(int s_rate){
    sampling_rate=s_rate; 
    past_buffer = new double[cnt-1];
  }
  public double Calc(double buffer){
    double total=0.0f;
    for(int i=0;i<cnt-1;i++){
      total+=past_buffer[i];
    }

    //今入ってきた音を足す
    total+=buffer;
    //平均値を求める
    total/=(float)cnt;

    //バッファをセットし直し。
    for(int i=cnt-2;i>0;i--){
      past_buffer[i]=past_buffer[i-1];
    }

    past_buffer[0]=buffer;
    return total;
  }
}

参考資料

gen~とgen for eventで触れる物理モデリングシンセ – YouTube

ディジタル信号処理の例(移動平均) – DSP入門(ディジタル信号処理入門) (heg.co.jp)

数式をほとんど使わずに理解するディジタルフィルタ | Cerevo TechBlog