I've designed a simple FM communication system and found that high-frequency noise is a real problem. It appears that this is a well known issue, which has been solved through pre-emphasis of high frequencies at the transmitter and de-emphasis at the receiver.

The standard pre-emphasis filter appears to have the following form:

$$H_{pe}(f) = 1 + j2\pi f\tau_x, \quad \text{where } \tau = \rm75E-6$$

The de-emphasis filter is simply the inverse of that, or

$$H_{de}(f) = \frac{1}{1 + j 2\pi f\tau_x}.$$

I'm afraid I'm not much of an IIR filter designer, but from my research it appears to me that the de-emphasis filter is a relatively simple integrator, and that I can use the Impulse-Invariant method. The pre-emphasis filter, on the other hand, looks to be a bit tougher. Should I use a bilinear transform approach? When I tried to use the bilinear command in MATLAB it complained, presumably because there were no poles.

Any tips or hints would be greatly appreciated.

EDIT: The MATLAB command that I used was:

[z, p, k] = bilinear([j*2*pi*75e-6], [], 1, 20e3);

MATLAB (using version R2011b) returned:

Error using bilinear (line 100)
First two arguments must have the same orientation.
  • $\begingroup$ "it appears to me that the de-emphasis filter is a relatively simple integrator" Usually it's a shelving filter; you don't want infinite gain at DC. $\endgroup$ – endolith Apr 19 '17 at 18:17

You really can use any filter design scheme that you want. I can't think of any reason why you would need to use an IIR approach, exclusively, so you have a number of options. For FIR filters, you have choices like the frequency sampling and least squares methods (look at fir2 and firls in MATLAB).

For an IIR implementation, you should be able to use the bilinear transform straightforwardly; since the filters you referenced are simple single-pole and single-zero ems, it's probably just as easy to work the math out by hand. One thing to remember is that you'll want to prewarp the frequency axis first to ensure that you get a good approximation across the passband of interest. It might help for you to provide any error that you were getting from MATLAB; the lack of poles shouldn't be problem.

Edit: A few things to address your comments:

  • I wouldn't say that firls, being a least-squares-based approach, is a step-wise approximation of a smooth curve. Yes, you provide a number of samples of the desired response to the least-squares algorithm, but you should still get a smooth curve out.

  • I started to work out the math on applying the bilinear transform to the pre-emphasis filter and came across a problem. Its frequenecy response is: $$ H_{pe}(f) = 1 + j2\pi f \tau_x $$ Noting that for the frequency response $H_{pe}(f)$, $s = j\omega = j 2 \pi f$: $$ H_{pe}(s) = 1 + s\tau_x $$ The bilinear transform maps the $j\omega$ axis in the $s$-plane to the unit circle of the discrete-time approximation's $z$-plane. So, we should be concerned about what happens to the transfer function as $s$ is allowed to vary along the entire imaginary axis. Note that: $$ \lim_{s \to \infty} H_{pe}(s) = \infty $$ This means that, for the discrete-time approximation generated by the bilinear transform, as the angular frequency $\omega \to \pm \pi$, the discrete-time filter's magnitude response will blow up to $\infty$, which is probably not what you want.

    This problem would present itself for any analog system whose transfer function has a larger-degree numerator than denominator. So it's probably justified why MATLAB issues the following error:

    >> [num, den] = bilinear([75e-6 1], 1, 100e3);
    Error using bilinear (line 69)
    Numerator cannot be higher order than denominator.

    (Note that in your example, you passed an empty vector for the denominator; instead, you should pass 1, since the denominator of the transfer function is unity)

So as it turns out, I'm not aware of any analog-mapping techniques that will definitely work for your application. I don't believe the impulse invariant method will work since the pre-emphasis filter isn't bandlimited. You could use one of the FIR design methods, an IIR least-squares technique (e.g. Berchin's frequency-domain least-squares (FDLS) algorithm), or perhaps look into the matched Z-transform method, which I'm not familiar with.

  • $\begingroup$ I thought about using firls but I'd rather not do a step-wise approximation of a smooth curve. At the risk of appearing dense, what would "work the math out by hand" look like for the zero-only case? I'll add the bilinear error information to the question. $\endgroup$ – Jim Clay Oct 23 '12 at 13:42
  • $\begingroup$ Since the filter is characterized by its frequency response, shouldn't I be able to take the inverse FFT of that to get its impulse response? $\endgroup$ – Jim Clay Oct 23 '12 at 15:27
  • $\begingroup$ That's essentially the frequency-sampling method (fir2 in MATLAB, I believe). Yes, you can approximate it over the bandwidth of your discrete-time filter in such a way. $\endgroup$ – Jason R Oct 23 '12 at 15:30
  • $\begingroup$ Ah, I thought that "Z" and "P" was supposed to be the zeros and poles, not the numerator and denominator polynomials. Anyway, it looks like fir2 is the way to go. Many thanks. $\endgroup$ – Jim Clay Oct 23 '12 at 15:58
  • $\begingroup$ There are a couple different forms of the function; there is a pole/zero format also. I assume they probably just don't handle the no-pole case like you guessed, for the reasons I described above. $\endgroup$ – Jason R Oct 23 '12 at 16:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.