SEm/labore/02 interpolation

From FSI
Revision as of 12:32, 7 June 2013 by Guo (Talk | contribs)
Jump to: navigation, search

Contents

Funktionsgenerator mit Interpolationsberechnung

Einleitung

Funktionsgenerator mit Berechnung des Sinus durch Interpolation

In diesem Labor werden wir verschiedene Operationen mit Zahlen durchführen. Dies am Beispiel der Interpolation der Punkte der Sinuskurve eines digitales Funktionsgenerator.

Die Berechnung der Interpolation basiert auf der Annäherung der Funktion zwischen 2 Punkten mit Polynomialfunktionen dritter Ordnung. Diese Methode gehört zur grossen Familie der Splines.

Die Schaltung befindet sich in der Library SineInterpolator, die Testbank in der Library SineInterpolator_test.

Sägezahn

In dieser Schaltung ist die Anzahl Bits der Phase nicht gleich derjenigen der Funktionsgenerator-Ausgänge.

Wenn Ihr die Basisausgänge Sägezahn, Viereck und Dreieck erstellt, ändert der Block resizer die Anzahl Bits des Phasensignals und passt es den Ausgängssignalen an. Dabei gibt es drei Fälle zu beachten:

  • Die Anzahl Bits der Ausgänge ist kleiner als die des Phasensignals: in diesem Fall werden die MSBs behalten.
  • Die Anzahl Bits der Ausgänge ist gleich wie die des Phasensignals: in diesem Fall werden alle Bits übertragen.
  • Die Anzahl Bits der Ausgänge ist kleiner als die des Phasensignals: in diesem Fall wird das Phasensignal in die MSBs des Sägezahnsignals gelegt.

VHDL Code

View-pim-tasks.png

ToDo some code

Simulation

View-pim-tasks.png

ToDo some code

Sinustabelle

Sinustabelle

Die Interpolation wird durchgeführt abhand einer Tabelle, welche 8 Werte der Sinusfunktion im ersten Viertel der Periode enthält. Um die Werte für die ganze Periode anzuwenden, wird das Sägezahnsignal des Phasenzählers wie folgt angewandt:

  • Der MSB gibt an, ob das Vorzeichen zu ändern ist.
  • Der nächste Bit meldet, dass die Phase geändert sein soll, um die Tabelle in der umgekehrten Richtung zu lesen, dies für den zweiten und den vierten Viertel der Periode.
  • Die 3 weitere Bits (tableAddressBitNb = 3) sind als Adresse für das Lesen der Tabellenwerte angewandt.
  • Alle andere Bits werden vernachlässigt.

VHDL Code

View-pim-tasks.png

ToDo some code

Die Adresse der tabelle stammt aus den 3 Bits nach den 2 MSBs. Sie zählt die Sequenz 0, 1, 2, 3, 4, 5, 6, 7, 0, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, ....

Die SinusTabelle enthält die Hexadezimalwerte 0000 oder 7FFF (abhängend auf den zweiten MSB), 18F9, 30FB, 471C, 5A82, 6A6D, 7641 und 7D89.

Wenn der MSB der Phase gleich '1' ist, so wird das Vorzeichen des Tabellenwertes invertiert, um den Ausgang zu erzeugen.

Simulation

View-pim-tasks.png

ToDo some code

Interpolation

Die Interpolation wird gemacht, indem man eine verschiedene Polynomialfunktion 3. Ordnung zu jedem Intervall zwischen zwei Pünkte der Sinustabelle zuweist:

y = a·k^3 + b·k^2 + c·k +d

Während dieser Berechnung wird der jeweilige Punkt der Tabelle mit k = 0 definiert, der vorige Punkt mit k = -1 und der nächste mit k = 1 definiert. Wir werden die Polynomialfunktion für n = 2^m Pünkte zwischen 0 und 1 berechnen.

Um die Kontinuität der Kurve beim übergang vom Polynom des Segments -1 < k < 0 und dem von 0 < k < 1, spezifieren wir, dass die derivative am Punkt y(k=0) gleich der Steigung zwischen den Pünkten y(k=-1) und y(k=1)sein soll. Wir werden dasselbe für alle Pünkte der zu interpolierenden Funktion machen.

Das Segment 0 < k < 1 dient somit den 4 folgenden Bedingungen:

y(k=0) = y0: das Polynom geht über den Punkt (k=0, y=y0),

y(k=1) = y1: das Polynom geht über den Punkt (k=1, y=y1),

y'(k=0) = [y(k=1) - y(k=-1)] / 2: die Derivative am Punkt (k=0) ist die Steigung zwischen y(k=-1) und y(k=1),

y'(k=1) = [y(k=2) - y(k=0)] / 2: die Derivative am Punkt (k=1) ist die Steigung zwischen y(k=0) und y(k=2).

Diese 4 Bedingungen dienen zur Bestimmung des 4 Koeffizienten a, b, c und d des Polynoms abhand der 4 Pünkte y(k=-1) bis y(k=2) der zu interpolierende Kurve. Die Auflösung dieses Gleichungssystems gibt uns die folgenden Werte der Koeffizienten:

a = 1/2 [ - y(k=-1) +3·y(k=0) -3·y(k=1) + y(k=2) ]

