Lab 1. The Fourier Transform Introduction In the Communication Labs you will be given the opportunity to apply the theory learned in Communication Systems. Since this is your first time to work in the Communications Lab, the intent of this experiment is to help you become familiar with the lab equipment and Communications Lab procedures. Purpose As a result of performing this lab, the student will understand • How to create signals using MatLab, • The relationship between the time and frequency domains as shown by performing Fourier analyses of assigned signals, The relationships between sampling rate, aliasing, signal reconstruction, pulse duty cycle, etc., and The differences between Fourier Transform, Discrete Fourier Transform, and Fast Fourier Transform. A secondary purpose of this lab is to introduce you to the tools and procedures that will be required for successful completion of the Communications Labs. The tools include MatLab, LabVIEW, PSpice (a simulation software), and the Lab test equipment. • • • Prelab In this lab you will examine the time and frequency domain representation of a signal using Matlab. Matlab provides the FFT, FFT2, IFFT, IFFT2 and FFTSHIFT functions for converting signals between the time and frequency domains. Templates for the files are available on the Communications Lab Web Site: www.utdallas.edu/~kamran/EE4250. The Read-Only files with .TEM extensions are the ones you are looking for. Rename them to <filename.m> and then, using Windows Explorer → files → properties, remove the Read-only attribute. To use these files, you will modify functions and variables, then observe the outputs. During the lab you will plot the signals in the time domain using MatLab. In your report, be sure to comment on your results. Make sure you provide a title for each plot, and properly label the x and y axes. An explanation of how to title and label graphs is given later in this procedure. As you plan to represent signals using MatLab, a key item to remember is that MatLab functions work on signals in discrete-time. As a result, you will use the DFT (Discrete Fourier Transform) rather than a continuous function Fourier Transform. You may want Lab 1-1 Rev. C to review the pages which discuss DFT in your Communications Systems text. Matlab uses the Fast Fourier Transform, or FFT, algorithm to implement the DFT. You will find information in the Matlab manual for more specific usage of commands. To learn how to use the fft function type >> help fft at the Matlab command line. FFT Discrete Fourier transform. FFT(X) is the discrete Fourier transform of vector X. If the length of X is a power of two, a fast radix-2 fast-Fourier transform algorithm is used. If the length of X is not a power of two, a slower non-power-of-two algorithm is employed. FFT(X,N) is the N-point FFT, padded with zeros if X has less than N points and truncated if it has more. If X is a matrix, the FFT operation is applied to each column. See also IFFT, FFT2, IFFT2, FFTSHIFT. Another useful command, especially after you have created many variables, is whos: Example: >> help whos MatLab will show the usage of built-in function “whos”: WHOS is a long form of WHO. It lists each variables in the current workspace, together with information about its size, density, complexity, etc. Finally, clear all purges all the variables you have assigned. Prelab1.1: Creating a sine wave 1) Generate a sine wave with a signal frequency, fo, of 1 Hz, and an amplitude of 1 volt peak to peak. A sinusoidal, real-valued signal, is described by three parameters: frequency, amplitude, and phase. The mathematical model of the signal in time is y ( t ) = A ⋅ sin( 2 pi ⋅ f o ⋅ t + φ ) , 0 ≤ t < T [sec] (1.1) where A is the amplitude, fo is the signal frequency in Hertz, t is the time, and φ is initial phase. Because MatLab creates waveforms from a series of discrete points, you must generate sufficient samples to make the waveform look like an analog signal. After the waveform is created, the plot command will display an analog-like plot from the discrete data points. Begin creating the sine wave by defining 100 data points over a period of 3 seconds: >> t = 0 : 3*1/100 : 3*(1-1/100) ; Lab 1-2 Rev. C Note: A semicolon prevents the vector from being echoed to the screen after you enter the command. Now you can create the sine wave. For this first sine wave, use fo = 1 [Hz], an initial phase of 0°, and amplitude of 1 volt peak-to-peak: >> yt = 4 * sin ( 2 * pi * t + 0 ); Plot will display the waveform you just created: >> plot ( t, yt ) The following two commands label the axes: >> xlabel ( 'time [sec]' ) >> ylabel ( 'amplitude [volt]' ) Finish the plot by providing a title: title ( '1 Hz Sine Wave' ) Now it's your turn. 2) Generate a sinusoidal signal with following definition: A = 10 Vpp, fo = 1000 Hz, sampling time Ts = 0.001 milliseconds, φ = π/4, starting time = 0, and ending time = 2 milliseconds. You can verify the number of data points by using the MatLab built-in functions size or length: >> size(t) or >> length(t) The time sequence is made regarding for the sampling time. Now you can generate a time sequence about the requirement for the array length: >> t = [0: 1000] / fs ; or t = linspace (0, 0.002, 1000 ) ; where fs is a sampling time for the time sequence. Find the value of the last element for the time sequence. Include a plot of this sine wave in your report. Prelab 1.2: The Frequency Spectrum of Sine wave . The mathematical model of a sampled (discrete valued) sine wave is y ( t ) = A ⋅ sin ( 2 pi ⋅ f o ⋅ n * Ts + φ ) for n = 0,1,2, ... , N-1 where , A defines its amplitude, fo its frequency, n is the sample number, φ defines the relative phase at n = 0, and N is the signal length 1) Generate a sine wave. Use the following values: Ts = 10 µsec, A = 5 Vpp, fo = 1000 Hz, and 0 ≤ t ≤ 2 msec. You will need to determine the number of data points by dividing the time period by the sampling time. Lab 1-3 Rev. C Add AWGN(Additive White Gaussian Noise) to the time domain signal in order to make the output more like the practical output of oscilloscope: >> y = A * sin ( 2*pi*fo*t )+ 0.2*randn ( 1, length ( t ) ); After you create y(t), plot the FFT of y(t), that is, Y(f). You will compare the time domain and frequency domain output of Matlab with those you observe in the lab. You can use a 512-point FFT for better resolution: >> Y = fft ( y, 512 ) ; >> plot ( Y ) You can see that a problem exists due to the fact that the output of the FFT function is a complex valued vector. MATLAB plots complex numbers on the two-dimensional complex plane, which is not the plot you are trying to generate. What is usually significant in communications is the magnitude of the frequency domain representation. You can plot the magnitude of the FFT by using MatLab's abs function: >> plot ( abs ( Y ) ) Matlab sets axes automatically unless a user defines them. To define the x- and y-axis in order to see the plot in detail: >> axis ( [ 0 20 0 1300 ] ) Now the graph looks like a frequency domain plot. However it still does not look like the sinc pulse that we would expect to see. This is because MATLAB presents frequency components from f = 0 to f = fs (i.e. from DC to the sampling frequency). However, we are used to seeing the plots range from f = -fs/2 to f = +fs/2. This problem can be overcome by using the fftshift function. To get help on this function type: >> help fftshift Plot the magnitude using the fftshift function to move the dc component to the center of the display: >> plot ( abs ( fftshift ( Y ) ) ) Now the plot is starting to look like the expected Fourier transform. However, the x-axis is still not correct. The x-axis should be scaled to display frequencies from -fs/2 to fs/2. Since the sample period is 10 µsec, the sample frequency is 100 KHz. Create a separate vector that contains frequencies (in units of KHz) for the x-axis as follows: >> L = length ( Y ) ; >> x = 100 * ( ( 0 : L-1 ) / L - .5 ) ; Try the plot again, but this time use the x-axis that you just created: >> plot ( x, fftshift ( abs ( Y ) ) ) This produces a plot of magnitude versus frequency. If you want the output to look more like the display you see with the oscilloscope, instead of using fftshift, you must define the x-axis in the following way: >> f = 100 * ( ( 0 : L/2-1 ) / L ) ; Lab 1-4 Rev. C >> Y = fft ( y, 512 ) ; >> plot ( f, abs ( Y ( 1 : L/2 ) ) To increase the resolution of FFTs, use zero padding. As you see in the usage of fft, Matlab make fft can implement zero padding. If the user defines a larger value than the length of the input signal, the function fft gives the FFT output of a zero padded input signal. This is explained in Appendix D. You can also use a logarithmic scale for the magnitude of spectra. To see the magnified data of magnitude: >> plot ( f, 20 * log10 ( abs ( Y ( 1 : L/2 ) ) ) ) 2) Generate the following signal and plot its frequency spectrum. Determine the appropriate sampling rate and find the significant signal frequency of the waveform from the FFT. y(t) = 1.5sin(2π*50*t) + 5cos(2π∗100∗t) + 3sin(2π*200*t) , 0 ≤ t ≤ 0.1 sec Prelab 1.3: The Frequency Spectrum of a pulse Unit impulse signal: x = [1 0 0 0 0 0 0 0] corresponds to mathematical definition: δ [n] = 1, = 0, n=0 n = 1, 2, ....., N-1 1) Using the Matlab built-in function fft to see DFTs, plot the magnitude of a DFT. The steps below illustrate how to plot the magnitude. Start by creating a vector x with N = 8 points. You do not need to take the frequency range for the x-axis into consideration when you plot the FFT of the impulse for this procedure. >> x = [1 0 0 0 0 0 0 0] ; >> plot ( x ) >> X = fft ( x ) ; >> X = fftshift ( X ) ; Use the Matlab function stem to display discrete data. If you just use the command plot, then the impulse looks like triangular pulse. >> plot ( abs ( X ) ) >> stem ( abs ( X ) ) 2) You can use the Matlab function ifft to reconstruct the time domain signal. The usage of ifft is similar to that of fft: >> X = fft ( x ) >> xi = ifft ( X ) >> stem ( real ( xi ) ) Note: Since there are both real and imaginary components in the FFT, you must specify that you want to graph the real part of xi. 3) Repeat steps 1) and 2) for input signals which are a) all ones: x=[11111111]; Lab 1-5 Rev. C b) shifted impulse: x=[00010000]; c) three point boxcar: x=[11100000]; d) symmetric boxcar: x=[11000011]; Then, observe the each signal output and compare the values of their FFT outputs. You can combine the plots into one graph. To create one plot for the time domain and frequency domain impulse response function use the function subplot. Subplot(m,n,p) or subplot(mnp) can be used to observe two plots in an easier way at the same time in Matlab: >> subplot ( 211 ) >> stem ( x ) >> subplot ( 212 ) >> stem (abs ( X ) ) For more information, type help subplot at Matlab command line. Note that here abs specifies the absolute value, or magnitude, of X. Prelab 1.4: The Frequency Spectrum of Rectangular Pulse 1) In this section of the prelab you will generate the FFT of rectangular wave pulses. Use the m-files that you created in Prelab 1.2 for this procedure. Find the FFTs of the rectangular waves using the same parameters as in Prelab 1.2. 2) Also plot FFTs for rectangular waves with non-symmetrical duty cycles: 20%, 35%, and 75%. Use one plane of the FFT to make the outputs look like those of oscilloscope. In your lab report, comment on the spectral harmonics created by varying the duty cycle. You may need to increase the resolution of your FFTs to be able to distinguish the differences caused by varying the duty cycle. Determine the distance between spectral harmonics. To see more spectral harmonics in the FFTs, you will need to increase the points calculated by the FFT, that is, the input value N for the function fft. 3) Reconstruct the signals using ifft: >> X = fft ( x ) ; >> xi = ifft ( X ) ; Since the output xi is complex value, you must view the real part of xi to be able to compare the re-created signal with the original time domain signal: >> plot ( t, real ( xi ) ) 4) Starting with the rectangular wave sequence, create a sequence with a sampling rate of 32 points per symbol period. a) Generate two complete cycles of the sequence so that you can see two pulses. Find the FFT of this sequence. Lab 1-6 Rev. C b) c) d) e) 5) Reduce the sampling rate to 16 points per period. Find the FFT of this sequence. Reduce the sampling rate 8 and 4 points per period and plot the FFTs of these signals. Reconstruct each of the above FFTs using IFFT. Use stem to plot each of the reconstructed signals. Compare the plots of the reconstructed signals and explain the differences you observe between them. Repeat step 4) for the sine wave that you generated for prelab 2.1, changing the sampling time as explained below. Complete this procedure after you generate a sine wave of the 64 data points for one cycle. >> newy1 = y ( 1:2:128 ) ; >> newy2 = y ( 1:4:128 ) ; >> newy3 = y ( 1:8:128 ) ; >> newy4 = y( 1:16:128 ) ; % 32-points for the first sequence % 16-points for the second sequence % 8-points for the third sequence % 4-points for the fourth sequence Lab 1-7 Rev. C Lab Parts required for this lab: No components required for Lab q 1.1. The spectrum of a sine wave, and the effect of aliasing (From the HP Product Note 54600-3: FFT Lab Experiments Notebook - reproduced by permission from Hewlett Packard.) 1. Connect the function generator to channel 1 of the oscilloscope. Select a 2 Vpp (i.e., 1 Vpp displayed on the function generator) sinusoidal signal with a frequency of 1 KHz. Use "Autoscale" to display the waveform. 2. Depress the "+/-" key on the oscilloscope and then select the "On" entry under the "Function 2" menu. This will display the FFT of the time-domain waveform. Next, eliminate the trace of the waveform from the screen by depressing the "1" key and then selecting "Off" under the "1" menu entry. Use the "Time/Div" control to select an effective sampling rate of 10 KSa/s (thousand samples per second). 3. Adjust the settings of the FFT. Select the "Menu" entry under the "Function 2" menu. Select the "FFT Menu" entry and then "Autoscale FFT". Record the frequency span under "Freq Span" of the displayed spectra. Explain the relationship between this value and the effective sampling rate. 4. Using the signal's generator frequency control, progressively increase the frequency of the signal to roughly 4 KHz, allowing the FFT display to stabilize at several points along the way. You should see the peak lobe of the FFT display move to the right as the signal frequency is increased. Using "Cursors" "Find Peaks", complete the following table: Frequency Generator frequency (KHz) Cursor f1 frequency (KHz) 1.0 2.5 4.0 5. Continue to slowly increase the sinusoid's frequency. Aliasing occurs as the frequency of the sinusoid exceeds 5 KHz. As the frequency is swept from 5 KHz to 10 KHz, the main-lobe moves to left on the display. As the sinusoid's frequency is swept from 10 KHz to 15 KHz, the main lobe moves to the right on the FFT display. Complete the following table: Frequency Generator frequency (KHz) Cursor f1 frequency (KHz) 6.0 7.5 9.0 11.0 12.5 14.0 Lab 1-8 Rev. C 6. Assuming ideal sampling and using the theoretical spectra of a sine wave, plot the spectra of the sampled waveform when its frequency is 2.5, 6, and 11 KHz and the sampling frequency is 10 KHz. What values would show the reading for cursor f1 when the frequency of the waveform is 53 KHz? 78 KHz? Create spectral plots to display your conclusions. 1.2 Analyzing square and rectangular waves. In this section you will create a square wave, and then observe changes in the output spectrum as the duty cycle of the square wave is changed. 1. Connect a 2 Vpp (actual value) square wave with a frequency of 10 KHz to channel 1 of the oscilloscope. Use "Autoscale" to display the waveform. 2. Activate the FFT function and turn off channel 1 as in step 2 of the previous section. Use the "Time/Div" knob to select a sampling rate of 500 KSa/s. Autoscale the FFT as described in step 3 of section 2.1. Notice that the amplitude of the spectral lines decreases monotonically. 3. Decrease the sampling rate to 200 KSa/s. At this point you should see 5 spectral lines. Using "Cursors" and "Find Peaks" determine: f1 frequency (KHz) f2 frequency (KHz) ∆ frequency (KHz) 4. When the duty cycle is changed from 50% (square wave), the signal becomes a periodic pulse instead of a square wave form, causing the envelope of the spectra to take on the shape of the sinc function. On the function generator, change the duty cycle of the signal to 20% by depressing the keys "Shift" "Offset" and then either by rotating the knob or by entering the number using "Enter Number". 5. Notice that the amplitude of the spectral components is no longer decreasing monotonically, and that there is a gap between the fourth and fifth spectral lines. Using "Cursors" and "Find Peaks", complete the table: f1 frequency (KHz) f2 frequency (KHz) ∆ frequency (KHz) Also, determine the frequency which corresponds to the missing pulse, i.e., which would occur in the separation between the fourth and fifth spectral lines. Select both f1 f2 as active cursors (both will highlighted), then adjust f1 to coincide with the fourth spectral line. f2 will be at the frequency of the missing component. Lab 1-9 Rev. C 6. Repeat step 5, with the duty cycle set to 25%. Notice that the number of spectral lines between gaps has changed. What is the relationship between the frequency of the missing spectral line, the period of the square wave, and the duty cycle of the square wave? 7. Repeat step 5 with the duty cycle set to 75%. Compare these results with those obtained in steps 5 and 6. Explain the results you observed. 8. Calculate the frequencies of the mission spectral lines for a duty cycle of 40%? Verify your answer by displaying the FFT on the oscilloscope. Hint: Recall that the envelope of the spectrum must be sinc shaped, and observe the display carefully. Report In this lab you analyzed sine and square/rectangular waves in the time domain and in the frequency domain. You also observed aliasing. 1. Answer the questions from the Lab and the Prelab. 2. Define a rule for preventing/detecting aliasing Don't forget to turn in a diskette containing your Matlab equations with your lab report. Lab 1-10 Rev. C