Matlab code for FFT book

Intuitive Guide to Fourier Analysis and Spectral Estimation
Matlab code for selected figures and examples is given here.

If you find any issues with these programs, please email me.
Last edited 11/10/2017

Matlab files for Chapter 1 to 7 are below.
Matlab files for Chapter 8 to 9 coming soon.
Signal data required for some of these scripts will also be included.

%%

% Chapter 1

% Figure 1.8 - Summation of sines and cosine waves
 
clf
time = -2 : .0001: 2;
 %Three frequencies to add together
freq1 = 2*pi*1; 
freq2 = 2*pi*2; 
freq3 = 2*pi*3;
 
 
sine1 = sin(freq1*time);
sine2 = sin(freq2*time); 
sine3 = sin(freq3*time);
sine4 =  sine1 + sine2 + sine3; 
 
cosine1 = cos(freq1*time);
cosine2 = cos(freq2*time);
cosine3 = cos(freq3*time);
cosine4 = cosine1 + cosine2 + cosine3;
 
figure(1)
subplot(321)
plot(time, sine1)
title('Sine wave of freq = 1 Hz')
axis([ -1 1 -3 3])
grid on
 
subplot(323)
plot(time, sine2)
title('Sine wave of freq = 2 Hz')
axis([ -1 1 -2 2])
grid on
 
subplot(325)
plot(time, sine3)
title('Sine wave of freq = 3 Hz')
axis([ -1 1 -2 2])
grid on
 
subplot(322)
plot(time, cosine1)
title('Cosine wave of freq = 1 Hz')
axis([ -1 1 -2 2])
grid on
subplot(324)
plot(time, cosine2)
title('Cosine wave of freq = 2 Hz')
axis([ -1 1 -2 2])
grid on
subplot(326)
plot(time, cosine3)
title('Cosine wave of freq = 3 Hz')
axis([ -1 1 -2 2])
grid on
 
figure(2)
subplot(311)
plot(time, sine4)
title('Sum of 3 Cosine waves')
axis([ -2 2 -3 4])
grid on
subplot(312)
 
plot(time, cosine4)
title('Sum of 3 Sine waves')
axis([ -2 2 -3 4])
grid on
 
subplot(313)
 
plot(time, cosine4+sine4)
title('Sum of both sine and cosines')
axis([ -2 2 -5 5])
grid on
 
% Figure 1.10 – Sum of large number of sines and cosines together

N = 20; %number of sines or cosines to be summed
sine_sum = 0;
cosine_sum = 0;
 
for n = 1:1: N;
 
    cosine_sum = cosine_sum + cos(2*pi*n*time);
 
end
 
subplot(311)
 
plot(time, (cosine_sum))
grid on
axis([ -2 2 -N/2 N*1.5])
 
title('Sum of 20 harmonic cosine waves')
for n = 0:1: N;
 
    sine_sum = sine_sum + sin(2*pi*n*time);
 
end
 
subplot(312)
 
plot(time, sine_sum)
grid on
axis([ -2 2 -N N])
 
title('Sum of 20 harmonic sine waves')
 
subplot(313)
 
    plot(time, cosine_sum+sine_sum)
grid on
    axis([ -2 2 -20 N*1.5])
 
title('Sum of 20 harmonic cosine and sine waves')
% 
 
%% Figure - Odd and even square waves

time = 0: .01: 5;
f0 = 1*2*pi;
%Manually sum the first four sinusiods to get odd and even square waves
% Sine is an odd function so any waveform created from pure sines will also
%be odd
x1 = sin(f0 * time)+ (1/3)*sin(3*f0*time) + (1/5)*sin(5*f0*time)+ (1/7)*sin(7*f0*time);
%Cosine is a even function so any waveform created from pure cosines will
%be even
x2 = cos(f0 * time)- (1/3)*cos(3*f0*time) + (1/5)*cos(5*f0*time)- (1/7)*cos(7*f0*time);
subplot(211)
plot(time, x1)
title('Odd Square wave from Sines')
axis([ 0 5 -1 1])
subplot(212)
plot(time, x2)
title('Even Square wave from Cosines')

%%

% Figure 1.15  Gibb's phenomenon
% Gibbs
time=linspace(-2,2,2000); 
square_wave=[zeros(1,500),2*ones(1,1000),zeros(1,500)];
k=2;
N=[5,11,30,100];
for n=1:4;
an=[];
for  m=1:N(n)
    an=[an,2*k*sin(m*pi/2)/(m*pi)];
    %calculate summed sine portion of square wave 
end;
fN=k/2;
 
for m=1:N(n)
    fN=fN+an(m)*cos(m*pi*time/2);
    %calculate summed cosine portion and add to sine
end; 
title_string=int2str(N(n));
subplot(2,2,n),plot(time,square_wave,'--', 'LineWidth',.75);
hold on;
plot(time,fN,'-','LineWidth',1); 
hold off; 
axis([-2 2 -0.5 2.5]);
grid;
xlabel('Time'), ylabel('y_N(t)');title(['N= ',title_string]);
end;
% End of gibb.m

%% 
%Chapter 2
% Figure 2.1 – Complex exponential

%comexp produces the complex exponential diagram in Chapter 2.
%Try changing function parameters to see the effect on the signal.
clf
time = 0:0.01:5;
frequency=2*pi; %change this variable to see effect on complex exponential
y=exp((j*(frequency))*time); 
figure(1);
plot3(time,real(y),imag(y), 'linewidth', 0.3);
grid
xlabel('t'),ylabel('Re(y)'),zlabel('Im(y)');
 
 %%
 % Figure 2.2 - Complex exponential with projections
 % Plot 3D complex exponential and also project the real and imaginary
 % parts onto their respective planes. 
 % This will help you visualize what a complex exp. is made out of.
 
clf
time = 0:0.01:5;
y1 = exp(1i*2*pi*time);
y2 = exp(-1i*2*pi*time);
subplot(121);
plot3(time,real(y1), imag(y1),'b',  'linewidth', 1.5); %plot 3D complex exp
grid
xlabel('Time, t'),ylabel('Real plane'),zlabel('Imaginary plane');
th2 = linspace(-2,-2, length(real(y1))); %vector of -2 to hold projection on real plane
hold on
plot3(time, real(y1), th2, 'g', 'linewidth', 1.1); %plot real part against time, hold imaj part constant  
hold on
th = linspace(2,2, length(real(y1))); %vector of 2 to hold projection on imaj plane
plot3(time,th, imag(y1), 'r', 'linewidth', 1.1) %plot imaginary part of positive complex exp
grid on
 
