% Product filter examples

%p = 2

switch p

case 1,
  % Degree 2
  b = [1 2 1];  % (1 + z^-1)^2
  q = 1 / 2;
  p0 = [1 2 1] / 2;   % conv(b, q)

case 2,
  % Degree 6
  b = [1 4 6 4 1];  % (1 + z^-1)^4
  q = [-1 4 -1] / 16;
  p0 = [-1 0 9 16 9 0 -1] / 16;  % conv(b, q)

case 3,
  % Degree 10
  b = [1 6 15 20 15 6 1];   % (1 + z^-1)^6
  q = [3 -18 38 -18 3] / 256;
  p0 = [3 0 -25 0 150 256 150 0 -25 0 3] / 256;  % conv(b,q)

case 4,
  % Degree 14
  b = [1 8 28 56 70 56 28 8 1];  % (1 + z^-1)^8
  q = [-5 40 -131 208 -131 40 -5] / 2048;
  p0 = [-5 0 49 0 -245 0 1225 2048 1225 0 -245 0 49 0 -5] / 2048;  % conv(b,q)

otherwise,
  % Degree 4p-2
  [p0,b,q] = prodfilt(p);
end

zplane(p0);
title(sprintf('Zeros of the product filter with degree %d', 4*p-2))
pause
[P,W] = dtft(p0,512);
plot(W/pi, abs(P))
xlabel('Angular frequency (normalized by pi)')
ylabel('Frequency response magnitude')
title(sprintf('Frequency response of the product filter with degree %d', 4*p-2))
