移動平均フィルタの周波数特性を視覚化してみた - REAPERのJSFXでエフェクトを作る(6)

公開:2016-08-10 21:02
更新:2020-02-15 04:37
カテゴリ:reaper,jsfx

JSFXのgfx機能を使って、移動平均フィルタの周波数特性を視覚化してみた。

移動平均のサンプル数を増やすと、カットオフ周波数が下がり、そしてフィルタ特性がより急峻となるのがよくわかる。

しかしJSFXは結構簡単に書けるな。よくできてるわ。。 REAPERは単なるDAWでないことがよくわかってきた。これは自由度が高い。なんてったって自分でエフェクトやグラフィックが書けるんだから。ゲームアプリとかも書けるんではないだろうか。。

次は振幅はdb、周波数は対数目盛で書いてみようか。やり方はよくわからんけど。。

ソースコード

desc:SF:Moving Average

slider1:50<0,100,1>Wet (%)
slider2:50<0,100,1>Dry (%)
slider3:10<1,100,1>Length 

@init

length = 10;
bufferL = 0;
bufferR = length;
idx = 0;

@slider

  wet = slider1 / 100;
  dry = slider2 / 100;
  length = slider3 - 1;
  bufferL = 0;
  bufferR = length;
  idx = 0; 


@block

@sample

  l = spl0;
  r = spl1;

  i = 0;

  resultL = l;
  resultR = r;

  loop(length,
    resultL += bufferL[i];
    resultR += bufferR[i];
    i+=1;
  );

  resultL /= (length + 1);
  resultR /= (length + 1);


  spl0 = resultL;
  spl1 = resultR;

  bufferL[idx] = l;
  bufferR[idx] = r;
  idx+=1;
  idx >= length? idx = 0;
  // Frequency 


@gfx 

gfx_r = gfx_g = gfx_b = 1.0;
gfx_x = 0;gfx_y =0;
w = gfx_w;
h = gfx_h;
delta = srate / (gfx_w);
s = srate;
x = 0;
i1 = 0;
y = 0;
loop(w,
t = 2 * i1 * $pi * (length + 1) / s;
y = t==0?0:sqrt(2*(1 - cos(t))) / (t);
gfx_lineto(x,h - y*200,1);
// gfx_lineto(x,y*200,1.0);
x += 1;
i1 += delta;
);