% Negative complex exp
subplot(122)
plot3(time,real(y2), imag(y2), 'b',  'linewidth', 1.5); 
grid
xlabel('Time, t'),ylabel('Real plane'),zlabel('Imaginary plane');
hold on
plot3(time, real(y2), th2, 'g','linewidth', 1.1)
hold on
plot3(time,th, imag(y2), 'r',  'linewidth', 1.1)
grid on
 
 
%%

% Chapter 3

% Figure 3.1 – Discrete sampling
% Shows the digital vs. discrete signal
% Discrete signals, better named as discrete time signals, can have sample points at any amplitude value.
% This makes them discrete time but continuous amplitude.
% Digital signals are limited in which amplitudes the sample can take.
% Digital signals are discrete time and discrete amplitude.
% Here we plot a continuous wave being sampled discretely and digitally
 
clf
time = 0: .01: 4;
x = sin(2*pi*time)-.6*sin(2*pi*2.5*time)+.6; %continuous wave
% setup the sampling frequency and period
Fs = 8;
ts = 1/Fs; 
n = 0: 32;
xd = sin(2*pi*n*ts)-.6*sin(2*pi*2.5*n*ts)+.6; %discrete samples
subplot(211)
plot(time*Fs, x, '--')
title('Exact Sampling')
xlabel('Time')
ylabel('Amplitude')
axis([0 32 -1.5 2.5])
hold on 
stem(n, xd)
 
subplot(212)
plot(time*Fs, x, '--')
title('Binary Digital Sampling')
xlabel('Time')
ylabel('Amplitude')
axis([0 32 -1.5 2.5])
hold on
 
% Set up the digital sampling by moving discrete time but continuous
% amplitude samples to be discrete in both time and amplitude. 
for n=1:length(xd)
if xd(n) > 0
    xd(n) = 1
else 
    xd(n) = -1
end   
end
 
stem(linspace(0,32,33), (xd))
hold on

%%
% Figure 3.2 – Sampling a CT signal
clf
time = 0: .01: 2;
x = .2*sin(2.5*pi*time)+ .9*cos(5*pi*time+1);
Fs = 8;
Ts = 1/Fs;
k = 0: 19;
xt = .2*sin(2.5*pi*k*Ts)+ .9*cos(5*pi*k*Ts+1);
 
length(k)
del = ones(length(k));
figure(1)
plot(time*Fs, x, '-.')
hold on
xlim = get(gca,'xlim');  %Get x range 
hold on
title('(a) - The analog signal')
 hFig = figure(1);
%   set(hFig, 'units', 'inches', 'pos', [7 5 4.5 1]) 
 
figure (2)
stem(k, del) 
axis([ 0 20 0 1.25])
 hFig = figure(2);
%   set(hFig, 'units', 'inches', 'pos', [7 5 4.5 1]) 
title('(a) - The Impulse train')
 
figure(3)
hFig = figure(3);
%   set(hFig, 'units', 'inches', 'pos', [7 5 4.5 1]) 
stem(k, xt)
axis([ 0 20 -1.5 1.5])
hold on
 
xlim = get(gca,'xlim');  %Get x range 
hold on
plot([xlim(1) xlim(2)],[0 0],'k')
 plot(time*Fs, x, '-.')
 
 %%
 % square pulse response
 B = 16;
 tmin = -1/B;
 time = tmin*8: .01: -tmin*8;
 
 ht = sinc(B*time)
 figure(1)
 
plot(time, (ht));
axis([ -8/B 8/B -.25 1.25])
xlabel('Time, seconds')
grid on
title('(a) - Pulse applied to every sample, width =.075 sec.')
%Frequency domain
figure(2)
f = linspace(2/tmin, -2/tmin, length(time));
y = (1/B)*rectpuls(f, B)
plot(f, y)
title('(b) - Frequency response of the sinc pulse, B = 2/T = 8 Hz')
xlabel('Frequency, Hz')
grid on

%%
% Fig. 3.5 - Zero and first-order hold
% Reconstructs a sampled signal with two methods.
% Zero order hold will maintain the same amplitude as previous sample until
% next sample point. 
% First order will linearly interpolate from one sample to the next.
 
clf
f=4; %frequency of the impulse in Hz
fs=8; % sample frequency is 10 times higher
time=-4:1/fs:3; % discrete time vector
y2 = ones(size(time));
plot(time,y2);
subplot(211)
 
time2 = -4: .01:3; % "continuous" time vector
xc_discrete = cos(2*pi*time+pi/3)*.2 - sin(2*pi*2.*time+pi/3)*.8 - .01*time;
xc2 = cos(2*pi*time2+pi/3)*.2 - sin(2*pi*2.*time2+pi/3)*.8 - .01*time2;
  
stairs(time, xc_discrete, 'r') % creates the zero order hold 
 
hold on
plot(time2, xc2, '-.')
title('Zero Order Reconstruction')
xlabel('Time')
ylabel('Amplitude')
grid on
axis([ -1 1.6 -1 1])
set(gca, 'Xtick', -1: .125:1.6)
subplot(212)
plot(time, xc_discrete, 'r')
hold on
plot(time2, xc2, '-.') %Matlab's plot function plots discrete samples by using a first order hold!
title('First Order Reconstruction')
xlabel('Time')
ylabel('Amplitude')
grid on
axis([ -1 1.6 -1 1])
set(gca, 'Xtick', -1: .125:1.6)
 
%%
% Fig. 3.6 - Sinc reconstruction
% 
clf
f=4; %frequency of the impulse in Hz
fs=8; % sample frequency is 10 times higher
time=-4:1/fs:3; % time vector
y2 = ones(size(time));
plot(time,y2);
subplot(311)
n = 0: 8
time2 = -4: .01:3;
xc = cos(2*pi*time+pi/3)*.2 - sin(2*pi*2.*time+pi/3)*.8 - .01*time;
xc2 = cos(2*pi*time2+pi/3)*.2 - sin(2*pi*2.*time2+pi/3)*.8 - .01*time2;
xs = y2.*xc;
 
plot(time, xs, 'o')
hold on
plot(time2, xc2, '-.')
grid on
axis([ -1 1.6 -1 1])
 
