The DFT
This section gives Matlab examples illustrating the computation of two figures in Chapter 6, and the DFT matrix in Matlab.
DFT Sinusoids for
Below is the Matlab for Fig.6.2:
N=8; fs=1; n = [0:N-1]; % row t = [0:0.01:N]; % interpolated k=fliplr(n)' - N/2; fk = k*fs/N; wk = 2*pi*fk; clf; for i=1:N subplot(N,2,2*i-1); plot(t,cos(wk(i)*t)) axis([0,8,-1,1]); hold on; plot(n,cos(wk(i)*n),'*') if i==1 title('Real Part'); end; ylabel(sprintf('k=%d',k(i))); if i==N xlabel('Time (samples)'); end; subplot(N,2,2*i); plot(t,sin(wk(i)*t)) axis([0,8,-1,1]); hold on; plot(n,sin(wk(i)*n),'*') ylabel(sprintf('k=%d',k(i))); if i==1 title('Imaginary Part'); end; if i==N xlabel('Time (samples)'); end; end
DFT Bin Response
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;
DFT Matrix
The following example reinforces the discussion of the DFT matrix in §6.12. We can simply create the DFT matrix in matlab by taking the DFT of the identity matrix. Then we show that multiplying by the DFT matrix is equivalent to the calling the fft function in matlab:
>> eye(4) ans = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 >> S4 = fft(eye(4)) ans = 1 1 1 1 1 0 - 1i -1 0 + 1i 1 -1 1 -1 1 0 + 1i -1 0 - 1i >> S4' * S4 % Show that S4' = inverse DFT (times N=4) ans = 4 0 0 0 0 4 0 0 0 0 4 0 0 0 0 4 >> x = [1; 2; 3; 4] x = 1 2 3 4
>> fft(x) ans = 10 -2 + 2i -2 -2 - 2i >> S4 * x ans = 10 -2 + 2i -2 -2 - 2i
Next Section:
Spectrogram Computation
Previous Section:
Geometric Signal Theory