Posts

Aktualisieren älterer Designs basierend auf analogen Filtern

Analoge Filter gibt es seit den Anfängen der Elektronik. Angefangen von einfachen Induktor-Kondensator-Netzwerken bis hin zu fortschrittlichen aktiven Filtern mit Operationsverstärkern. Daher gibt es eine umfangreiche Sammlung von bewährter Legacy-Filterdesigns für eine breite Palette von Sensormessanwendungen. Mit den Leistungsanforderungen moderner IoT (Internet of Things) -Sensormessanwendungen und niedrigerer Produktkosten werden jedoch digitale Filter, die in den Applikationscode des Mikrocontrollers integriert sind, zur Norm. Wie können wir das Beste aus beiden Welten erhalten??

Anstatt das Rad neu zu erfinden, können Produktdesigner eine bestehende analoge Filterübertragungsfunktion nehmen, sie in eine digitale Form umwandeln (über eine Transformation) und sie als digitalen Filter in einem Mikrocontroller oder DSP (digitaler Signalprozessor) implementieren. Obwohl es Analog-Digital-Transformationen schon seit Jahrzehnten gibt, war die Verfügbarkeit von DSP-Design-Tools für die Optimierung des “transformierten digitalen Filters” etwas begrenzt, was den Design- und Validierungsprozess behinderte.
Ein analoges Tiefpassfilter 2. Ordnung ist unten abgebildet, und in seiner einfachsten Form sind nur 5 Komponenten zum Aufbau des Filters erforderlich, was einfach klingt. Oder?

Die Vorteile

Der offensichtlichste Vorteil ist, dass analoge Filter eine hervorragende Auflösung haben, da es keine “Anzahl von Bits” zu berücksichtigen gibt. Analoge Filter haben gute EMV-Eigenschaften (elektromagnetische Verträglichkeit), da es kein takterzeugendes Rauschen gibt. Es gibt keine Aliasing-Effekte, was sicherlich für die einfacheren Operationsverstärker gilt, die keine ausgefallenen Chopping- oder Auto-Kalibrierungsschaltungen eingebaut haben, und analoge Designs können billig sein, was für kostensensitive Anwendungen großartig ist.

Klingt gut, aber was ist die schlechte Nachricht?

Analoge Filter haben einige signifikante Nachteile, die die Filterleistung beeinflussen, wie z. B. die Alterung der Komponenten, Temperaturdrift und Komponententoleranz. Außerdem erfordert eine gute Leistung gute Fähigkeiten im Analogdesign und ein gutes PCB-Layout (Printed Circuit Board), was auf dem heutigen Qualifikationsmarkt schwer zu finden ist.

Diese Nachteile machen digitale Filter viel attraktiver für moderne Anwendungen, die eine hohe Wiederholbarkeit der Eigenschaften erfordern. Zum Beispiel: Nehmen wir an, Sie wollen nach der Optimierung Ihres Filterdesigns 1000 Messmodule herstellen. Mit einer digitalen Lösung können Sie sicher sein, dass die Leistung Ihres Filters in allen Modulen identisch ist. Bei einer analogen Lösung ist dies sicherlich nicht der Fall, da Komponententoleranz, Komponentenalterung und Temperaturdrift dazu führen, dass das Filter jedes Moduls seine eigenen Eigenschaften hat. Außerdem bleibt der Frequenzgang eines analogen Filters fest, d.h. ein Butterworth-Filter ist immer ein Butterworth-Filter – jede Änderung des Frequenzgangs würde einen physischen Austausch von Komponenten auf der Leiterplatte erfordern – nicht ideal!

Digitale Filter sind adaptiv und flexibel. Wir können ein Filter mit einem beliebigen Frequenzgang entwerfen und implementieren, es einsetzen und dann die Filterkoeffizienten aktualisieren, ohne etwas auf der Leiterplatte zu ändern! Es ist auch einfach, digitale Filter mit linearer Phase und sehr niedrigen Abtastfrequenzen zu entwerfen – zwei Dinge, die bei analogen Filtern schwierig sind.