set(gca, 'Xtick', -1: .125: 1.6)
  
subplot(312)
n2 = 0:56;
T = 1/fs;
fb = 1;
h = 0;
 
for i = 1: length(xs)    
t3 = -8: .01: 32;
h =  xs(i)*sinc((t3-n2(i)));
plot(t3-8, h)
hold on
end
axis([ -8 13 -1 1])
set(gca, 'Xtick', -8: 1: 13)
grid on
hold on
plot(time*8, xs, 'o')
 
subplot(313)
h = 0;
for i = 1: length(xs)
t3 = -8: .01: 32;
h = h + xs(i)*sinc((t3-n2(i)));
hold on
end
plot(t3-8, h)
axis([ -8 13 -1 1])
grid on

%%
% Figure 3.9 – Sampled signals

% This plots a continous wave with continuous time. 
% Underneath, the sampled waveform is plotted with X-axis in terms of
% sample number and in terms of radians. For a discretely sampled signal,
% the sampling rate and the sampled singal's fundamental frequency will 
% determine how much each sample is in terms of radians. 
 
cls
clf
 time = -.5: .01: .5; %continuous time, to be convertered to digital freq and samples
 y1 = cos(8*pi*time); %continuous cosine signal to be sampled
 clf;   
 subplot(3,1,1)
 plot(time, y1, 'linewidth', 1.00)
 grid on;  
 xlabel('Time, t seconds');
 ylabel('(a) - x(t)');  
 axis;    
 subplot(3,1,2)
 n = -5: 5; %sample number vector
 y2 = cos(4*pi*n*.2); % sampled version of continuous cosine
 stem(n, y2, 'filled') 
set(gca,'xTick',-5: 1: 5) 
%axis here is sample number
 grid;  
 xlabel('Sample, k');
 ylabel('(b) - x[k]'); 
 
 
 subplot(3,1,3)
 n = -5: 1: 5; 
 n2 = -2*pi: 2*pi/5: 2*pi; 
 y2 = cos(2*n2); 
 stem(n2, y2, 'filled') 
 axis([-2*pi 2*pi -1 1]); grid;   
 xlabel('Radians'); 
 ylabel('(c) - x[k]'); 
 axis([-2*pi 2*pi -1. 1.]) % Define x-ticks and their labels to be in terms of digital freq
 set(gca,'xTick',-2*pi: pi/5: 2*pi) 
 set(gca,'xTickLabel',{'-2pi', '', '-8pi/5', '', '-6pi/5', '', '-4pi/5', '', '-2pi/5', '', '0', '', '2pi/5', '', '4pi/5', '', '6pi/5', '', '8pi/5' , '',  '2pi'}) 

%% 
% Figure 3.11 three signals with same samples.
% We plot 3 continuous waves that when sampled at a given rate, end up
% having the same samples. The signals are aliases at this sampling rate.
 
clf
freq1 = 2
freq2 = 6;
freq3 = 10;
time = 0: .001: 1;
x1 = cos(2*pi*freq1*time);
x2 = cos(2*pi*freq2*time);
x3 = cos(2*pi*freq3*time);
 
Fs = 4;
n = 0: 8;
x4 = cos(2*pi*n/Fs);
 
plot(time, x1,'r') 
hold on
plot(time, x2,'b')
plot(time, x3,'g')
stem(n/(2*Fs), x4, 'filled', 'linewidth', .2)
axis([ 0 1 -1 1])
xlim = get(gca,'xlim');  %Get x range 
hold on
plot([xlim(1) xlim(2)],[0 0],'k')
title('Three different waves, f = 2, 6, 10 Hz all pass through same samples')
xlabel('Time, t')
 
%%
% Figure 3.6 – Sinc reconstruction

% A waveform is sampled to bring it to discrete time domain. It can be brought back by 
% placing a scaled sinc at each sample point and summing all sincs together. 
 
clf
% set(0,'DefaultLineMarkerSize', 3)
% set(0,'DefaultLineLineWidth', 1.0)
 
% f = 1: .01: 1;
time = 0: .01: 1;
 
%waveform to be sampled and reconstructed
x = .3*sin(2*pi*time)-.6*cos(6*pi*time);
Fs = 10;
k = 0: 30;
%discrete samples of waveform
xn = .3*sin(2*pi*k/Fs)-.6*cos(6*pi*k/Fs);

figure(1)
plot(time, x)
xlabel('Time')
ylabel('Amplitude')
title('A sampled signal')
hold on
stem(k/Fs, xn, 'filled')
axis([ 0 1 -1 1])
 
figure(2)
clf 
% Create sinc for each sample point 
%Shift each sinc by n/10 and scale it by sample amplitude
ht1 = xn(1)*sinc(Fs*((time-(0/10))));
ht2 = xn(2)*sinc(Fs*((time-(1/10))));
ht3 = xn(3)*sinc(Fs*((time-(2/10))));
ht4 = xn(4)*sinc(Fs*((time-(3/10))));
ht5 = xn(5)*sinc(Fs*((time-(4/10))));
ht6 = xn(6)*sinc(Fs*((time-(5/10))));
ht7 = xn(7)*sinc(Fs*((time-(6/10))));
ht8 = xn(8)*sinc(Fs*((time-(7/10))));
ht9 = xn(9)*sinc(Fs*((time-(8/10))));
ht10 = xn(10)*sinc(Fs*((time-(9/10))));
ht11 = xn(11)*sinc(Fs*((time-(10/10))));
 
%plot all sincs 
plot(time, ht1, time, ht2, time, ht3, time, ht4, time, ht5, time, ht6, time, ht7, time, ht8, time, ht9, time, ht10, time, ht11)
hold on
stem(time(1: 10: 100), xn(1:1:10), 'filled')
hold on
xlabel('Time')
ylabel('Amplitude')
title('Each sample in one period replaced by scaled sinc function')
xlim = get(gca,'xlim');  %Get x range 
plot([xlim(1) xlim(2)],[0 0],'k', 'linewidth', .75)
  
%Plot sinc reconstruction and original signal

figure(3)
hta = ht1+ht2+ht3+ht4+ht5+ht6+ht7+ht8+ht9+ht10+ht11;
plot(time, hta, '--')
hold on
xlim = get(gca,'xlim');  %Get x range 
plot([xlim(1) xlim(2)],[0 0],'k', 'linewidth', .75)
hold on
plot(time, x,'r')
 
