読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

(53) 有限インパルス応答

有限インパルス応答(FIR)フィルタの場合、バンドパスフィルタは、周波数と共鳴幅を決めるとほぼ決ります。伝達函数は以下のような感じです。

特定の周波数に関して、この伝達函数での周波数応答をプロットしてみましょう。

/* 8.3.13m */
sinc(x) := (
  local(prim),
  prim(y) := sin(y)/y,
  if float(x) = 0.0 then limit(prim(y), y, x) else prim(x))$
b : makelist(cos(m*%pi/6.0)*sinc(0.1*m), m, -40, 40)$
q : length(b)$
b0 : 0$
A(w) := b0 + sum(b[k]*%e^(-%i*w*k), k, 1, q)$
plot2d(cabs(A(w)), [w, 0, %pi], [y, 0, 20])$


このバンドパスフィルタの周波数の信号にノイズが乗った場合に、フィルタの効果を確かめましょう。

/* 8.3.15m */
b : makelist(cos(m*%pi/6.0)*sinc(0.1*m), m, -40, 40)$
q : length(b)$
x : makelist(sin(2*%pi*j/12.0) + random(5.0), j, 1, 256)$
n : length(x)$
y : makelist(0.0, j, 1, n)$
for j : q + 1 thru n do for k : 1 thru q do y[j] : y[j] + b[k]*x[j-k]$
plot2d([discrete, makelist(i, i, 1, n), x])$
plot2d([discrete, makelist(i, i, 1, n), y])$