Laboratory Manual
Contents
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.a. b. 1. 2. 3. Sampling Theorem Impulse Response Linear Convolution Circular Convolution Auto correlation & its properties Cross correlation & its properties Difference Equation N-Point DFT Linear Convolution using DFT & IDFT Circular Convolution using DFT & IDFT FIR Filters IIR Filters - Butterworth IIR Filters - Chebyshev Type I Linear Convolution Circular Convolution N-Point DFT
As an exercise, it is recommended to go through the basics of Signals & Sytems, Digital Signal Processing and some details about DSP hardware & processors.
Prerequisites: References:
[1] Oppenheim & Schaffer: Digital Signal Processing, Prentice-Hall. [2] B P Lathi: Modern Digital and Analog communication systems, Oxford. [3] Rulph Chassaing: Digital Signal Processing and Applications with the C6713 and C6416 DSK, John Wiley. [4] Avatar Singh & S Srinivasan: Digital Signal Processing, Thomson Learning. [5] TMS320C6713 DSK- Technical Reference, Spectrum Digital, Inc. [6] TMS320C6000 Code Composer Studio Tutorial (Literature Number: SPRU301C), Texas Instruments. [7] Getting Started with Matlab, MATLAB.
Matlab Programs
1. Sampling Theorem
clear all; close all; clc; tf=0.05; t=0:0.00005:tf; f=input('Enter the analog frequency,f = '); xt=cos(2*pi*f*t); fs1=1.3*f; n1=0:1/fs1:tf; xn=cos(2*pi*f*n1); subplot(311); plot(t,xt,'b',n1,xn,'r*-'); title('Undersampling plot'); xlabel('time'); ylabel('Amplitude'); fs2=2*f; n2=0:1/fs2:tf; xn=cos(2*pi*f*n2); subplot(312); plot(t,xt,'b',n2,xn,'r*-'); title('Nyquist plot'); xlabel('time'); ylabel('Amplitude'); fs3=6*f; n3=0:1/fs3:tf; xn=cos(2*pi*f*n3); subplot(313); plot(t,xt,'b',n3,xn,'r*-'); title('Oversampling plot'); xlabel('time'); ylabel('Amplitude');
Output
Enter the analog frequency,f = 200
2. Impulse Response
clear all; close all; clc; disp('Difference Equation of a digital system'); N=input('Desired Impulse response length = '); b=input('Coefficients of x[n] terms = '); a=input('Coefficients of y[n] terms = '); h=impz(b,a,N); disp('Impulse response of the system is h = '); disp(h); n=0:1:N-1; figure(1); stem(n,h); xlabel('time index'); ylabel('h[n]'); title('Impulse response'); figure(2); zplane(b,a); xlabel('Real part'); ylabel('Imaginary part'); title('Poles and Zeros of H[z] in Z-plane');
Output
[Given y(n)-y(n-1)+0.9y(n-2)= x(n)] Difference Equation of a digital system Desired Impulse response length = 100 Coefficients of x[n] terms = 1 Coefficients of y[n] terms = [1 -1 0.9]
3. Linear Convolution
clear all; close all; clc; x=input('x[n]= '); l=length(x); h=input('h[n]='); m=length(h); num=(l+m)-1; x_pad=[x,zeros(1,num-l)]; h_pad=[h,zeros(1,num-m)]; new_matrix=zeros(num,num); new_mat(:,1)=x_pad'; for j=2:num new_mat(1,j)=new_mat(num,j-1); for i=2:num new_mat(i,j)=new_mat(i-1,j-1); end end result=new_mat*h_pad'; disp('y[n]= '); disp(result'); low=min([result',x,h])-5; high=max([result',x,h])+5; subplot(1,3,1); stem(x); xlabel('n'); ylabel('x[n]'); axis([1 num low high]); subplot(1,3,2); stem(h); xlabel('n'); ylabel('h[n]'); axis([1 num low high]); subplot(1,3,3); stem(result'); xlabel('n'); ylabel('y[n]'); axis([1 num low high]);
Output
x[n]= [1 2 3 4] h[n]=[2 1] y[n]= 2 5
11
4. Circular Convolution
clear all; close all; clc; x=input('x[n]= '); h=input('h[n]= '); num=input('Enter the length of the sequences = '); new_matrix=zeros(num,num); new_mat(:,1)=x'; for j=2:num new_mat(1,j)=new_mat(num,j-1); for i=2:num new_mat(i,j)=new_mat(i-1,j-1); end end result=new_mat*h'; disp('y[n]= '); disp(result'); low=min([result',x,h])-5; high=max([result',x,h])+5; subplot(1,3,1); stem(x); xlabel('n'); ylabel('x[n]'); axis([1 num low high]); subplot(1,3,2); stem(h); xlabel('n'); ylabel('h[n]'); axis([1 num low high]); subplot(1,3,3); stem(result'); xlabel('n'); ylabel('y[n]'); axis([1 num low high]);
Output
x[n]= [1 2 3 4] h[n]= [2 1 2 1] Enter the length of the sequences = 4 y[n]= 14 16 14 16
Output
x[n]= [1 2 3 4] Verification of property 1 Rxx[n] and Rxx[-n] are identical Hence Auto correlation has even symmetry Verification of property 2 maximum is at the origin Verification of property 3 Energy of x[n] = 30 Maximun of Rxx[n] = 30 Hence maximum of Rxx is equal to Energy of x[n]
subplot(3,2,3) stem(t,Rxy); xlabel('n'); ylabel('Rxy[n]'); title('Crosscorrelation'); subplot(3,2,4); stem(t2,Ryx); xlabel('n'); ylabel('Ryx[n]'); title('Crosscorrelation'); subplot(3,2,5); stem(Rxy_k); xlabel('k'); ylabel('Rxy[k]'); title('DFT of Rxy[n]'); subplot(3,2,6); stem(temp3); xlabel('k'); ylabel('X[k].Y[k]'); title('DFT x[n].DFT y[n]');
Output
x[n]= [1 2 3 4] y[n]= [4 3 2 1] Verification of property 1 Rxy[n]and Ryx[n] are commutative Verification of property 2 Rxy[n]and Ryx[-n] are equal Verification of property 3 The sequences are not orthogonal DFT Rxy[n]=X[k].Y[k]
clear all; close all; clc; disp('Enter the parameters of Difference Equation of a digital system'); b=input('Coefficients of x[n] terms = '); a=input('Coefficients of y[n] terms = '); xn=input('Enter the input exitation x[n] = '); %of length 1 to 100 yi=input('Enter the initial conditions of y = '); %if necessary %xi=('Enter the initial conditions of x = '); %yi of length 1 to (a-1) %xi of length 1 to (b-1) initialc=filtic(b,a,yi); %initialc=filtic(b,a,yi,xi); y_complete=filter(b,a,xn,initialc); y_forced=filter(b,a,xn); y_natural=y_complete-y_forced; subplot(3,1,1); stem(y_natural); title('Natural response of the system'); subplot(3,1,2); stem(y_forced); title('Forced response of the system'); subplot(3,1,3); stem(y_complete); title('Complete response of the system');
7. Difference Equation
Output
Enter the parameters of Difference Equation of a digital system Coefficients of x[n] terms = 1 Coefficients of y[n] terms = [1 -1 0.9] Enter the input exitation x[n] = [1 zeros(1,99)] Enter the initial conditions of y = [-1 0 0]
8. N-point DFT
clear all; close all; clc; x=input('Enter the sequence x[n]= '); N=input('Enter the value N point= '); L=length(x); x_n=[x,zeros(1,N-L)]; for i=1:N for j=1:N temp=-2*pi*(i-1)*(j-1)/N; DFT_mat(i,j)=exp(complex(0,temp)); end end X_k=DFT_mat*x_n'; disp('N point DFT is X[k] = '); disp(X_k); mag=abs(X_k); phase=angle(X_k)*180/pi; subplot(2,1,1); stem(mag); xlabel('frequency index k'); ylabel('Magnitude of X[k]'); axis([0 N+1 -2 max(mag)+2]); subplot(2,1,2); stem(phase); xlabel('frequency index k'); ylabel('Phase of X[k]'); axis([0 N+1 -180 180]);
Output
Enter the sequence x[n]= [1 2 3 4] Enter the value N point= 4 N point DFT is X[k] = 10.0000 -2.0000 + 2.0000i -2.0000 - 0.0000i -2.0000 - 2.0000i
Output
x[n]= [1 2 3 4] h[n]= [2 1] y[n]= 2 5 8
11
10.
disp('Enter the sequences of equal lengths'); x=input('x[n]= '); N=length(x); h=input('h[n]= '); XN=fft(x,N); HN=fft(h,N); YN=XN.*HN; y=ifft(YN,N); disp('y[n]= '); disp(y); low=min([y,x,h])-5; high=max([y,x,h])+5; subplot(1,3,1); stem(x); xlabel('n'); ylabel('x[n]'); axis([1 N low high]); subplot(1,3,2); stem(h); xlabel('n'); ylabel('h[n]'); axis([1 N low high]); subplot(1,3,3); stem(y); xlabel('n'); ylabel('y[n]'); axis([1 N low high]);
Output
Enter the sequences of equal lengths x[n]= [1 2 3 4] h[n]= [2 1 2 1] y[n]= 14 16 14 16
11.
FIR Filters
wn=input('Enter the passband frequency between 0 & 1 (normalised) = '); %wn=[w1 w2]; %wn is a vector,for Bandpass & Bandstop n=input('Enter the order of the filter = '); %beta=input('Enter the value of beta'); %beta for Kaiser only b=fir1(n,wn,hamming(n+1)); %replace by following for other windows %blackman(n); %hanning(n); %hann(n); %barlett(n); %boxcar(n); %kaiser(n,beta); %b=fir1(n,wn,'high',XXXXXXX(n)); Highpass window %b=fir1(n,wn,XXXXXXX(n)); Bandpass window %b=fir1(n,wn,'stop',XXXXXXX(n)); Bandstop window [h,w]=freqz(b,1,512); dB=20*log10(abs(h)); figure(1); subplot(2,1,1); plot(w/pi,dB); title('Magnitude response'); xlabel('Normalised frequency'); ylabel('Magnitude in dB'); grid; subplot(2,1,2); plot(w/pi,angle(h)); title('Phase response'); xlabel('Normalised frequency'); ylabel('Phase in degrees'); grid; figure(2); stem(impz(b,1)); title('Impulse response'); xlabel('Time index n'); ylabel('Amplitude');
Output
Enter the passband frequency between 0 & 1 (normalised) = 0.3 Enter the order of the filter = 20
[h,w]=freqz(b,a); mag=20*log10(abs(h)); phase=180*angle(h)/pi; figure(1); plot(w,abs(h)); title('Butterworth Lowpass Filter'); xlabel('Normalised frequency'); ylabel('Magnitude'); grid; figure(2); subplot(2,1,1); plot(w,mag); title('Magnitude response'); xlabel('Normalised frequency'); ylabel('Magnitude in dB'); grid; subplot(2,1,2); plot(w,phase); title('Phase response'); xlabel('Normalised frequency'); ylabel('Phase in degrees'); grid;
Output
Enter Enter Enter Enter the the the the passband stopband passband stopband edge Normalised frequency = 0.3 edge Normalised frequency = 0.6 attenuation level (dB) = 3 attenuation level (dB) = 40
[h,w]=freqz(b,a); mag=20*log10(abs(h)); phase=180*angle(h)/pi; figure(1); plot(w,abs(h)); title('Chebyshev Lowpass Filter'); xlabel('Normalised frequency'); ylabel('Magnitude'); grid; figure(2); subplot(2,1,1); plot(w,mag); title('Magnitude response'); xlabel('Normalised frequency'); ylabel('Magnitude in dB'); grid; subplot(2,1,2); plot(w,phase); title('Phase response'); xlabel('Normalised frequency'); ylabel('Phase in degrees'); grid;
Output
Enter Enter Enter Enter the the the the passband stopband passband stopband edge Normalised frequency = 0.3 edge Normalised frequency = 0.6 attenuation level (dB) = 3 attenuation level (dB) = 40
C Programs
1. Linear Convolution
int m,n,i,j,x[30],y[30],h[30]; void main() { printf("Enter the length of x\n"); scanf("%d",&m); printf("Enter the length of h\n"); scanf("%d",&n); printf("Enter x\n"); for(i=0;i<m;i++) scanf("%d",&x[i]); printf("Enter h\n"); for(i=0;i<n;i++) scanf("%d",&h[i]); for(i=m;i<m+n-1;i++) x[i]=0; for(i=n;i<m+n-1;i++) h[i]=0; for(i=0;i<m+n-1;i++) { y[i]=0; for(j=0;j<=i;j++) y[i]+=x[j]*h[i-j]; } printf("Linear convolution, y is "); for(i=0;i<m+n-1;i++) printf("%d ",y[i]); }
Output
Enter the length of x 4 Enter the length of h 2 Enter x 1 2 3 4 Enter h 2 1 Linear convolution, y is 2 5 8 11 4
2. Circular Convolution
int m,n,i,j,k,x[30],y[30],h[30],a[30],b[30]; void main() { printf("Enter the length of x\n"); scanf("%d",&m); printf("Enter x\n"); for(i=0;i<m;i++) scanf("%d",&x[i]); printf("Enter h\n"); for(i=0;i<n;i++) scanf("%d",&h[i]); a[0]=h[0]; for(i=1;i<m;i++) a[i]=h[m-i]; y[0]=0; for(i=0;i<m;i++) y[0]+=x[i]*a[i]; for(k=1;k<m;k++) { y[k]=0; b[0]=a[n-1]; for(i=1;i<m;i++) b[i]=a[i-1]; for(i=0;i<m;i++) a[i]=b[i]; for(j=0;j<m;j++) y[k]+=x[j]*a[j]; } printf("Circular convolution, y is "); for(i=0;i<m;i++) printf("%d ",y[i]); }
Output
Enter the length of x 4 Enter x 1 2 3 4 Enter h 2 1 2 1 Circular convolution, y is 14 16 14 16
3. N-Point DFT
#include <stdio.h> #include <math.h> void main() { int i,j,n; short N; short x[10]; float pi=3.1416; float sumRe,sumIm; float cosine=0,sine=0; float out_real[10]={0.0},out_image[10]=(0.0); printf("Enter the length of the sequence\n"); scanf("%d",&n); printf("Enter N\n"); scanf("%d",&N); printf("Enter x\n"); for(i=n+1;i<N;i++) scanf("%d",&x[i]); if(N>n) for(i=n;i<N;i++) x[i]=0; printf("N point DFT is\n"); for(i=0;i<N;i++) { sumRe=0; sumIm=0; for(j=0;j<N;j++) { cosine=cos(2*pi*i*j/N); sine=sin(2*pi*i*j/N); sumRe+=x[j]*cosine; sumIm+=x[j]*sine; } out_real[i]=sumRe; out_imag[i]=sumIm; printf("%.1f +j(%.1f)\n",out_real[i],out_imag[i]); } }
Output
Enter the length of the sequence 4 Enter N 4 Enter x 1 2 3 4 N point DFT is 10.0 +j(0.0) -2.0 +j(-2.0) -2.0 +j(-0.0) -2.0 +j(2.0)