xlabel('Time')
title('Summation of all scaled sinc functions vs. original signal')
axis( [ 0 1 -1.5 1.5])
time = -1: .01: 1;
 
%Show sinc basis functions on their own

figure(4)
ht0 = xn(1)*(Fs/pi)*sinc(Fs*time/pi);
mht = max(-ht0);
ht0=(-1)* ht0/mht;
plot(time, ht0, time+1/10, ht0, time+2/10, ht0, time+3/10,ht0, time+4/10, ht0, time+5/10, ht0)
xlabel('Time')
title('Sinc functions ready to replace samples')
hold on
xlim = get(gca,'xlim');  %Get x range 
plot([xlim(1) xlim(2)],[0 0],'k', 'linewidth', .75)

%%
% Example 3.7 
clf
k = -20: 19
Fs = 10;
subplot(3,1,1)
x = 1+sin(2*pi*k/Fs);
stem(k, x, 'filled')
xlabel('Sample, k')
grid on
axis([ -20 20 0 3])
ffx = fftshift((1/10)*abs(fft(x, 10)));
n = -5: 4;
subplot(3,1,2)
stem(n, ffx, 'filled')
axis([ -5 5 0 1.5])
xlabel('Bin')
set(gca,'xTick',-5:  5) 
grid on
newx = [ ffx ffx ffx ffx ffx]
time2 = linspace(-25, 24, 50)
subplot(3,1,3)
stem(time2, newx, 'filled')
xlabel('Bin')
grid on
axis([ -25 25 0 1.5])
%%
clf
% Figure 3.22
% Here we see single and replicating spectrums 
clf
n = -10: 9; % sample number
Fs = 10; % sampling frequency
figure(1)
%x = [0 1 2 3];
x = 1+sin(2*pi*n/10);
k2 = -length(n)*2.5: length(n)*2.5-1;
x1 = [ x x x x x]
figure(1)
stem(k2, x1, 'filled')
xlabel('Sample, n')
ylabel('x[n]')
title('(a) - the discrete signal')
axis([ -10 10 -1 3])
ffx = fftshift((1/10)*abs(fft(x, 10)))
n = -5: 4;
 
figure(2)
stem(n, ffx, 'filled')
axis([ -5 4 0 1.5])
xlabel('Frequency')
ylabel('C[k]')
title('(b) - Fundamental Spectrum')
 
grid on
figure(3)
newx = [ ffx ffx ffx ffx ffx ]
time2 = linspace(-25, 24, 50)
stem(time2, newx, 'filled')
xlabel('Frequency')
ylabel('C[k]')
title('(c) - Repeating coefficients')
axis([ -25 25 0 1.5])

%%
% Figure 3.23 
% When calculating the discrete fourier series, there are an infinite number of frequencies 
% that can go through the sample points. These frequencies are called
% aliases. They show up as repeating bands reproduced at the sampling
% frequency. Here we plot the center band, called the fundamental spectrum
% and a wider view showing more alias bands.  
clf 
n = -20: 19 % sample index
Fs = 10; % sampling freq - this will set the spacing of alias spectrums
figure(1)
x = .5 +.25*cos(2*pi*n/5) - .6*sin(pi*n/2);
n2 = -length(n)*1.5: length(n)*1.5-1;
set(0,'DefaultLineMarkerSize', 3)
x1 = [ x x x];
s(1)=subplot(3,1,1);
stem(n2, x1, 'filled')
xlabel('Sample, n')
axis([ -20 20 0 2])
 
ffx = fftshift((1/4)*abs(fft(x, 20))); 
n = -10: 9;
grid on
s(2)=subplot(3,1,2);
stem(n, ffx, 'filled')
axis([ -10 10 0 3])
xlabel('Bin')
 
grid on
 
s(3)=subplot(3,1,3);
newx = [ ffx ffx ffx ffx ffx];
time2 = linspace(-50, 49, 100);
stem(time2, newx,  'filled')
xlabel('Bin')
axis([ -50 50 0 3])
grid on
set(gca,'xTick',-50:10:  50) 
title(s(1),'Time domain samples')
title(s(2),'Frequency domain, fundamental alias')
title(s(3),'Frequency domain, multiple alias spectrums')

%%
%Figure 3.21 – Real and imaginary components of the discrete signal harmonics.
% This figure plots the real parts of a discrete sampled exponential 

%Discrete harmonics repeat every 2*pi while continuous harmonics do not repeat. 
%Note that while the discrete harmonic frequency increases the number of
%samples stays the same. 
 
n=-6:6; %time axis
set(0,'DefaultLineMarkerSize', 3)
set(0,'DefaultLineLineWidth', .75)
clf
N=6; %number of harmonics to divide the period by
w0=2*pi/N; %digital frequency    
axis([-12.5 12.5 -1.1 1.1]); 
 
% 0th Harmonic
k=0; 
Phi0n=exp(j*w0*k*n);  
subplot(3,3,1)
stem(n,linspace(1,1,13), 'filled');
hold on
plot(time, cos(w0*k*time)) 
axis([-6 6 -1.1 1.1]); 
title('2pi(0/6)') 
hold on
time= -1: 1/(2*N): 1;
plot(time*N, cos(w0*k*time)) 
axis([-6 6 -1.1 1.1]); 
 
k=1; 
Phi1n=exp(j*w0*k*n);  
subplot(3,3,2);
stem(n,real(Phi1n), 'filled');
hold on
title('2pi(1/6)')
time= -1*N: 1/(2*N): 1*N;
plot(time, cos(w0*k*time)) 
axis([-6 6 -1.1 1.1]); 
 
k=2; 
Phi2n=exp(j*w0*k*n);  
subplot(3,3,3);
stem(n,real(Phi2n), 'filled');
hold on
title('2pi(2/6)')
time= -1*N: 1/(2*N): 1*N;
plot(time, cos(w0*k*time)) 
axis([-6 6 -1.1 1.1]); 
 
k=3; 
Phi3n=exp(j*w0*k*n);  
subplot(3,3,4);
stem(n,real(Phi3n), 'filled');
title('2pi(3/6)')
hold on
time= -1*N: 1/(2*N): 1*N;
plot(time, cos(w0*k*time)) 
axis([-6 6 -1.1 1.1]); 
 