Laplace zu diskreten/digitalen Transformationen

Bei den drei hier besprochenen Methoden geht es im Wesentlichen darum, eine (analoge) Laplace-Übertragungsfunktion, \(H(s)\), in eine diskrete Übertragungsfunktion, \(H(z)\), zu transformieren. So dass ein bewährtes analoges Filter, das bereits in einem Design verwendet wird, auf einem Mikrocontroller oder DSP implementiert werden kann.

Eine Auswahl einiger nützlicher Laplace-zu-z-Transformationen finden Sie in der folgenden Tabelle:

\(
\begin{array}{ccc}\hline
H(s) &\longleftrightarrow & H(z) \\ \hline
1 &\longleftrightarrow & 1 \\
\frac{\displaystyle1}{\displaystyle s}
&\longleftrightarrow& \frac{\displaystyle 1}{\displaystyle 1-z^{\scriptstyle -1}}\\
\frac{\displaystyle 1}{\displaystyle s^{\scriptstyle 2}} &\longleftrightarrow& \frac{\displaystyle
Tz^{\scriptstyle-1}}{\displaystyle (1-z^{\scriptstyle -1})^2}\\
\frac{\displaystyle 1}{\displaystyle s+a}
&\longleftrightarrow&
\frac{\displaystyle 1}{\displaystyle 1-e^{-aT}z^{-1}}\\
\frac{\displaystyle 1}{\displaystyle (s+a)^2}
&\longleftrightarrow& \frac{\displaystyle z^{-1}(1-e^{-aT})}{\displaystyle a(1-z^{-1})(1-e^{-aT}z^{-1})}\\\hline
\end{array}
\)
A table of useful Laplace and z-transforms

Die bilineare z-Transformation (BZT)

Die Bilineare z-Transformation (BZT) wandelt einfach eine analoge Übertragungsfunktion \(H(s)\) in eine diskrete Übertragungsfunktion \(H(z)\) um, indem alle \(s\) -Terme durch die folgenden ersetzt werden:

\(\displaystyle
s=\frac{2}{T}\frac{1-z^{-1}}{1+z^{-1}} \label{bzt}\)

Dabei ist \(T\) die Abtastperiode des diskreten Systems. Ersetzt man jedoch \(s=j\Omega\) und \(z=e^{jwT}\) in die BZT-Gleichung ein und vereinfacht, stellt man fest, dass es tatsächlich eine nichtlineare Beziehung zwischen den analogen \(\Omega\)– und diskreten \(w\)-Frequenzen gibt. Diese Beziehung ist unten gezeigt und ist auf die Nichtlinearität der Arkustangensfunktion zurückzuführen.

\(\displaystyle
\omega=2\tan^{-1}\left(\frac{\Omega T}{2}\right)
\label{bzt_warp_def1}
\)

Bei der Analyse der Gleichung ist zu erkennen, dass die gleichmäßig verteilten analogen Frequenzen im Bereich \(-\infty<\Omega<\infty\) im Frequenzbereich \(-\pi<w<\pi\) im diskreten Bereich nichtlinear komprimiert sind. Diese Beziehung wird als Frequenzverzerrung bezeichnet und kann durch eine Vorverzerrung der analogen Frequenzen kompensiert werden:

\(\displaystyle
\Omega_c=\frac{2}{T}\tan\left(\frac{\Omega_d T}{2}\right)
\label{bzt_warp_def2}
\)

Dabei ist \(\displaystyle\Omega_c\) die kompensierte oder vorgewölbte analoge Frequenz und \(\displaystyle\Omega_d\) die gewünschte analoge Frequenz.

Der ASN FilterScript-Befehl \(\texttt{bilinear}\) kann verwendet werden, um eine Laplace-Übertragungsfunktion in ihr diskretes Äquivalent unter Verwendung der BZT-Transformation umzuwandeln. Ein Beispiel ist unten angegeben.

