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;
);