k=4; 
Phi4n=exp(j*w0*k*n);  
subplot(3,3,5);stem(n,real(Phi4n), 'filled');
title('2pi(4/6)')
hold on
time= -1*N: 1/(2*N): 1*N;
plot(time, cos(w0*k*time)) 
 
axis([-6 6 -1.1 1.1]); 
 
k=5; 
Phi5n=exp(j*w0*k*n);  
subplot(3,3,6);
stem(n,real(Phi5n), 'filled');
title('2pi(5/6)')
hold on
time= -1*N: 1/(2*N): 1*N;
plot(time, cos(w0*k*time)) 
axis([-6 6 -1.1 1.1]); 
 
%Real part of 6th Harmonic will be repeat of 0th in discrete domain
k=6; 
Phi6n=exp(j*w0*k*n);  
subplot(3,3,7);
stem(n,real(Phi6n), 'filled');
title('2pi(6/6)')
hold on
time= -1*N: 1/(2*N): 1*N;
plot(time, cos(w0*k*time)) 
axis([-6 6 -1.1 1.1]); 
 
%Real part of 7th Harmonic will be repeat of 1st in discrete domain
k=7; 
subplot(3,3,8); 
Phi7n=exp(j*w0*k*n);  
stem(n,real(Phi7n), 'filled');
axis([-6 6 -1.1 1.1]); 
hold on
plot(time, cos(w0*k*time)) 
title('2pi(7/6)')
 
%Real part of 8th Harmonic will be repeat of 2nd in discrete domain
k=8;
subplot(3,3,9); 
Phi8n=exp(j*w0*k*n);  
subplot(3,3,9);
stem(n,real(Phi8n), 'filled');
hold on
plot(time, cos(w0*k*time)) 
title('2pi(8/6)')
axis([-6 6 -1.1 1.1]); 

%Figure 3.22
close all
k = -20: 19
Fs = 10;
subplot(3,1,1)
x = 1+sin(2*pi*k/Fs);
stem(k, x, 'filled')
xlabel('Sample, k')
grid on<br>axis([ -20 20 0 3])
ffx = fftshift((1/10)*abs(fft(x, 10)));
n = -5: 4;
subplot(3,1,2)
stem(n, ffx, 'filled')
axis([ -5 5 0 1.5])
xlabel('Bin')
set(gca,'xTick',-5: 5) 
grid on
newx = [ ffx ffx ffx ffx ffx]<br>t2 = linspace(-25, 24, 50)
subplot(3,1,3)
stem(t2, newx, 'filled')
xlabel('Bin')
grid on

%%
% Figure 3.24
close all
k = -10: 9
Fs = 10;
subplot(3,1,1)
x = [0 0 2 1];
x1 = [ x x x x x]
stem(k, x1, 'filled')
xlabel('Sample, k')
axis([ -10 10 0 3])
ffx = fftshift((1/4)*abs(fft(x, 4)))
n = -2: 1;
grid on
subplot(3,1,2)
stem(n, ffx, 'filled')
axis([ -3 3 0 1.0])
xlabel('Bin')

grid on
subplot(3,1,3)
newx = [ ffx ffx ffx ffx ffx]
t2 = linspace(-10, 9, 20);
stem(t2, newx, 'filled')
xlabel('Bin')
grid on
axis([ -10 10 0 1.0])

%%
% Figure 3.25
clf
k = -10: 9
Fs = 10;
figure(1)
x = [0 1 2 3];
x1 = [ x x x x x]
subplot(3,1,1)
stem(k, x1, 'filled')
xlabel('Sample, n')
grid on
axis([ -10 10 0 3])
ffx = fftshift((1/4)*abs(fft(x, 4)))
n = -2: 1;
set(gca,'xTick',-10: 4: 10)
subplot(3,1,2)
stem(n, ffx, 'filled')
axis([ -3 3 0 2])
xlabel('Bin')
 
 
grid on
set(gca,'xTick',-3:  3)
 
subplot(3,1,3)
newx = [ ffx ffx ffx ffx ffx]
time2 = linspace(-10, 9, 20)
stem(time2, newx, 'filled')
xlabel('Bin')
 
grid on
axis([ -10 10 0 2])
set(gca,'xTick', -10    : 4: 10)

%% 
% Figure 3.26 - Square pulse example 
fig=gcf;
% set(findall(fig,'-property','FontSize'),'FontSize',8)
% % Change default axes fonts.
% set(0,'DefaultAxesFontName', 'charter')
% set(0,'DefaultAxesFontSize', 8)
% set(0, 'DefaultAxesColorOrder', [ 0 0 0])
% set(0, 'DefaultAxesLineStyleOrder', '-|:|--|-.')
% set(0,'DefaultAxesLineWidth', .75)
% set(0,'DefaultLineLineWidth', 1.0)
% set(0,'DefaultLineMarkerSize', 2)
% set(0,'DefaultTextFontname', 'charter')
% set(0,'DefaultTextFontSize', 8)
 
clf
L = 2; 
N = 10; 
k = [-N/2: N/2];
n = [0:1:N-1];
 
k=[0:1:N-1];
xn = [ones(1,L), zeros(1,N-L)];
xn2 = [ xn xn xn xn];
subplot(3,1,1)
lk = linspace(0, 4*N-1, 4*N)
stem(lk, xn2,'filled');
%str=sprintf('Square pulse with N = %d , L = %d', N, L);
 
%title(str)
 
subplot(3,1,2)
WN = exp(-j*2*pi/N);
nk = n'*k;
k3 = linspace(-5,4, 10)
WNnk = WN.^nk;
Xk = xn * WNnk;
stem(k3, fftshift(abs(Xk)),'filled')
hold on
 
plot(k3, fftshift(abs(Xk)), '--')
axis([ -5 , 4, -.5, N])
 
subplot(3,1,3)
lk4 = linspace(-20, 19, 40)
Xn2 = [ Xk Xk Xk Xk];
stem(lk4, Xn2, 'filled');
hold on
plot(lk4, Xn2, '--')
axis([-20, 19, -1, max(Xn2)])


 
 % Chapter 4

%%
% sampling a signal

