Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| learn:courses:unit-7-lab7a:start [2017/03/20 20:27] – created Martha | learn:courses:unit-7-lab7a:start [2022/10/04 11:38] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Lab 7a: Digital Signal Generator ====== | ====== Lab 7a: Digital Signal Generator ====== | ||
| + | [[{}/ | ||
| === Download This Document === | === Download This Document === | ||
| - | * {{ : | + | {{ : |
| + | |||
| + | |||
| + | ===== 1. Objectives ===== | ||
| + | - Use a programmable IIR filter to generate a single frequency sine wave. | ||
| + | - Use PWM to generate an audible output tone over the Basys MX3 speaker. | ||
| + | - Display the frequency of the synthesized sine wave on the LCD and 7-segment display. | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 2. Basic Knowledge ===== | ||
| + | - [[http:// | ||
| + | - [[http:// | ||
| + | - How to display text on a character LCD | ||
| + | - How to display numbers on the 4-digit 7-segment display | ||
| + | - [[http:// | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 3. Equipment List ===== | ||
| + | ==== 3.1. Hardware ==== | ||
| + | - [[https:// | ||
| + | - Workstation computer running Windows 10 or higher, MAC OS, or Linux | ||
| + | - [[https:// | ||
| + | |||
| + | In addition, we suggest the following instruments: | ||
| + | - [[https:// | ||
| + | |||
| + | |||
| + | ==== 3.2. Software ==== | ||
| + | The following programs must be installed on your development work station: | ||
| + | - [[http:// | ||
| + | - [[http:// | ||
| + | - [[http:// | ||
| + | - [[https:// | ||
| + | - [[http:// | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 4. Project Takeaways ===== | ||
| + | - How to implement digital filters in C using a PIC32 microprocessor. | ||
| + | - How to use the PIC32 processor to make a signal generator. | ||
| + | - How to create analog output using pulse-width modulation. | ||
| + | - How to use change frequency of synthesized signals. | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 5. Fundamental Concepts ===== | ||
| + | ==== 5.1. IIR Digital Filters ==== | ||
| + | As introduced in Unit 7, an infinite impulse response (IIR) digital filter can be mathematically expressed by Eq. 5.1 below. Zeros of the transfer function, H(z), are the roots of the numerator polynomial. Poles of the transfer function are the roots of the denominator polynomial. We will use specific placement of the poles and zeros to cause the output to ring or oscillate indefinitely at specific frequencies. | ||
| + | |||
| + | $$H(z) = \frac{Y(z)}{X(z)} = \frac{\sum_{i=0}^{M-1} b_i \cdot z^{-i}}{\sum_{k=0}^{N-1} a_k \cdot z^{-k}} = \frac{b_0 + b_1 \cdot z^{-1} b_2 \cdot z^{-2} + \cdots b_{M-1} \cdot z^{-M-1}}{a_0 + a_1 \cdot z^{-1} a \cdot z^{-1} + \cdots a_{N-1} \cdot z^{-N-1}} \qquad (\text{Eq. 5.1})$$ | ||
| + | |||
| + | From a table of [[http:// | ||
| + | |||
| + | $$H(z) = \frac{\sin(2 \pi f_0 /F_s) \cdot z^{-1}}{1-2 \cdot \cos \bigg( \frac{2 \pi f_0}{F_s} \bigg) \cdot z^{-1} + z^{-2}} = \frac{Z_1 \cdot z^{-1}}{(1-p_0 \cdot z^{-1}) \cdot (1-p_1 \cdot z^{-1})} \qquad (\text{Eq. 5.2})$$ | ||
| + | |||
| + | ==== 5.2. The Z-plane Unit Circle ==== | ||
| + | The z plane is a [[https:// | ||
| + | |||
| + | $$p_{0,1} = r_i \cdot e^{\pm j0_i} \qquad (\text{Eq. 5.3})$$ | ||
| + | |||
| + | {{ : | ||
| + | //Figure 5.1. Complex poles plotted on the z-plane for the 7500 Hz sine wave oscillator.// | ||
| + | |||
| + | It is beneficial to understand how the [[https:// | ||
| + | |||
| + | In contrast, poles on the unit circle cause the denominator of the transfer function to equal zero, hence the output of the filter will be infinite and it will oscillate indefinitely when excited at the frequency, ω, corresponding to the angle Θ. Poles outside the unit circle indicate that the filter is unstable and the amplitude of the oscillations will increase toward infinity. Poles just inside the unit circle will cause the filter to oscillate; however, the amplitude is bounded (fixed maximum). We will take advantage of this characteristic to make the eight oscillators used in Lab 7a. | ||
| + | |||
| + | The poles in Fig. 5.1 are those represented by blue X’s and the zeros by red circles. Note that the poles and zeros that do not lie on the real axis exist in complex conjugate pairs. The z-plane frequency, ω, relates to the real-world signal frequency by noting that ω = π for f = the Nyquist rate, which is half of the sampling rate in samples per second. | ||
| + | |||
| + | ==== 5.3. An IIR Digital Oscillator ==== | ||
| + | Although as References 6 and 7 prove the recursive filter signal generation using the fixed point math approach is not novel, it does offer significant memory and computational efficiency over the commonly used [[https:// | ||
| + | |||
| + | From the previous discussion, we can generate an oscillator of any frequency between zero and half the sampling frequency by using Eq. 5.2, or by placement of the poles in Eq. 5.3. In either case, the desired oscillator transfer function is computed using Eq. 5.4. Since the input to the digital filter is a unit impulse, it only exists for the computation of the y[1] output, which can be set as the digital filter initial condition without the need for an input signal at all. | ||
| + | |||
| + | $$y[ n ] = -a_1 \cdot y [ n-1 ] - a_2 \cdot y [ n-2 ], \quad \text{with} \quad a_1 = -\cos \bigg( \frac{2\pi F_0}{Fs} \bigg), a_2 = 1, y [ 1 ] = \sin \bigg( \frac{2\pi F_0}{Fs} \bigg) , \quad \text{and} \quad y [ 0 ] = 0, \quad \text{for} | ||
| + | \quad n > 1 \qquad (\text{Eq. 5.4})$$ | ||
| + | |||
| + | The C program functions shown in Appendix A provide code to create a sine wave at 5000 Hz. Listing A.1 defines the global constants and declares the public functions and variables. Listing A.2 initializes the audio output for the defined 5000 Hz oscillator and is called from the main function infinite loop. The filter coefficients for the default 5000 Hz IIR filter are configured here for convenience. The variable // | ||
| + | |||
| + | Listing A.3 provides for the capability to generate different frequencies using a common IIR filter algorithm shown in Listing A.4. Since the oscillator is started with an impulse input, the outputs are initialized to start with the pre-computation of y[n-1], as shown in Eq. 5.4. The function in Listing A.3 is called to start the oscillator output. | ||
| + | |||
| + | The function shown in Listing A.4 is called from the Timer 2 ISR shown in Listing A.5 at the PWM period rate if the // | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | |||
| + | ===== 6. Problem Statement ===== | ||
| + | You are to create a digital sine wave generator capable of synthesizing eight constant amplitude signals at frequencies specified in Section 8.1. The frequency of the sine waves will be selected by setting one of the eight slide switches. The audible output will be enabled and the frequency displayed on the 4-digit 7-segment display for five seconds when BTND is pressed. The LCD will display the frequency of the selected sine wave. | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 7. Background Information ===== | ||
| + | See the discussion of IIR filters in section 6.3.2. of the Unit 7 text. | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 8. Lab 7a ===== | ||
| + | The objective for this lab is to create a programmable digital oscillator as modeled in Fig. 8.1. | ||
| + | |||
| + | ==== 8.1. Requirements ==== | ||
| + | - The peripheral bus clock is to use a divisor of 1 (set in config_bits.h). | ||
| + | - The PWM period is to be set for 160000 Hz. (This PWM period was selected to take advantage of the analog low-pass filtering of the PWM output to produce a clean sine wave shown in Fig. 8.4.) | ||
| + | - The eight Basys MX3 slide switches are set to generate a single frequency tone as listed in Table 8.1. | ||
| + | - When BTND is not pressed, the LCD will display as shown in Fig. 8.2. | ||
| + | - When BTND is pressed, the LCD will display as shown in Fig. 8.3 and output the tone selected for 5 seconds. | ||
| + | - The frequency of the 8 synthesized tones are to be measure using the Analog Discovery 2, as shown in Fig. 8.4, and added to Table 8.1 as shown below. The analog signal trace shown in Fig. 8.4 was captured using the MIC analog input. No code is required because the MIC on the Basys MX3 board is picking up the speaker audio. The amplitude of the signals you capture may differ from Fig. 8.4 because of the MIC Volume and Speaker Volume potentiometer settings. | ||
| + | - Record amplitudes of the sine wave for the 8 tones without modifying the MIC Volume and Speaker Volume settings. | ||
| + | - Record the 8 sets of filter constants for the frequencies listed in Table 8.1. | ||
| + | |||
| + | {{ : | ||
| + | //Figure 8.1. Block diagram for Lab 7a.// | ||
| + | |||
| + | **Table 8.1. Frequency Select.** | ||
| + | ^ On Switch | ||
| + | | | | a0 | a1 | a2 | | ||
| + | | SW0 | 500Hz | ||
| + | | SW1 | 1500Hz | ||
| + | | SW2 | 2500Hz | ||
| + | | SW3 | 3500Hz | ||
| + | | SW4 | 4500Hz | ||
| + | | SW5 | 5500Hz | ||
| + | | SW6 | 6500Hz | ||
| + | | SW7 | 7500Hz | ||
| + | |||
| + | {{ : | ||
| + | //Figure 8.2. Tone Generator display when not generating tone.// | ||
| + | |||
| + | {{ : | ||
| + | //Figure 8.3. Tone Generator display when generating tone.// | ||
| + | |||
| + | {{ : | ||
| + | //Figure 8.4. Audio signal capture for a 4500 Hz synthesized signal.// | ||
| + | |||
| + | |||
| + | The control flow diagrams shown in Fig. 8.5 and Fig. 8.6 give an overview of an approach to this design. The code provided in Listings A.1 through A.5 can be used for the sine wave generator portion of Fig. 8.1. The Analog Electronics portion of Fig. 8.1 is provided on the Basys MX3 circuit board as shown in Fig. B.1 of Appendix B. | ||
| + | |||
| + | {{ : | ||
| + | //Figure 8.5. Main function control flow diagram.// | ||
| + | |||
| + | {{ : | ||
| + | //Figure 8.6. Timer 2 ISR.// | ||
| + | |||
| + | ==== 8.2. Design, Construction, | ||
| + | In previous labs, steps were laid out to lead the student through effective design, construction, | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 9. Questions ===== | ||
| + | - Since the computed poles for the digital oscillator lie exactly on the unit circle, what affect do you expect truncation and round off errors to have on the oscillator output? | ||
| + | - How does the statistical integer rounding code used in the // | ||
| + | - Why is it preferable to synthesize a sine function rather than a cosine function? | ||
| + | - What precautions are necessary if a signal of more than one frequency is generated by adding outputs? | ||
| + | - What conclusion do you draw from the data recorded in Table 8.1? | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 10. References ===== | ||
| + | - Basys MX3 Trainer Board Reference Manual. | ||
| + | - [[http:// | ||
| + | - PIC32 Family Reference Manual, Timers Section 14: [[http:// | ||
| + | - Steven W. Smith, __The Scientist and Engineer’s Guide to Digital Signal Processing__, | ||
| + | - “Design of Digital Filters”, [[https:// | ||
| + | - “A Fixed-Point Recursive Digital Oscillator for Additive Synthesis of Audio”, T. Hodes, J. Hauser, J. Wawrzynek, A. Freed, and D. Wessel, [[http:// | ||
| + | - “An Implementation Method for Low Frequency Digital Oscillator”, | ||
| + | - The Synthesis of Sound by Computer, Section 4.2: Additive Synthesis, [[http:// | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Appendix A: Sine Wave Generator Software ===== | ||
| + | ==== Listing A.1. Definitions and Global Variable Declarations ==== | ||
| + | < | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | #define TONE | ||
| + | |||
| + | | ||
| + | { | ||
| + | int a0; | ||
| + | int a1; | ||
| + | int a2; | ||
| + | } ; | ||
| + | |||
| + | | ||
| + | |||
| + | // Public functions | ||
| + | void audio_init(void); | ||
| + | void start_tones(int tone); | ||
| + | |||
| + | // Global variables | ||
| + | static filter tone_filter; | ||
| + | static filter filt_f1; | ||
| + | int tones_active = FALSE; // Generate output control | ||
| + | static int y[3] = {0}; // Filter output array | ||
| + | </ | ||
| + | |||
| + | ==== Listing A.2. Initialize Audio Output ==== | ||
| + | < | ||
| + | void audio_init(void) | ||
| + | { | ||
| + | // H(z) = z(sin(wo*T)) / (z^2 - 2*z*cos(wo*T) + 1) | ||
| + | |||
| + | float w; | ||
| + | w = ((float) (TONE * pi2)) / PWM_CYCLE_RATE; | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | |||
| + | // Initialize PWM output following the procedure used for Lab 6a but use RB14 | ||
| + | // for Output Compare Channel 1 | ||
| + | // Set the PWM period for PWM_CYCLE_RATE | ||
| + | // Initialize PWM output for 50% duty cycle | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Listing A.3. Initialize Tone Filter ==== | ||
| + | < | ||
| + | void start_tones(int tone) | ||
| + | { | ||
| + | | ||
| + | | ||
| + | | ||
| + | y[0] = tone_filter.a0; | ||
| + | y[1] = 0; | ||
| + | y[2] = 0; | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Listing A.4. Tone Generating IIR Filter ==== | ||
| + | < | ||
| + | static void gen_tones(void) | ||
| + | { | ||
| + | int pwm; | ||
| + | |||
| + | // Oscillator IIR filter | ||
| + | y[2] = y[1]; // Shift outputs and compute new output | ||
| + | y[1] = y[0]; | ||
| + | |||
| + | // Compute IIR result | ||
| + | y[0] = (tone_filter.a1 * y[1] - tone_filter.a2 * y[2]); | ||
| + | |||
| + | // Provide rounding function to avoid truncations due to Fixed Point math because of // division by Q14 that causes oscillations to die out. | ||
| + | | ||
| + | { | ||
| + | y[0] = y[0] - Q14/2; | ||
| + | } | ||
| + | | ||
| + | { | ||
| + | y[0] = y[0] + Q14/ | ||
| + | } | ||
| + | |||
| + | y[0] = y[0] / Q14; | ||
| + | |||
| + | // Compute new pwm output | ||
| + | pwm = (y[0] * PWM_MAX / Q14 ) + (PWM_MAX / 2); | ||
| + | |||
| + | // Limit output range for 0 the maximum PWM | ||
| + | | ||
| + | { | ||
| + | pwm = 0; | ||
| + | } | ||
| + | | ||
| + | { | ||
| + | pwm = PWM_MAX - 1 ; | ||
| + | } | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Listing A.5. Tone Generating Output Control ==== | ||
| + | < | ||
| + | void __ISR(_TIMER_2_VECTOR, | ||
| + | { | ||
| + | | ||
| + | | ||
| + | | ||
| + | } // End of Timer2Handler ISR | ||
| + | </ | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== Appendix B: Audio Output Hardware ===== | ||
| + | {{ : | ||
| + | //Figure B.1. Basys MX3 low-pass filter and audio amplifier.// | ||
| + | |||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | [[{}/ | ||
| + | [[{}/ | ||
| + | [[{}/ | ||