Die impulsinvariante Transformation

Die zweite Transformation wird als impulsinvariante Transformation (IIT) bezeichnet, da die Pole der Laplace-Übertragungsfunktion in ihre diskreten Äquivalente umgewandelt werden, so dass die diskrete Impulsantwort \(h(n)\) identisch mit einer regelmäßig abgetasteten Darstellung der analogen Impulsantwort ist (d. h. \(h(n)=h(nT)\), wobei \(T\) die Abtastrate und \(t=nT\))ist). Die IIT ist ein wesentlich aufwändigeres Transformationstechnik als die BZT, da die Laplace-Übertragungsfunktion vor der Anwendung der Transformation zunächst mit partiellen Brüchen erweitert werden muss.

Das Transformationsverfahren ist wie folgt definiert:

\(\displaystyle
\frac{K}{s+a} \quad\longrightarrow\quad
\frac{K}{1-e^{-aT}z^{-1}} \label{iit_def}
\)

Diese Methode leidet unter mehreren Einschränkungen, da sie die Transformation von Nullen oder einzelnen konstanten Termen (nach der Expansion) nicht zulässt und eine hohe Abtastrate haben muss, um die Effekte des spektralen Aliasing zu überwinden. In der Tat behindern die Effekte des Aliasing diese Methode erheblich, so dass die Methode nur verwendet werden sollte, wenn die Anforderung besteht, die Impulsantwort der analogen Übertragungsfunktion anzupassen, da das resultierende diskrete Modell ein anderes Betrags- und Phasenspektrum (Frequenzgang) als das des ursprünglichen analogen Systems haben kann. Folglich ist die impulsinvariante Methode für die Modellierung von Hochpassfiltern ungeeignet und daher auf die Modellierung von Tiefpass- oder Bandpassfiltern beschränkt.

Aufgrund der oben genannten Einschränkungen der IIT-Methode wird sie derzeit in ASN Filterscript nicht unterstützt.

Die Matched-z-Transformation

Ein weiteres Analogon zur diskreten Modellierungstechnik ist die Matched-Z-Transformation. Wie der Name schon sagt, wandelt die Transformation die Pole und Nullstellen aus der analogen Übertragungsfunktion direkt in Pole und Nullstellen in der z-Ebene um. Die Transformation wird im Folgenden beschrieben, wobei \(T\) die Abtastrate ist.

\(\displaystyle
\frac{\prod\limits_{k=1}^q(s+b_k)}{\prod\limits_{k=1}^p(s+a_k)}
\quad\longrightarrow\quad
\frac{\prod\limits_{k=1}^q(1-e^{-b_kT}z^{-1})}{\prod\limits_{k=1}^p(1-e^{-a_kT}z^{-1})}
\label{matchedz_def}
\)

Die Analyse der Transformationsgleichung zeigt, dass die transformierten Pole der z-Ebene identisch mit den Polen sind, die mit der impulsinvarianten Methode erhalten wurden. Es ist jedoch zu beachten, dass die Positionen der Nullstellen unterschiedlich sind, da die impulsinvariante Methode sie nicht transformieren kann.

Für diese Methode steht der ASN-Filterscript-Befehl \(\texttt{mztrans}\) zur Verfügung.

Ein ausführliches Beispiel

Um die Einfachheit der Transformation von analogen Filtern in ihre diskreten/digitalen Äquivalente mit Hilfe der Analog-Diskret-Transformation zu demonstrieren, folgt nun ein Beispiel für die Modellierung mit der BZT für ein analoges Tiefpassfilter 2ter Ordnung.

Ein verallgemeinertes analoges Tiefpassfilter 2. Ordnung ist gegeben durch:

\(\displaystyle
H(s)=\frac{w_c^2}{s^2+2\zeta w_c s + w_c^2}
\)

