Below is the Matlab for Fig.6.3:
% Parameters (sampling rate = 1) N = 16; % DFT length k = N/4; % bin where DFT filter is centered wk = 2*pi*k/N; % normalized radian center-frequency wStep = 2*pi/N; w = [0:wStep:2*pi - wStep]; % DFT frequency grid interp = 10; N2 = interp*N; % Denser grid showing "arbitrary" frequencies w2Step = 2*pi/N2; w2 = [0:w2Step:2*pi - w2Step]; % Extra dense frequency grid X = (1 - exp(j*(w2-wk)*N)) ./ (1 - exp(j*(w2-wk))); X(1+k*interp) = N; % Fix divide-by-zero point (overwrite NaN) % Plot spectral magnitude clf; magX = abs(X); magXd = magX(1:interp:N2); % DFT frequencies only subplot(2,1,1); plot(w2,magX,'-'); hold on; grid; plot(w,magXd,'*'); % Show DFT sample points title('DFT Amplitude Response at k=N/4'); xlabel('Normalized Radian Frequency (radians per sample)'); ylabel('Magnitude (Linear)'); text(-1,20,'a)'); % Same thing on a dB scale magXdb = 20*log10(magX); % Spectral magnitude in dB % Since the zeros go to minus infinity, clip at -60 dB: magXdb = max(magXdb,-60*ones(1,N2)); magXddb = magXdb(1:interp:N2); % DFT frequencies only subplot(2,1,2); hold off; plot(w2,magXdb,'-'); hold on; plot(w,magXddb,'*'); xlabel('Normalized Radian Frequency (radians per sample)'); ylabel('Magnitude (dB)'); grid; text(-1,40,'b)'); print -deps '../eps/dftfilter.eps'; hold off;