Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
learn:courses:unit-7-lab7a:start [2017/03/29 23:16] – Martha | learn:courses:unit-7-lab7a:start [2021/10/13 22:16] (current) – Arthur Brown | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Lab 7a: Digital Signal Generator ====== | ====== Lab 7a: Digital Signal Generator ====== | ||
+ | [[{}/ | ||
=== Download This Document === | === Download This Document === | ||
- | * {{ : | + | {{ : |
===== 1. Objectives ===== | ===== 1. Objectives ===== | ||
- | | + | |
- | | + | |
- | | + | |
Line 14: | Line 15: | ||
===== 2. Basic Knowledge ===== | ===== 2. Basic Knowledge ===== | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
Line 25: | Line 26: | ||
===== 3. Equipment List ===== | ===== 3. Equipment List ===== | ||
==== 3.1. Hardware ==== | ==== 3.1. Hardware ==== | ||
- | | + | |
- | | + | |
- | | + | |
In addition, we suggest the following instruments: | In addition, we suggest the following instruments: | ||
- | | + | |
==== 3.2. Software ==== | ==== 3.2. Software ==== | ||
The following programs must be installed on your development work station: | The following programs must be installed on your development work station: | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
Line 45: | Line 46: | ||
===== 4. Project Takeaways ===== | ===== 4. Project Takeaways ===== | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
Line 82: | Line 83: | ||
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. | 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 \], \text{with} 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), \text{and} y \[ 0 \] = 0, \text{for} n > 1 \qquad (\text{Eq. 5.4})$$ | + | $$y[ n ] = -a_1 \cdot y [ n-1 ] - a_2 \cdot y [ n-2 ], \quad \text{with} |
+ | \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 // | 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 // | ||
Line 119: | Line 121: | ||
- Record the 8 sets of filter constants for the frequencies listed in Table 8.1. | - Record the 8 sets of filter constants for the frequencies listed in Table 8.1. | ||
- | {{ : | + | {{ : |
//Figure 8.1. Block diagram for Lab 7a.// | //Figure 8.1. Block diagram for Lab 7a.// | ||
Line 133: | Line 135: | ||
| SW6 | 6500Hz | | SW6 | 6500Hz | ||
| SW7 | 7500Hz | | SW7 | 7500Hz | ||
- | {{tag>reference | + | |
+ | {{ : | ||
+ | //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 ==== | ||
+ | <code> | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | #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 ===== | ||
+ | {{ :learn:courses:unit-7-lab7a: | ||
+ | //Figure B.1. Basys MX3 low-pass filter and audio amplifier.// | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | [[{}/ | ||
+ | [[{}/ | ||
+ | [[{}/ |