wobei \(w_c=2\pi f_c\) die Grenzfrequenz ist und \(\zeta\) die Dämpfung des Filters bestimmt, wobei ein \(\zeta=1/\sqrt{2}\) als kritisch gedämpft oder gleich -3dB bei \(w_c\) gillt. Viele Analog-Ingenieure entscheiden sich dafür, einen Qualitätsfaktor, \(Q =  \displaystyle\frac{1}{2\zeta}\) oder Peaking-Faktor für ihre Designs zu spezifizieren. Setzt man \(Q\) in \(H(s)\)ein, erhält man:

\(\displaystyle
H(s)=\frac{w_c^2}{s^2+ \displaystyle{\frac{w_c}{Q}s} + w_c^2}
\)

Bei der Analyse von \(H(s)\) fällt auf, dass \(Q=1/\sqrt{2} = 0.707\) ebenfalls zu einer kritisch gedämpften Reaktion führt. Verschiedene Werte von \(Q\) sind unten gezeigt und wie zu sehen ist, treten bei \(Q>1/\sqrt{2}\) peaking auf.

Prototypisches Magnituden Spektrum eines Tiefpassfilters 2. Ordnung für verschiedene Werte von Q:
Beachten Sie, dass bei \(Q>1/\sqrt{2}\) Peaking auftritt.

Bevor die BZT in ASN FilterScript angewendet wird, muss die analoge Übertragungsfunktion in einem analogen Filterobjekt angegeben werden. Der folgende Code richtet ein analoges Filterobjekt für den hier betrachteten Tiefpassprototyp 2:

Main()

wc=2*pi*fc;
Nb={0,0,wc^2};
Na={1,wc/Q,wc^2};

Ha=analogtf(Nb,Na,1,"symbolic"); // make analog filter object

Das Schlüsselwort \(\texttt{symbolic}\) kerzeugt eine symbolische Darstellung der Übertragungsfunktion im Befehlsfenster. Für eine Abtastrate von \(f_s=500Hz\) und \(f_c=30Hz\) und \(Q=0.707\), erhalten wir:

ASN FilterScript analoger Befehl

Anwendung der BZT mit den \(\texttt{bilinear}\) Befehl ohne Prewarping,

 Hd=bilinear(Ha,0,"symbolic"); 

Der vollständige Frequenzgang des transformierten digitalen Filters ist unten gezeigt, wobei zu sehen ist, dass bei \(30Hz\) der Betrag \(-3dB\) und die Phase \( -90^{\circ}\) beträgt, was wie erwartet ist. Beachten Sie auch, wie der Amplituden-Roll-Off des Filters durch das doppelte Nullpaar bei Nyquist beeinflusst wird (siehe das Diagramm der z-Ebene unten), was zu Unterschieden zu seinem analogen Cousin führt. Pole-zero chart 2nd order LPF

2nd order LPF

Die Pol-Null-Positionen können in ASN Filterscript oder über den interaktiven Pol-Null-Z-Ebenen-Plot-Editor des ASN Filter Designers mit der Maus verändert werden!

Implementierung

Der vollständige Code zum Umwandeln eines verallgemeinerten analogen Tiefpassfilter-Prototyps 2. Ordnung in sein digitales Äquivalent unter Verwendung der BZT über ASN FilterScriptist unten angegeben:


ClearH1;  // clear primary filter from cascade
interface Q = {0.1,10,0.02,0.707};
interface fc = {10,200,10,40};

Main()

wc=2*pi*fc;
Nb={0,0,wc^2};
Na={1,wc/Q,wc^2};

Ha=analogtf(Nb,Na,1,"symbolic"); // make analog filter object
Hd=bilinear(Ha,0,"symbolic"); // transform Ha via BZT into digital object, Hd

Num=getnum(Hd);
Den=getden(Hd);
Gain=getgain(Hd);

Download demo now

Licencing information

