Digital filter coefficients from low-pass to high-pass

Given I have coefficients a0, a1, a2, b1, and b2, defining the difference equation for a digital filter as:

y[n] = a0 * x[n] + a1 * x[n - 1] + a2 * x[n - 2] - b1 * y[n - 1] - b2 * y[n - 2]

Which defines a low-pass filter with particular cutoff frequency, how can I obtain the coefficients A0, A1, A2, B1, B2, which similarly define a high-pass filter with the same cutoff frequency? I'm aware there are so-called "bandform transformations" for converting a prototype low-pass into a high-pass, but to my knowledge, these are not directly applicable to discrete-time/digital filters, so I am unaware of any way to apply them to this problem.

If these coefficients are derived from a complex-conjugate pair of zeros and/or of poles given the discrete transfer function for the low-pass filter would be:

H(z) = (z - Zero[0]) * (Z - Zero[1])/[(Z - Pole[0]) * (Z - Pole[1])]

Is there then a way to transform this function to the corresponding high-pass filter I'm looking for to get the poles and zeros from the new transfer function?

You can apply a so-called all-pass transformation to a discrete-time low-pass prototype filter in order to convert it to other standard filters (such as high-pass, band-pass, and band-stop). This is accomplished by transforming the complex variable $$z$$ in the transfer function of the prototype filter by a function $$G(z)$$ which satisfies $$|G(e^{j\omega})|=1$$, i.e., $$G(z)$$ is an all-pass function. This makes sure that the transformation maps the unit circle onto itself, i.e., the frequency response of the new filter is just a shifted and/or warped version of the prototype frequency response.

The most straightforward way to transform a discrete-time low-pass filter to a high-pass filter is to use the trivial transform $$G(z)=-z$$, i.e.,

$$H_{HP}(z)=H_{LP}(-z)\tag{1}$$

If $$H_{LP}(z)$$ is given by

$$H_{LP}(z)=\frac{\displaystyle\sum_{k=0}^Nb[k]z^{-k}}{\displaystyle 1+\sum_{k=1}^{N}a[k]z^{-k}}\tag{2}$$

then $$H_{HP}(z)$$ becomes

$$H_{HP}(z)=\frac{\displaystyle\sum_{k=0}^N(-1)^kb[k]z^{-k}}{\displaystyle 1+\sum_{k=1}^{N}(-1)^ka[k]z^{-k}}\tag{3}$$

This transformation shifts the low-pass frequency response by $$\pi$$ (i.e., by half the sampling frequency). Consequently, if $$\omega_c$$ is the cut-off frequency of the low-pass prototype filter, the cut-off frequency of the resulting high-pass filter is given by $$\omega'_c=\pi-\omega_c$$.

Other cut-off frequencies can be obtained by applying the more general lowpass-to-highpass transformation

$$G(z)=-\frac{z+\alpha}{1+\alpha z},\qquad |\alpha|<1\tag{4}$$

The simple transformation shown above is obtained from $$(4)$$ by the choice $$\alpha=0$$.

This and other frequency transformations applicable to discrete-time filters are treated in some detail in Chapter $$7.4$$ of the third edition of Oppenheim and Schafer's Discrete-Time Signal Processing.

Also take a look at these related questions and their answers: Q1, Q2.

• +1 FYI, your filter explanations are exceedingly helpful to me as I delve into this area of DSP. Thanks. – Cedron Dawg Jul 29 '20 at 18:54