EEC 281 - Homework/Project #3

Winter 2017

Work individually, but I strongly recommend working with someone in the class nearby so you can help each other when you get stuck, with consideration to the Course Collaboration Policy. Please send me email if something isn't clear and I will update the assignment. Changes are logged at the bottom of this page.


  1. [20 pts] Using matlab, write a function which calculates the minimum number of non-zero partial products needed to calculate the product of a number multiplied by a fixed number. Both +multiplicand and –multiplicand partial products are allowed. Consider positive and negative numbers with a resolution of 0.5 (e.g., 0, 0.5, 1.0, ...).

    If you would like to use your own algorithm, that's great. Otherwise, you might try coding an algorithm that works something like this:

    a) [15 pts] Write the described function in matlab.

    b) [5 pts] Assuming your function is called "numppterms", run the following bit of matlab code (a few points need fixing), and report the Total Sum for all numbers 0.5 – 100.00 .

       StepSize = 0.5;
       NumTermsArrayPos = zeros(1, 100/StepSize);    % small speedup if init first
       for k = StepSize : StepSize : 100,
          NumTermsArrayPos(k/StepSize) = numppterms(k);
       fprintf('Total sum for +0.5 - +100.00 = %i\n', sum(NumTermsArrayPos));
       figure(1); clf;
       plot(StepSize:StepSize:100, NumTermsArrayPos, 'x');
       axis([0 101 0 1.1* max(NumTermsArrayPos)]);
       xlabel('Input number');
       ylabel('Number of partial product terms');
  2. [30 pts] An FIR filter has the coefficients,
       coeff = [12   –41   219   466   219   –41   12];
    Assume the coefficients cannot be scaled larger, but they can be scaled smaller (up to 50% smaller) and the gain change can be compensated elsewhere. This implementation works with integers only, so round() scaled coefficients.

    a) [5 pts] How many partial products are necessary to implement the FIR filter with the given coefficients?

    b) [5 pts] See if a scaling for the coefficients exists such that the filter can be built with fewer partial products. Find the scaling that yields the minimum number of partial products.

    c) [5 pts] Turn in a plot of the number of required partial products vs. the scaling factor. The plot should look something like the bogus results this matlab code generates.

       figure(1); clf;
       plot(0.5:0.001:1.0, round(5* rand(1,501)+1), 'x');
       axis([0.45 1.05 0 6.5]);
       xlabel('Scaling factor');
       ylabel('Number of partial product terms');
       title('EEC 281, Hwk/proj 2, Problem 3, Plot of bogus results');
    d) [15 pts] Draw dot diagrams showing how the partial products would be added (include sign extension) for the optimized coefficients you found in (b), using the FIR architecture shown below and an 8-bit 2's complement input word. Use 4:2, 3:2, and half adders as necessary and no need to design the final stage carry-propagate adder.

  3. [50 pts] Design of an area-efficient low-pass FIR filter. The filter must meet the following specifications when its sample rate is 100 MHz.

    a) [10 pts] Write a matlab function lpfirstats(H) that takes a frequency response vector H (or a vector of filter coefficients) as an input and returns the four critical values listed above (passband ripple, etc.).

    b) [10 pts] Write matlab code which repeatedly calls lpfirstats(H) and finds the smallest area filter. There is no need to write a sophisticated optimization algorithm, just something reasonable that does more than simple coefficient scaling. For example, making small perturbations to the frequency and amplitude values that remez() uses such as using 0.01 and other small values instead of 0.00 in the stopband.
    It may be helpful to use the following matlab code. Remember that matlab vectors start at index=1 so H(1) is the magnitude at frequency=0.
           coeffs1   = remez(numtaps-1, freqs, amps);
           coeffs2   = coeffs1*scale;
           coeffs    = round(coeffs2);
           [H,W]     = freqz(coeffs);
           H_norm    = abs(H) ./ abs(H(1));
           [ripple, minpass, maxstoplo, maxstophi] = lpfirstats(H_norm);
      Assume area is:
             Total_num_partial_products + 2*Num_filter_taps
    c) [20 pts] i) List your smallest-area coefficients in your paper submission and in a matlab-readable vector in your electronic submission.

      ii) List the number of taps, number of required partial products, area estimate, and the attained values for the four filter criteria.

             Results from a previous year for a different filter show there is lots
             of room for optimization (absolute values vary greatly with different specifications):
             109 area, 31 taps,  47 PPs
             109 area, 31 taps,  47 PPs
             113 area, 33 taps,  47 PPs
             114 area, 33 taps,  48 PPs
             123 area, 33 taps,  57 PPs
             128 area, 34 taps,  60 PPs
             182 area, 55 taps,  72 PPs
             221 area, 59 taps, 103 PPs
             221 area, 59 taps, 103 PPs
             250 area, 61 taps, 128 PPs

    d) [10 pts] i) Include a paper copy of a plot by: plot_one_lpfir.m that may need updating to show the correct filter specifications.
      ii) Show a stem() plot of the filter's impulse response.

2017/02/23  Posted