In recent years, major microcontroller IC vendors such as: ST, NXP, TI, ADI, Atmel/Microchip, Cypress, Maxim to name but a few have based their modern 32-bit microcontrollers on Arm’s Cortex-M processor cores. This exciting trend means that algorithms traditionally undertaken in expensive DSPs (digital signal processors) can now be integrated into a powerful low-cost and power efficient microcontroller packed full of a rich assortment of connectivity and peripheral options.

For many IC vendors, the coupling of DSP functionality with the flexibility of a low power microcontroller, has allowed them to offer their customers a generation of so called 32-bit enhanced microcontrollers suitable for a variety of practical applications. More importantly, this marriage of technologies has also allowed designers working on price critical IoT applications to implement complex algorithmic concepts, while at the same time keeping the overall product cost low and still achieving excellent low power performance.

Upgrading legacy analog filters with the ASN Filter Designer

Analog filters have been around since the beginning of electronics, ranging from simple inductor-capacitor networks to more advanced active filters with op-amps. As such, there is a rich collection of tried and tested legacy filter designs for a broad range of sensor measurement applications.

ASN’s FilterScript symbolic math scripting language offers designers the ability to take an existing analog filter transfer function and transform it to digital with just a few lines of code. The ASN Filter Designer’s Arm automatic code generator analyses the designed digital filter and then automatically generates Arm CMSIS-DSP compliant C code suitable for direct implementation a Cortex-M based microcontroller.

Arm CMSIS-DSP software framework

The Arm CMSIS-DSP (Cortex Microcontroller Software Interface Standard)  software framework is a rich collection of over sixty DSP functions (including various mathematical functions, such as sine and cosine; IIR/FIR filtering functions, complex math functions, and data types) developed by Arm that have been optimised for their range of Cortex-M processor cores. The framework makes extensive use of highly optimised SIMD (single instruction, multiple data) instructions, that perform multiple identical operations in a single cycle instruction. The SIMD instructions (if supported by the core) coupled together with other optimisations allow engineers to produce highly optimised signal processing applications for Cortex-M based micro-controllers quickly and simply.

Mathematically modelling an analog circuit

Consider the active pre-emphasis filter shown below. The pre-emphasis filter has found particular use in audio work, since it is necessary to amplify the higher frequencies of the speech spectrum, whilst leaving the lower frequencies unaffected. The R and C values shown are only indented for the example, more practical values will depend on the application.A powerful method of reproducing the magnitude and phases characteristics of the analog filter in a digital implementation, is to mathematically model the circuit. This circuit may be analysed using Kirchhoff’s law, since the sum of currents into the op-amp’s inverting input must be equal to zero for negative feedback to work correctly – this results in a transfer function with a negative gain.

Therefore, using Ohm’s law, i.e. \(I=\frac{V}{R}\),

\(
\displaystyle\frac{X(s)}{R_3}=-\frac{U(s)}{C_1||R_2 + R_1}
\)

After some algebraic manipulation, it can be seen that an expression for the circuit’s closed loop gain may be expressed as,

\(
\displaystyle\frac{X(s)}{U(s)}=-\frac{R_3}{R_1}\frac{\left(s+\frac{1}{R_2C_1}\right)}{\left(s+\frac{R_1+R_2}{R_1R_2C_1}\right)}
\)

substituting the values shown in the circuit diagram into the developed transfer function, yields

\(
\displaystyle H(s)=-10\left(\frac{s+1000}{s+11000}\right)
\)

What sampling rate do we need?

Analysing the cut-off frequencies in \(H(s)\), we see that the upper frequency is at \(11000 rad/sec\) or \(1.75kHz\). Therefore, setting the sampling rate to \(16kHz\) should be adequate for modelling the filter in the digital domain.

The sampling rate options are avaliabe in the main filter design UI  (shown on the left).

ASN FilterScript

\(H(s)\) can be easily specified in FilterScript with the analogtf function, as follows:

Nb={1,1000};
Na={1,11000};

Ha=analogtf(Nb,Na,-10,"symbolic");

Notice how the negative gain may also be entered directly into function’s argument. The symbolic keyword generates a symbolic transfer function representation in the command window.