b = 1/2 [ 2·y(k=-1) -5·y(k=0) +4·y(k=1) - y(k=2) ]

c = 1/2 [ - y(k=-1) + y(k=1) ]

d = y(k=0)

Um die Berechnungen zu vereinfachen werden wir den doppelten Wert der Koeffizienten evaluieren und später die berechnete Werte des Polynoms durch 2 teilen.

Beim Auftreten jedes neuen Werts des ursprünglichen Signals (hier die Sinustabelle), müssen die Ploynomkoeffiziente neu berechnet werden. Dann, in der Zwischenzeit, wird die Polynomilafunktion berechnet, um den jeweilgen Wert des Ausgangssignal zu bestimmen.

Generator von Sequenzierungsimpulsen

Genrator von Sequenzierungsimpulsen


View-pim-tasks.png

ToDo some code

Diese Schaltung ermittelt einen Impuls mit der Dauer einer Taktperiode bei jedem Polynomwechsel, das heisst zu jedem neuen Kurvensegment.

Dies erfolgt zu jeden 2^n Taktperioden wo en = '1', wobei n = sampleCountBitNb = phaseBitNb-2-tableAddressBitNb. In unserem Laborbeispiel sind phaseBitNb = 10 und sampleCountBitNb = 5.

Schieberegister

Schieberegister


View-pim-tasks.png

ToDo some code

Bei jedem Synchronisationsimplus shiftSamples speichert dis Schaltung den neuen Wert der zu interpolendierenden Funktion, sampleIn, und speichert es als letzes Abtastwert, sample4. Zugleich schiebt er den gespeicherten Wert von sample4 zurück in sample3, usw...

Berechnung der Koeffizienten

Block zur Berechnung der Koeffizienten für die Interpolation


View-pim-tasks.png

ToDo some code

Die Koeffiziente werden wie folgt berechnet:

a = - sample1 +3·sample2 -3·sample3 + sample4

b = 2·sample1 -5·sample2 +4·sample3 - sample4

c = - sample1 + sample3

d = sample2


View-pim-tasks.png

ToDo some code


View-pim-tasks.png

ToDo some code

Berechnung des Polynoms

Block zur Berechnung der Interpolation


View-pim-tasks.png

ToDo some code

Das Polynom wird iterativ berechnet.

Als Beispiel, für eine Funktion 1. Ordnung, y(x) = a·x + b, ist der nächste Wert gleich y(x+eps) = y(x) + a·eps. Die berechnet sich, indem anfangs u = a·eps, y(0) = b initialisiert wird, und indem y(i+1) = y(i) + u bei jeder Taktperiode neu berchenet wird.

Für eine Funktion 2. Ordnung, y(x) = a·x^2 + b·x + c, ergibt sich y(x+eps) = y(x) + u(x), mit u(x) = 2·a·eps·x + (a·eps^2 + b·eps). Der zusatz u(x) berechnet sich mit der Methode, welche für eine Funktion 1. Ordnung vorgegeben wurde. Dies berechnet sich also mit v = 2·a·eps^2, u(0) = a·eps^2 + b·eps, y(0) = c zu initialisation und mit y(i+1) = y(i) + u(i) et u(i+1) = u(i) + v bei jeder neuen Taktperiode.

Die Berechnung der Funktion dritter Ordnung erfolgt ähnlich.

Für die digitale Berechnung wird eps als gleich einer negativen Potenz von 2 gewählt, was es erlaubt, Werte durch eine Verschiebung zu berechnen. Ebenso, um mit ganzen Zahlen zu verbleiben, wird man die Funktion y(i) mit einer Potenz von 2 multipliziert berechnen, und eine Abschlussverschiebung wird uns den Abtastwert des Polynoms geben.

Somit ist unser Algorithmus der folgende:

  • Bei der Ankunft eines neuen Abtastwertes werden die Initialwerte zur iterativen Bestimmung des Polynoms berechnet.
  • Zwischen zwei Abtastwerte wird die Berechnung der Polynomialfunktion mit Hilfe von Additionen durchgeführt, abhand der iterativen Gleichungen.

Die Initialwerte sind die folgende:

x = 2·d·2^(3·m)

u = a + b·2^m + c·2^(2·m)

v = 6·a + 2·b·2^m

w = 6·a

y = d

Die Iterativberechnung des Polynoms wird wie folgt durchgeführt:

x = x + u

u = u + v

v = v + w

y = x / 2·2^(3·m)

Es ist offensichtlich, das wegen der Verschiebungen 2^m, die Anzahl der Bits der internen Signale höher sein muss als die Anzahl der Bits der Eingangs- oder Ausgangswerte. Schätzen Sie die notwendige Grösse für diese Signale als Funktion der Verschiebung m = oversamplingBitNb. Geben Sie diesen Signalen 8 zusätzliche Bits, um sicherzustellen, dass kein Overflow vortauschen wird.

Wiederum wird die Funktion resize hier von grosser Interesse sein.

Simulation

View-pim-tasks.png

ToDo some code


View-pim-tasks.png

ToDo some code


Navigation
Arrow left.gif 01 Funktionsgenerator Arrow up.gif Anleitung auf Deutsch 03 Digital / Analog Wandler Arrow right.gif

Personal tools
Namespaces
Variants
Actions
Navigation
Modules / Projects
Browse
Toolbox