# Real-World Signals and Systems Case: Solving the DAC ZOH Droop Problem in the *z*-Domain

The zero-order-hold (ZOH), which is inherent in many digital-to-analog converters (DACs), holds the analog output constant between samples. The action of the ZOH introduces *fr**e**que**n**cy droop,* a roll off of the effective DAC frequency response on the frequency interval zero to one-half the sampling rate *f** _{s}*, in reconstructing

*y*(

*t*) from

*y*[

*n*]. Two possible responses are to

Apply an inverse sinc function shaping filter in the continuous-time domain.

Correct for the droop before the signal emerges from the DAC.

The system block diagram is shown here.

Imagine that a senior engineer asks you to investigate the effectiveness of the simple infinite impulse response (IIR) and finite impulse response (FIR) digital filters as a way to mitigate ZOH frequency droop. You need to verify just how well these filters really work. The filter system functions are

To solve this problem, you need to use the frequency-domain relationship from the discrete- to continuous-time domains. The relationship, relative to the notation of the figure, is

You can assume that the analog reconstruction filter removes signal spectra beyond *f** _{s}*/2.

The frequency response of interest turns out to be the cascade of

Follow these steps to justify this outcome:

Let

From the convolution theorem for frequency spectra in the discrete-time domain, get

Use the discrete to continuous spectra relationship to discover that the output side of the DAC is

Use the convolution theorem for frequency spectra in the continuous-time domain to push the DAC output spectra through the ZOH filter:

The cascade result is now established.

To view the equivalent frequency response for this problem in the discrete-time domain, you just need to change variables according to the sampling theory:

Rearranging the variables in the cascade result viewed from the discrete-time domain perspective is

The ZOH frequency response is

Putting the pieces together and considering only the magnitude response reveals this equation:

To verify the performance, evaluate the sinc function and the FIR responses by using the SciPy signal.freqz() function approach of the frequency domain recipe. Check out the results in the following figure.

In [393]: w = linspace(0,pi,400) In [394]: H_ZOH_T = sinc(w/(2*pi)) In [395]: w,H_FIR = signal.freqz(array([-1, 18,-1])/16.,1,w) In [396]: w,H_IIR = signal.freqz([-9/8.],[1, 1/8.],w) In [402]: plot(w/(2*pi),20*log10(abs(H_ZOH_T))) In [403]: # other plot cammand lines similar In [412]: plot(w/(2*pi),20*log10(abs(H_FIR)*abs(H_ZOH_T)))

These results are quite impressive for such simple correction filters. The goal is to get flatness that’s near 0 dB from 0 to π rad/sample (0 to 0.5 normalized). The response is flat to within 0.5 dB out to 0.4 rad/sample for the IIR filter; it’s a little worse for the FIR filter.