Applying the Bilinear z-transformation via the bilinear command with no pre-warping, i.e.

Hd=bilinear(Ha,0,"symbolic");


Notice how the bilinear command automatically scales numerator coefficients by -1, in order to account for the effect of the negative gain. The complete code is shown below:

Main()

Nb={1,1000};
Na={1,11000};

Ha=analogtf(Nb,Na,-10,"symbolic");
Hd=bilinear(Ha,0,"symbolic");

Num=getnum(Hd);
Den=getden(Hd);
Gain=getgain(Hd);

A comparison of the analog and discrete magnitude and phase spectra is shown below. Analysing the spectra, it can be seen that for a sampling rate of 16kHz the analog and digital filters are almost identical! This demonstrates the relative ease with which a designer can port their existing legacy analog designs into digital.

Automatic code generation to Arm Cortex-M processors

As mentioned at the beginning of this article, the ASN filter designer’s automatic code generation engine facilitates the export of a designed filter to Cortex-M Arm based processor cores via the CMSIS-DSP software framework. The tool’s built-in analytics and help functions assist the designer in successfully configuring the design for deployment.

Before generating the code, the H2 filter (i.e. the filter designed in FilterScript) needs to be firstly re-optimised (transformed) to an H1 filter (main filter) structure for deployment. The options menu can be found under the P-Z tab in the main UI.

All floating point IIR filters designs must be based on Single Precision arithmetic and either a Direct Form I or Direct Form II Transposed filter structure. The Direct Form II Transposed structure is advocated for floating point implementation by virtue of its higher numerically accuracy.

Quantisation and filter structure settings can be found under the Q tab (as shown on the left). Setting Arithmetic to Single Precision and Structure to Direct Form II Transposed and clicking on the Apply button configures the IIR considered herein for the CMSIS-DSP software framework.

Arm CMSIS-DSP application C code

Select the Arm CMSIS-DSP framework from the selection box in the filter summary window:

The automatically generated C code based on the CMSIS-DSP framework for direct implementation on an Arm based Cortex-M processor is shown below:

As seen, the automatic code generator generates all initialisation code, scaling and data structures needed to implement the IIR via the CMSIS-DSP library. This code may be directly used in any Cortex-M based development project – a complete Keil MDK example is available on Arm/Keil’s website. Notice that the tool’s code generator produces code for the Cortex-M4 core as default, please refer to the table below for the #define definition required for all supported cores.

ARM_MATH_CM0Cortex-M0 core.ARM_MATH_CM4Cortex-M4 core.
ARM_MATH_CM0PLUSCortex-M0+ core.ARM_MATH_CM7Cortex-M7 core.
ARM_MATH_CM3Cortex-M3 core.  
ARM_MATH_ARMV8MBLARMv8M Baseline target (Cortex-M23 core).
ARM_MATH_ARMV8MMLARMv8M Mainline target (Cortex-M33 core).

The main test loop code (not shown) centres around the arm_biquad_cascade_df2T_f32() function, which performs the filtering operation on a block of input data.

What have we learned?

The ASN Filter Designer provides engineers with everything they need in order to port legacy analog filter designs to a variety of Cortex-M processor cores.

The FilterScript symbolic math scripting language offers designers the ability to take an existing analog filter transfer function and transform it to digital (via the Bilinear z-transform or matched z-transform) with just a few lines of code.

The Arm automatic code generator analyses the designed digital filter and then automatically generates Arm CMSIS-DSP compliant C code suitable for direct implementation on a Cortex-M based microcontroller.

Extra resources

  1. Step by step video tutorial of designing an IIR and deploying it to Keil MDK uVision.
  2. Implementing Biquad IIR filters with the ASN Filter Designer and the Arm CMSIS-DSP software framework (ASN-AN025)
  3. Keil MDK uVision example IIR filter project
  4. Step by step instruction video of this tutorial Arm Webinar (requires registration)