Close all 
time = 0: .01: 45
y = sin((1/14)*2*pi*time)+ .3*sin((1/14)*2*pi*time*3) ;
figure(1)
plot(time, y, 'linewidth', 1.5)
xlabel('Time, t')
ylabel ('Amplitude')
title('Continuous signal')
grid on
hold on
plot([xlim(1) xlim(2)],[0 0],'k', 'linewidth', .75)
ts = 1/14;
n = 0: 1: 44;
yd = sin(2*pi*n*ts) + .3*sin(2*pi*ts*n*3);
stem(n, yd, 'filled')
xlabel('Sample, k')
ylabel ('Amplitude')
title('Sampled signal')

%%
 
% Chapter 5 
%%
% Figure 5.6 - DTFT of a group of pulses

clf 
Kp = 7; 
b = [0 0 0 0 ones(Kp, 1)' 0 0 0 0 ]; 
lenb = length(b);
subplot(121) 
n2 = -4-(Kp-1)/2: 4+(Kp-1)/2; 
stem(n2, b, 'filled') 
grid on
axis([-4-(Kp-1)/2 4+(Kp-1)/2 0 1.5]) 
subplot(122) 
time = -10:.01: 10; 
xom = abs(diric(2*time, Kp)); 
grid on 
plot(time, xom) 
axis([-3*pi 3*pi -2 2])
grid on
set(gca,'XTick',[-3*pi:pi/2:3*pi])
pilabels
 
 
%% 
%% Figure 5.7 – Sinc and Drichlet functions
clf
N = 10;
k = -N/2: N/2;
om = -N/2: .1: N/2;
x = sinc(k);
x1= sinc(om);
subplot(221)
stem(k, x)
axis([-N/2, N/2, -.5 1.5])
set(gca,'XTick',[-N/2:N/2])
grid on
subplot(223)
stem(k, x)
hold on
plot(om, (x1), '-.')
grid on
axis([-N/2, N/2, -.5 1.5])
set(gca,'XTick',[-N/2:N/2])
subplot(224)
stem(k, x)
hold on
plot(om, abs(x1), '-.')
grid on
axis([-N/2, N/2, -.5 1.5])
set(gca,'XTick',[-N/2:N/2])
subplot(222)
N = 50;
k = -N/2: N/2;
om = -N/2: .1: N/2;
x = sinc(k);
stem(k, x)
axis([-N/2, N/2, -.5 1.5])
 
grid on 
  
%%
%Figure 5.6 
close all
Kp = 7; 
b = [0 0 0 0 ones(Kp, 1)' 0 0 0 0 ]; 
lenb = length(b);
subplot(121) 
n2 = -4-(Kp-1)/2: 4+(Kp-1)/2; 
stem(n2, b, 'filled') 
grid on
axis([-4-(Kp-1)/2 4+(Kp-1)/2 0 1.5]) 
subplot(122) 
t = -10:.01: 10; 
xom = abs(diric(2*t, Kp)); 
grid on 
plot(t, xom) 
axis([-3*pi 3*pi -2 2])
grid on
set(gca,'XTick',[-3*pi:pi/2:3*pi])
pilabels
 
 % Figure 5.7 - The Drichlet function

%%
clf
cls
 x = linspace(-3*pi,3*pi,300);           
    subplot(221); plot(x,(diric(x,2))); 
    title('Diric, N = 2'); axis tight;  
    pilabels
     grid on
     ylabel('Amplitude')
    subplot(222); plot(x,(diric(x,3)));      
    title('Diric, N = 3'); axis tight; 
    pilabels
   
    grid on
     subplot(223); plot(x,abs(diric(x,5))); 
    title('Diric, N = 5'); axis tight;  
    pilabels
         ylabel('|Amplitude|')
          xlabel('Frequency')
     grid on
    subplot(224); plot(x,abs(diric(x,8)));      
    title('Diric, N = 8'); axis tight; 
    pilabels
     grid on
xlabel('Frequency')

% Figure 5.8
 
%%
cls
Clf
n2 = -30: 30;
time = -40: .01: 40;
T0 = 1;
tau = .25;
xfscn = [ 0 0 0 0 0 0 0 0 1 1  0 0 0 0 0 0 0 0 1 1];
xfsc = sinc(tau*time/T0);
xfscn = fft(xfscn, 20)
 
 
n3 = -10: 1: 9;
plot(n3, fftshift(abs(xfscn)))
figure
plot(n3, imag(xfscn))
%%
clf 
K0 = 8;
N = 4;
a = [1 ]
 
b = [ a 0 0 0 0 0 0 ]; 
 
c = [ b b b]; 
subplot(2,1,1) 
time = -11: 9; stem(time, c) 
axis([-11 9 0 1.5]) 
subplot(2,1,2) 
 
n2 = -14: 13; 
xom = (N/K0)*diric(2*n2*pi/K0, N); 
grid on 
stem(n2, xom, 'filled') 
hold on
n2 = -11: .01: 9; 
xom2 = (N/K0)*diric(2*n2*pi/K0, N); 
plot(n2, xom2, '-.r' ) 
axis([-11 9 -1 1])  

%%
% CTFT
%Compare all
% Here we plot a time domain signal, then its CTFT, its phase, and the
% real and imaginary parts. 
clf
 
% Create a "continuous" rectangle pulse signal 
% Plot it
x = [zeros(1, 124) ones(1,8) zeros(1,124)];
time = -128:  127;
figure(1)
plot(time, x)
grid on
axis([ -128 128 0 1.5])
 
 
% On this figure we plot the CTFT and its parts (phase, real, imag)
figure(2)
subplot(2,2,1)
% We use the FFT to plot the CTFT. Technically it is the DTFT but with 
% enough sample points, the two look the same when plotted only between
% -pi/2 to pi/2
ctft = fft(x, 256)
% FFTshift rearranges the array of FFT values to be centered at 0 going to
% +/- (pi/2). Makes visualizing the FFT much simpler. 
x2 = fftshift(abs(ctft))'
 
% Create the index by which we plot the CTFT against. 
freq = linspace(-pi/2,pi/2,length(time));
 
plot(freq, x2)
axis([ -pi/2 pi/2 0 10])
% set(gca,'XTick',[-128:64:128])
title('Abs of ctft')
grid on
subplot(2,2,2)
plot(freq, (imag(ctft)));
% set(gca,'XTick',[-128:64:128])
%set(gca,'XTickLabel',['-128'; '-64 '; '0'; ' 64'; '128'])
 
phase = atan(imag(ctft)./(real(ctft)))
plot(freq, phase)
axis([ -pi/2 pi/2 -pi pi])
set(gca,'YTick',[-pi:pi/4:pi])
title('Phase')
grid on
set(gca,'XTick',[-128:64:128])
%set(gca,'XTickLabel',['-128'; '-64 '; '0'; ' 64'; '128'])
 
subplot(2,2,3)
plot(time, real(fftshift(ctft)))
title('Real part')
axis([ -128 128 -10 10])
grid on
set(gca,'XTick',[-128:64:128])
%set(gca,'XTickLabel',['-128'; '-64 '; '0'; ' 64'; '128'])
 
 
subplot(2,2,4)
plot(time, imag(ctft))
title('Imaginary part')
axis([ -128 128 -1.5 1.5])
set(gca,'XTick',[-128:64:128])
%set(gca,'XTickLabel',['-128'; '-64 '; '0'; ' 64'; '128'])
 
grid on
 
%%
time = -24: 24;
x = time.^2/10;
plot(time, x)
set(gca,'XTick',[-24:8:24])
set(gca,'XTickLabel',['-24'; '-16 '; '-8'; ' 0'; '8'; '16 '; '24'])
 
 
%%
%% Figure 5.5 – DTFT of a discrete signal

clf
x = [0 2 -3 0 5  zeros(12, 1)' ];
n = 0: 16;
figure(1)
stem(n, x)
grid on
axis([ 0 16 -3 6])
f = -1: .01: 1;
ce = 2*exp(-1i*2*pi*f*1)-3*exp(-1i*2*pi*f*3)+5*exp(-1i*2*pi*f*5)
xf = abs(ce);
figure(2)
plot(f, xf)
grid on
figure(3)
 
phase = atan((imag(ce)./real(ce)))
plot(f, phase)
grid on
 
figure(3)
 
k = 3;
cen = 0;
for n = 0:4
cen = abs(cen) + 2*exp(-1i*2*pi*k*n)-3*exp(-1i*2*pi*k*n)+5*exp(-1i*2*pi*k*n)
end
 
%% 
% Diric function
 
clf
 
set(0,'DefaultAxesXGrid','on','DefaultAxesYGrid','on')
 
set(0,'DefaultFigureWindowStyle','docked')
 
N = 10;
NT = 48;
k = -N/2: N/2;
x = abs(sinc(k))
figure(1)
grid on
%stem(k, x)
hold on
om = -4*pi: 2*pi/NT: 4*pi
%plot(om, abs(sinc(om)))
axis([ -2*pi 2*pi 0 1])
grid on
subplot(322)
xd = abs(diric(om, 3))
plot(om, xd)
axis([ -3*pi 3*pi 0 1])
subplot(321)
plot(om, xd)
axis([ -pi pi 0 1])
text(-2.5, 0.8, 'N = 3')
subplot(324)
xd2 = abs(diric(om, 5))
plot(om, xd2)
axis([ -3*pi 3*pi 0 1])
subplot(323)
plot(om, xd2)
axis([ -pi pi 0 1])
text(-2.5, 0.8, 'N = 5')
subplot(326)
xd2 = abs(diric(om, 9))
plot(om, xd3)
axis([ -3*pi 3*pi 0 1])
subplot(325)
plot(om, xd3)
axis([ -pi pi 0 1])
text(-2.5, 0.8, 'N = 9')


%%
% Figure 5.11
Rs = 1; %Sets the frequency of source.
Ts = 1/Rs; %Calculates the period of the source.
al = .5;
f = 0:0.01:T; %Defines vector t with 10T+1 elements from 0-T.
s = zeros(size(f)); 
for i = 1:length(f) 
 if f(i)<(1-al)/(2*Ts) 
 s(i) = Ts; 
 elseif (1-al)/(2*Ts)<=f(i)& f(i)<(1+al)/(2*Ts) 
 s(i) = (Ts*.5)*(1+cos((pi*Ts/al)*(abs(f(i))-((1-al)/(2*Ts))))); 
 else
 s(i) = 0; 
 end
end
 
figure(1) %Names the figure
plot(f,s); %Draws a plot where t is the x-axis and s(t) is the y-axis
xlabel('time (seconds)'); %Inserts a x-axis label on the plot
ylabel('s(t)'); %Inserts a label for the y-axis
grid on
hold on
 
%% Triangualar pulse
 x = [ zeros(7,1)' .25 .5 .75 1 .75 .5 .25 zeros(6,1)'];
 lenx = length(x)
n = -lenx/2: lenx/2-1;
subplot(311)
stem(n, x)
grid on
N = 24;
om = 2*pi/N;
xf = fftshift(abs(fft(x, 20))/20);
n2 = -10: 9;
subplot(312)
plot(n2, xf)
grid on
xfr = [ xf xf xf xf xf]
subplot(313)
n3 = -50: 49
n4 = -5*pi: pi/10: 5*pi-pi/10;
plot(n4, xfr)
grid on
set(gca,'XTick',[-10*pi:2*pi/2:10*pi])
pilabels

 %%
Figure 5.10 – Time expansion property

 a = [ 0 2 -3 0 5 0];
 x = [ a zeros(12, 1)'];
 lx = length(x)
 n = -lx/2 : lx/2-1;
 subplot(211)
 stem(n,x)
 grid on
 subplot(212)
 om = -3*pi: .01: 3*pi;
 
 xf = 2*exp(j*om)-3*exp(j*2*om)+5*exp(j*4*om);
 plot(om, abs(xf))
 grid on
 
 
 pilabels
 
 %% example time expansion
 a = [ 1 0 0 1 0 0 1];
 x = [ zeros(5, 1)' a zeros(4, 1)'];
 lx = length(x)
 n = -lx/2 : lx/2-1;
 subplot(221)
 stem(n,x)
 grid on
 subplot(222)
 om = -6*pi: pi/6: 6*pi;
 xf = diric(om/3, 3);
 plot(om, abs(xf))
 set(gca,'XTick',[-6*pi:1*pi:6*pi])
 grid on
 pilabels
 
 a = [ 1  1  1];
 x = [ zeros(6, 1)' a zeros(7, 1)'];
 lx = length(x)
 n = -lx/2 : lx/2-1;
 subplot(223)
 stem(n,x)
 grid on
 subplot(224)
 om = -6*pi: pi/6: 6*pi;
 
 xf = diric(om/1, 3);
 plot(om, abs(xf))
 grid on
 pilabels
 set(gca,'XTick',[-6*pi:1*pi:6*pi])
 
 %% Sine
 
 om0 = 1;
 n2 = -10: 10;
 x = sin(om0*n2)
 lx = length(x)
 n = -lx/2 : lx/2-1;
 subplot(211)
 stem(n,x)
 axis([ -10 10 -2 2])
 grid on
 subplot(212)
 om = -3*pi: .01: 3*pi;
 NF = 64;
 xf = fftshift(fft(x, 64)*1/64)
 n3 = -NF/2: NF/2-1
 stem(n3, real(xf))
 grid on
 axis([ -NF/2: NF/2-1 -1 2])
 
%% 
%Figure 5.13 - Gaussian pulse DTFT
 close all
 n = -20: 20;
 sig = 4;
 x = (1/(sig*2*pi)^.5)*exp(-n.^2/(2*sig));
 subplot(211)
 stem(n, x)
 grid on
 subplot(212)
 om = -4*pi:pi/8: 4*pi
 xf = exp(-om.^2/(2*sig));
 plot(om, xf)
 grid on
 
 pilabels
 
 %%
 ND = 11;
om = -1*pi: .01: 1*pi;
xd3 = 10*log10(abs(diric(om, ND)).^2)
plot(om, xd3)
set(gca, 'Xtick', [-pi: 2*pi/ND: pi])
grid on
%pilabels
 
for k = 1: 5
    x1 = diric((k * pi/ND), ND);
    x1 = 20*log10(abs(x1))
end
 
%% Examples of DTFT
 
om = -3*pi : .01 : 3*pi;
n = -6: 6
x1 = [ 0 0 0 0 0 1 1 1 0 0 0 0 0];
x2 = [   0 0 0 0 1 1 1 1 1 0 0 0 0];
subplot(221)
stem(n, x1);
ylabel('Amplitude')
title('(a) x[n] = 111')
grid on
subplot(222)
stem(n, x2);
title('(b) x[n] = 11111')
grid on
x1 = (exp(1i*om*1)) + 1 + (exp(-1i*om*1));
x2 = 1 +  exp(1i*om*2)+ exp(1i*om*1)+ exp(-1i*om*1)+ exp(-1i*om*2); 
subplot(223)
plot(om, (x1))
title('(c) DTFT - 3 impulses')
grid on
pilabels
xlabel('Frequency')
ylabel('Amplitude')
subplot(224)
plot(om, (x2))
title('(d) DTFT - 5 impulses')
grid on
pilabels
xlabel('Frequency')
%%
%% 
b = [ 42 39 36 33 30 27 24 21 18 15];
CI = [ 1 1 4 13 19 31 50 62 18 2];
CI = CI./201;
bar(b, CI)
xlabel('CI')
ylabel(' Frequency of occurence')

 %%
% Figure 5.16 – DTFT of a periodic signal
clf
 
set(0,'DefaultAxesXGrid','on','DefaultAxesYGrid','on')
 
 
NT = 64;
k = -N/2: N/2;
om = -4*pi: .01: 4*pi
subplot(321)
ND = 5;
om = -4*pi: .01: 4*pi
xd3 = (diric(om, ND))
plot(om, xd3)
axis([ -pi pi -.5 1])
hold on
f = -4*pi : 2*pi/ND:  4*pi
xdi = diric(f, ND)
stem(f, xdi)
axis([ -pi pi -.5 1])
 
subplot(322)
ND = 5;
om = -4*pi: .01: 4*pi
xd3 = (diric(om, ND))
plot(om, xd3)
axis([ -12 12 -.5 1])
hold on
f = -4*pi : 2*pi/ND:  4*pi
xdi = diric(f, ND)
stem(f, xdi) 
 
subplot(323)
ND = 7;
om = -1*pi: .01: 1*pi
xd3 = (diric(om, ND))
plot(om, xd3)
axis([ -pi pi -.5 1])
hold on
f = -4*pi : 2*pi/ND:  4*pi
xdi = diric(f, ND)
stem(f, xdi)
 
subplot(324)
ND = 7;
om = -4*pi: .01: 4*pi
xd3 = (diric(om, ND))
plot(om, xd3)
axis([ -12 12 -.5 1])
hold on
f = -4*pi : 2*pi/ND:  4*pi
xdi = diric(f, ND)
stem(f, xdi) 
 
subplot(325)
ND = 9;
om = -1*pi: .01: 1*pi
xd3 = (diric(om, ND))
plot(om, xd3)
axis([ -pi pi -.5 1])
hold on
f = -4*pi : 2*pi/ND:  4*pi
xdi = diric(f, ND)
stem(f, xdi)
 
 
subplot(326)
ND = 9;
om = -4*pi: .01: 4*pi
xd3 = (diric(om, ND))
plot(om, xd3)
axis([ -12 12 -.5 1])
hold on
f = -4*pi : 2*pi/ND:  4*pi
xdi = diric(f, ND)
stem(f, xdi) 
%% example 2
 a = [ 1 2 4 0];
 x = [ a zeros(12, 1)'];
 lx = length(x)
 n = -lx/2 : lx/2-1;
 subplot(211)
 stem(n,x)
 grid on
 subplot(212)
 om = -3*pi: .01: 3*pi;
 
 xf = 1+ 2*cos(om*2)+4*cos(4*om)-j*(sin(2*om)+2*sin(4*om));
 plot(om, abs(xf))
 grid on

 % Chapter 6
 %%
 % Example 6.1 Simple DTFT
clf
beep off
x0 = [ 0 2 -3 0 5  zeros(12, 1)' ];
x = [ 0 2 -3 0 5   ];
lx = length(x);
n = 0: lx-1;
subplot(311)
stem(n, x)
grid on
axis([ 0 lx -4 6])
 
om = -pi: .01: pi;
ce = 2*exp(-1i*om*1)-3*exp(-1i*om*2)+5*exp(-1i*om*4)
xf = abs(ce);
grid on
 
subplot(312)
 
N = lx;
 
xdft = fftshift(abs(fft(x, N)))
Nn = (-lx+1)/2: (lx-1)/2
stem(Nn, xdft)
grid on
 
subplot(313)
stem(Nn*(2*pi/lx), xdft)
 
hold on
grid on
 
plot(om, xf, '-.')

 

Skip to toolbar