SEm/labore/02 interpolation
(Created page with "{{TOC right}} {{TOC right}} = Funktionsgenerator mit Interpolationsberechnung = ---- '''Inhaltsverzeichnis''' EinleitungSägezahnVHDL CodeSimulation[[S...") |
|||
Line 1: | Line 1: | ||
− | |||
{{TOC right}} | {{TOC right}} | ||
= Funktionsgenerator mit Interpolationsberechnung = | = Funktionsgenerator mit Interpolationsberechnung = | ||
− | |||
− | |||
− | |||
− | |||
− | |||
== Einleitung == | == Einleitung == | ||
− | In diesem Labor werden wir Operationen | + | In diesem Labor werden wir verschiedene Operationen mit Zahlen durchführen. |
− | + | Dies am Beispiel der Interpolation der Punkte der Sinuskurve eines digitales Funktionsgenerator. | |
− | Funktionsgenerator. | + | |
[[Image:sineGen.png]] | [[Image:sineGen.png]] | ||
Line 20: | Line 13: | ||
<br> | <br> | ||
Die Berechnung der Interpolation basiert auf der Annäherung der Funktion zwischen | Die Berechnung der Interpolation basiert auf der Annäherung der Funktion zwischen | ||
− | 2 | + | 2 Pünkte mit Polynomialfunktionen dritter Ordnung. Diese Methode gehört der grossen |
Familie der "Splines". | Familie der "Splines". | ||
Line 40: | Line 33: | ||
* Die Anzahl Bits der Ausgängen ist kleiner als die des Phasensignals: in diesem Fall werden die MSBs behalten. | * Die Anzahl Bits der Ausgängen ist kleiner als die des Phasensignals: in diesem Fall werden die MSBs behalten. | ||
− | * Die Anzahl Bits der Ausgängen ist gleich wie die des Phasensignals: in diesem Fall werden alle Bits | + | * Die Anzahl Bits der Ausgängen ist gleich wie die des Phasensignals: in diesem Fall werden alle Bits übertagt. |
* Die Anzahl Bits der Ausgängen ist kleiner als die des Phasensignals: in diesem Fall wird der Phasensignal in den MSBs des Sägezahnsignals gelegt. | * Die Anzahl Bits der Ausgängen ist kleiner als die des Phasensignals: in diesem Fall wird der Phasensignal in den MSBs des Sägezahnsignals gelegt. | ||
Line 51: | Line 44: | ||
Compilieren Sie und simulieren Sie den Block '''sineGen_tb'''. Ändern Sie | Compilieren Sie und simulieren Sie den Block '''sineGen_tb'''. Ändern Sie | ||
− | die Anzahl Bits des Phasensignals und | + | die Anzahl Bits des Phasensignals und überprüfen Sie die Anpassung der Anzahl Bits in jedem |
möglichen Operationsfall. | möglichen Operationsfall. | ||
== Sinustabelle == | == Sinustabelle == | ||
− | Die Interpolation wird | + | Die Interpolation wird durchgeführt abhand einer Tabelle, welche 8 Werte der |
− | Sinusfunktion im ersten Viertel der Periode enthält. Um die Werte | + | 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: | anzuwenden, wird das Sägezahnsignal des Phasenzählers wie folgt angewandt: | ||
* Der MSB gibt an, ob das Vorzeichen zu ändern ist. | * 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 | + | * 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 | + | * Die 3 weitere Bits ('''tableAddressBitNb = 3''') sind als Adresse für das Lesen der Tabellenwerte angewandt. |
* Alle andere Bits werden vernachlässigt. | * Alle andere Bits werden vernachlässigt. | ||
[[Image:sineTable.png]] | [[Image:sineTable.png]] | ||
Line 82: | Line 75: | ||
=== Simulation === | === Simulation === | ||
− | Compilieren Sie und simulieren Sie den Block '''sineGen_tb'''. | + | Compilieren Sie und simulieren Sie den Block '''sineGen_tb'''. Prüfen Sie |
die Funktionalität des Sinuswellensignalgenerators. | die Funktionalität des Sinuswellensignalgenerators. | ||
Line 88: | Line 81: | ||
Die Interpolation wird gemacht, indem man eine verschiedene Polynomialfunktion 3. Ordnung | Die Interpolation wird gemacht, indem man eine verschiedene Polynomialfunktion 3. Ordnung | ||
− | zu jedem Intervall zwischen zwei | + | zu jedem Intervall zwischen zwei Pünkte der Sinustabelle zuweist: |
''' y = a·k^3 + b·k^2 + c·k +d''' | ''' y = a·k^3 + b·k^2 + c·k +d''' | ||
Line 94: | Line 87: | ||
Während dieser Berechnung wird der jeweilige Punkt der Tabelle mit | Während dieser Berechnung wird der jeweilige Punkt der Tabelle mit | ||
'''k = 0''' definiert, der vorige Punkt mit '''k = -1''' und der | '''k = 0''' definiert, der vorige Punkt mit '''k = -1''' und der | ||
− | nächste mit '''k = 1''' definiert. Wir werden die Polynomialfunktion | + | nächste mit '''k = 1''' definiert. Wir werden die Polynomialfunktion für |
− | '''n = 2^m''' | + | '''n = 2^m''' Pünkte zwischen 0 und 1 berechnen. |
− | Um die Kontinuität der Kurve beim | + | Um die Kontinuität der Kurve beim übergang vom Polynom des Segments |
'''-1 < k < 0''' und dem von '''0 < k < 1''', | '''-1 < k < 0''' und dem von '''0 < k < 1''', | ||
spezifieren wir, dass die derivative am Punkt '''y(k=0)''' gleich der Steigung | spezifieren wir, dass die derivative am Punkt '''y(k=0)''' gleich der Steigung | ||
− | zwischen den | + | zwischen den Pünkten '''y(k=-1)''' und '''y(k=1)'''sein soll. Wir |
− | werden dasselbe | + | werden dasselbe für alle Pünkte der zu interpolierenden Funktion machen. |
Das Segment '''0 < k < 1''' dient somit den 4 folgenden | Das Segment '''0 < k < 1''' dient somit den 4 folgenden | ||
Bedingungen: | Bedingungen: | ||
− | ''' y(k=0) = y0''': das Polynom geht | + | ''' y(k=0) = y0''': das Polynom geht über den Punkt '''(k=0, |
y=y0)''', | y=y0)''', | ||
− | ''' y(k=1) = y1''': das Polynom geht | + | ''' y(k=1) = y1''': das Polynom geht über den Punkt '''(k=1, |
y=y1)''', | y=y1)''', | ||
Line 122: | Line 115: | ||
Diese 4 Bedingungen dienen zur Bestimmung des 4 Koeffizienten '''a''', | Diese 4 Bedingungen dienen zur Bestimmung des 4 Koeffizienten '''a''', | ||
'''b''', '''c''' und '''d''' des Polynoms abhand der | '''b''', '''c''' und '''d''' des Polynoms abhand der | ||
− | 4 | + | 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 | Kurve. Die Auflösung dieses Gleichungssystems gibt uns die folgenden Werte der | ||
Koeffizienten: | Koeffizienten: | ||
Line 137: | Line 130: | ||
evaluieren und später die berechnete Werte des Polynoms durch 2 teilen. | evaluieren und später die berechnete Werte des Polynoms durch 2 teilen. | ||
− | Beim Auftreten jedes neuen Werts des | + | 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. | Polynomilafunktion berechnet, um den jeweilgen Wert des Ausgangssignal zu bestimmen. | ||
Line 160: | Line 153: | ||
Schreiben Sie die VHDL Architektur des Schieberegisters, welcher die 4 letzte | Schreiben Sie die VHDL Architektur des Schieberegisters, welcher die 4 letzte | ||
− | + | Pünkte der zu interpolendierenden Funktion speichert. | |
[[Image:interpolatorShiftRegister.png]] | [[Image:interpolatorShiftRegister.png]] | ||
Line 169: | Line 162: | ||
den neuen Wert der zu interpolendierenden Funktion, '''sampleIn''', und | den neuen Wert der zu interpolendierenden Funktion, '''sampleIn''', und | ||
speichert es als letzes Abtastwert, '''sample4'''. Zugleich schiebt er den | speichert es als letzes Abtastwert, '''sample4'''. Zugleich schiebt er den | ||
− | gespeicherten Wert von '''sample4''' | + | gespeicherten Wert von '''sample4''' zurück in '''sample3''', |
usw... | usw... | ||
Line 175: | Line 168: | ||
Schreiben Sie die VHDL Architektur des Blocks, welcher die Koeffizienten des Polynoms | Schreiben Sie die VHDL Architektur des Blocks, welcher die Koeffizienten des Polynoms | ||
− | berechnet als Funktion der 4 letzten | + | berechnet als Funktion der 4 letzten Pünkten der zu interpolendierenden |
Funktion. | Funktion. | ||
[[Image:interpolatorCoefficients.png]] | [[Image:interpolatorCoefficients.png]] | ||
− | '''Abbildung 5. Block zur Berechnung der Koeffizienten | + | '''Abbildung 5. Block zur Berechnung der Koeffizienten für die Interpolation''' |
<br> | <br> | ||
Line 197: | Line 190: | ||
Öffnen Sie die Library '''ieee.numeric_std''' und durchsuchen Sie die | Öffnen Sie die Library '''ieee.numeric_std''' und durchsuchen Sie die | ||
Auswirkung der Multiplikation eines Signals von Typ '''signed''' durch eine | Auswirkung der Multiplikation eines Signals von Typ '''signed''' durch eine | ||
− | ganze Zahl. | + | ganze Zahl. Prüfen Sie ebenfalls das Funktionieren der Funktion '''resize'''. |
− | Sie ist hier sehr | + | Sie ist hier sehr nützlich, um die Anzahl der Bits der Signale zu bestimmen. |
=== Berechnung des Polynoms === | === Berechnung des Polynoms === | ||
Line 211: | Line 204: | ||
Das Polynom wird iterativ berechnet. | Das Polynom wird iterativ berechnet. | ||
− | Als Beispiel, | + | 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 | 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 | anfangs '''u = a·eps''', '''y(0) = b''' initialisiert wird, und | ||
indem '''y(i+1) = y(i) + u''' bei jeder Taktperiode neu berchenet wird. | 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 | sich '''y(x+eps) = y(x) + u(x)''', mit | ||
'''u(x) = 2·a·eps·x + (a·eps^2 + b·eps)'''. Der zusatz | '''u(x) = 2·a·eps·x + (a·eps^2 + b·eps)'''. Der zusatz | ||
− | '''u(x)''' berechnet sich mit der Methode, welche | + | '''u(x)''' berechnet sich mit der Methode, welche für eine Funktion |
1. Ordnung vorgegeben wurde. Dies berechnet sich also mit | 1. Ordnung vorgegeben wurde. Dies berechnet sich also mit | ||
'''v = 2·a·eps^2''', '''u(0) = a·eps^2 + b·eps''', | '''v = 2·a·eps^2''', '''u(0) = a·eps^2 + b·eps''', | ||
Line 228: | Line 221: | ||
Die Berechnung der Funktion dritter Ordnung erfolgt ähnlich. | 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. | 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)''' | Ebenso, um mit ganzen Zahlen zu verbleiben, wird man die Funktion '''y(i)''' | ||
Line 237: | Line 230: | ||
* Bei der Ankunft eines neuen Abtastwertes werden die Initialwerte zur iterativen Bestimmung des Polynoms berechnet. | * 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 | + | * Zwischen zwei Abtastwerte wird die Berechnung der Polynomialfunktion mit Hilfe von Additionen durchgeführt, abhand der iterativen Gleichungen. |
Die Initialwerte sind die folgende: | Die Initialwerte sind die folgende: | ||
Line 251: | Line 244: | ||
''' y = d''' | ''' y = d''' | ||
− | Die Iterativberechnung des Polynoms wird wie folgt | + | Die Iterativberechnung des Polynoms wird wie folgt durchgeführt: |
''' x = x + u''' | ''' x = x + u''' | ||
Line 263: | Line 256: | ||
Es ist offensichtlich, das wegen der Verschiebungen '''2^m''', die Anzahl | 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 | 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 | + | Ausgangswerte. Schätzen Sie die notwendige Grösse für diese Signale als Funktion der |
Verschiebung '''m = oversamplingBitNb'''. Geben Sie diesen Signalen | Verschiebung '''m = oversamplingBitNb'''. Geben Sie diesen Signalen | ||
8 zusätzliche Bits, um sicherzustellen, dass kein Overflow vortauschen wird. | 8 zusätzliche Bits, um sicherzustellen, dass kein Overflow vortauschen wird. | ||
Line 272: | Line 265: | ||
=== Simulation === | === Simulation === | ||
− | Compilieren Sie und simulieren Sie den Block '''sineGen_tb''' neu. | + | Compilieren Sie und simulieren Sie den Block '''sineGen_tb''' neu. Prüfen |
Sie die Form des Sinuswelle nach Interpolation. | Sie die Form des Sinuswelle nach Interpolation. | ||
− | Verkleinern Sie dia Anzahl Bits der Signale in der Schaltung | + | Verkleinern Sie dia Anzahl Bits der Signale in der Schaltung überall, wo es möglich |
ist. | ist. |
Revision as of 12:50, 7 June 2013
|
Funktionsgenerator mit Interpolationsberechnung
Einleitung
In diesem Labor werden wir verschiedene Operationen mit Zahlen durchführen. Dies am Beispiel der Interpolation der Punkte der Sinuskurve eines digitales Funktionsgenerator.
File:SineGen.png Abbildung 1. Funktionsgenerator mit Berechnung des Sinus durch Interpolation
Die Berechnung der Interpolation basiert auf der Annäherung der Funktion zwischen
2 Pünkte mit Polynomialfunktionen dritter Ordnung. Diese Methode gehört der 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 der Anzahl Bits der Funktionsgenerator-Ausgänge.
Zur erstellung der Grundausgänge: Sägezahn, Viereck und Dreieck ändert der Block resizer die Anzahl Bits des Phasensignals und passt es den Ausgängssignalen an. Drei fälle sind zu betrachten:
Pour la génération des signaux de base: dent de scie, carré et triangle, le bloc resizer change la taille du signal de phase afin de l'adapter à celle des signaux de sortie. trois cas sont à prévoir:
- Die Anzahl Bits der Ausgängen ist kleiner als die des Phasensignals: in diesem Fall werden die MSBs behalten.
- Die Anzahl Bits der Ausgängen ist gleich wie die des Phasensignals: in diesem Fall werden alle Bits übertagt.
- Die Anzahl Bits der Ausgängen ist kleiner als die des Phasensignals: in diesem Fall wird der Phasensignal in den MSBs des Sägezahnsignals gelegt.
VHDL Code
Mit Hilfe des Konstruktes if … generate, schreiben Sie den VHDL Code des resizer-Blocks.
Simulation
Compilieren Sie und simulieren Sie den Block sineGen_tb. Ändern Sie die Anzahl Bits des Phasensignals und überprüfen Sie die Anpassung der Anzahl Bits in jedem möglichen Operationsfall.
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.
File:SineTable.png Abbildung 2. Sinustabelle
VHDL Code
Schreiben Sie die VHDL Architektur des Sinuswellengenerators.
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
Compilieren Sie und simulieren Sie den Block sineGen_tb. Prüfen Sie die Funktionalität des Sinuswellensignalgenerators.
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
Schreiben Sie die VHDL Architektur des Generators von Sequenzierungsimpulsen.
File:InterpolatorTrigger.png Abbildung 3. Generator von Sequenzierungsimpulsen
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
Schreiben Sie die VHDL Architektur des Schieberegisters, welcher die 4 letzte Pünkte der zu interpolendierenden Funktion speichert.
File:InterpolatorShiftRegister.png Abbildung 4. Schieberegister
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
Schreiben Sie die VHDL Architektur des Blocks, welcher die Koeffizienten des Polynoms berechnet als Funktion der 4 letzten Pünkten der zu interpolendierenden Funktion.
File:InterpolatorCoefficients.png Abbildung 5. Block zur Berechnung der Koeffizienten für die Interpolation
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
Erklären Sie die getroffene Wahl im Schema coeffBitNb := signalBitNb+3.
Öffnen Sie die Library ieee.numeric_std und durchsuchen Sie die Auswirkung der Multiplikation eines Signals von Typ signed durch eine ganze Zahl. Prüfen Sie ebenfalls das Funktionieren der Funktion resize. Sie ist hier sehr nützlich, um die Anzahl der Bits der Signale zu bestimmen.
Berechnung des Polynoms
Schreiben Sie die VHDL Architektur des Blocks, welcher den Wert des Interpolationspolynom bei jeder neuen Taktperiode berechnet.
File:InterpolatorPolynom.png Abbildung 6. Block zur Berechnung der Interpolation
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
Compilieren Sie und simulieren Sie den Block sineGen_tb neu. Prüfen Sie die Form des Sinuswelle nach Interpolation.
Verkleinern Sie dia Anzahl Bits der Signale in der Schaltung überall, wo es möglich ist.