To design a half-band filter, it starts from a sinc function as \[s[n]=\frac{sin(\pi*n/2)}{\pi*n/2},n=-N,-(N-1),...,N\]
We know that when N approaches infinite, freq response of this sinc function is rectangle ranging from -fs/4 to fs/4. But in real world, N is always a limited number, and when that occurs, the filter does not look great. Ripples occur in pass band and rejection in stop band is often not good enough either.
How to improve this? Windowing method comes for rescue. As introduced before, windowing method enhances the pass band (main lobe) and suppresses the stop band (side lobes). Assuming window is w[n], after adding window, the new filter becomes
\[h[n]=s[n]*w[n]\]
Since half of \(s[n]\)'s coefficients are 0's, half of \(h[n]\)'s coefficients are 0's too.
Matlab script to generate a 21-tap half-band filter with Hamming window is shown below:
N = 10; x = [-10 : 10]/2; s = sinc(x) w = hamming(2*N+1); h = s.*w.'; figure; subplot(2,1,1);stem(s);title('Sinc'); subplot(2,1,2);stem(h);title('Half-band'); [H, F] = freqz(s, 1, 'whole', 2^15); [Hf, Ff] = freqz(h, 1, 'whole', 2^15); figure; hold on; plot(F(1:end/2)/pi/2, 20*log10(abs(H(1:end/2)))); plot(Ff(1:end/2)/pi/2, 20*log10(abs(Hf(1:end/2)))); grid; ylabel('Magnitude (dB)'); xlabel('Freq (fs)'); legend('Sinc','Half-band');
Filter coefficients for Sinc and half-band filter
Freq response for Sinc and half-band filter