|
|
Digitale SinusfunktionDigitale Erzeugung einer Sinusfunktion mit FPGAs und Mikroprozessoren. von J.S. Die hier beschriebenen Methoden eigenen sich insbesondere zur Umsetzung in low cost Systemen, in denen es auf Geschwindigkeit ankommt. Sie gelten für VHDL, Verilog, C und Assembler sinngemäß.
[Bearbeiten] Grundsätzliches zu Phase und Amplitude[Bearbeiten] PhasendefinitionBei der Erzeugung von Sinuswellen in Software, z.B. bei der DDS, wird gerne von der Möglichkeit Gebrauch gemacht, die Gesamtperiode als 4 Teilperioden zu interpretieren, nur die erste zu hinterlegen, bzw. zu erzeugen, um die Welle später phasen- und vorzeichenrichtig wieder zusammenzubauen. Dabei gibt es zwei Möglichkeiten: [Bearbeiten] RandwertdefinitionMan bezieht sich bei den Stützstellen des Sinus auf die Randwerte des abgedeckten Bereiches, also 0.0, 1.0, 2.0, 3.0, ... (n/4)-1 und wiederholt ab dem Punkt n/4 den Bogen rückwärts. Daraus ergibt sich z.B. für 32 Punkte die Abbildung: [0,1,2,3,4,5,6,7] und [8,7,6,5,4,3,2,1] sowie die entsprechende Wiederholung dieses Bogens mit dann negativem Vorzeichen für die Werte ab 180°. Man beachte dabei, dass der "Elementarbogen" bei den Punkten 0, 90, 180 und 270 beginnt, aber den jeweils letzten Wert nicht einschließen darf, da er sonst im nächten Bereich wiederholt würde. Die Phasen dieser Darstellung entspricht damit p = 0, 1/n, 2/n ... (n-1)/n. Wichtig ist das Teilen durch n und nicht etwas n-1, wie man es teilweise sieht. Die so generierten Stützstellen rahmen also (erst) mit 9 Werten den vollen Bereich von 0°…90° ein, bzw. mit 17 Werten den Bereich von 0…180° = π. Es gibt zwei leicht verschiedene Viertelbögen, die zueineinder nicht symmetrisch sind. Man benötigt gegebenenfalls ein Bit mehr für die Umrechnung (siehe 0…7 und 1…8). [Bearbeiten] ZwischenwertdefinitionAus rechenerischer Sicht und auch aus darstellungstechnischen Gründen ist es günstiger, mit den ansteuernden Digitalwerten 0 ... n-1 die Mitte eines Intervalls zu definieren. Damit gibt es pro Viertelbogen genau 8 Stellen, die zur nächsten Viertelperiode voll symmetrisch sind. Der Digitalwert 0 repräsentiert also den mittleren Sinuswert in dem Bereich 0...1, der Digitalwert 7 den Wert im Bereich 7...8. Dazu muss bei der Interpretation der Phase 1/n aufaddiert werden. Die Phase entspricht damit p = 0,5 , 1,5/n, 2,5/n ... (n-0,5)/n. Man kann damit für beide Viertelbögen mit einem gleich grossen Vektor arbeiten. [Bearbeiten] AmplitudendefinitionJe nach Phase muss die zugehörige Amplitude berechnet werden. Auch hier braucht man je nach digitaler Aussteuerung mitunter für nur einen einzigen Wert (den Maxwert) ein bit mehr. Es sollte daher bedacht werden, ob man bei Methode 1 unbedingt eine Vollaussteuerung "2 hoch n" benötigt. [Bearbeiten] VorteilBei Nutzung der Methode 2 ergibt sich der Vorteil, dass sich gerade bei kleinen Tabellen eine etwas größere Amplitude unterbringen lässt, da bei gerader Punktanzahl für die Viertelbogen immer Symmetrie zur Zeitachse herrscht. Die Werte liegen also z.B. bei 4 Bit nicht bei 7,6,5 ... -5,-6,-7 unter Verlust des Punktes -8, der ja möglich wäre, sondern bei 7,5 ... -7.5. Ferner fällt der eigentliche Maxwert weg, wodurch die Skalierung weiter wachsen kann (32,1 im Bild), was besonders bei kleinen Auflösungen relevant ist. Nutzbar ist der Effekt immer dann, wenn der Wert direkt auf einem Wandler ausgeben wird. [Bearbeiten] Mögliches ProblemDer Nachteil, dass es keinen ausdrücklichen Nullpunkt gibt, ist bei vielen Anwendungen unerheblich - wäre aber im Einzelfall zu prüfen. Es muss nur bedacht werden, dass im Falle einer Nachbehandlung der Sinuswellen durch Filter unter Umständen größere Werte entstehen können, als durch die Stützstellen vorgegeben wurde! Sicherheitshalber verzichtet man auf die Amplitudenüberhöhung. Erläuterungen zur Grafik: Dargestellt sind die beiden Methoden beginnend mit jeweils dem Winkel als float-Wert von 0 < X < 16, dem digitalen "code" 0 ... 15, dem abgebildeten Sektor (man beachte den Sonderpunkt 4), der relativen Phase bezogen auf den Definitionsbereich, die absolute Phase innerhalb 360 Grad und der sich Sinuswerte. Die aufaddierten Sinuswerte (int) ergeben einen Eindruck des Integrals = Fläche unter der Kurve. In den Kurven sind die 4 benutzten Punkte dargestellt. Die blaue Kurve gibt den Winkel 0 ... 90 Grad an. [Bearbeiten] Vergleich und FazitIn der Regel ist Definition 2 vorzuziehen. Bei großen Auflösungen nähern sich beide ohnehin an, es bleibt aber der Vorteil der einfacheren Behandlung der Vektoren und es gibt keine Sonderbehandlung des 90°-Falles. Hier bräuchte man je nach Realisierung eine Fallunterscheidung oder ein Bit mehr für die Vollaussteuerung. Gleiches gilt bei der Bildung der Phase. Eine weitere Betrachtung zu diesem Thema befindet sich hier: http://www.mikrocontroller.net/topic/251921#2593000 [Bearbeiten] Erzeugung der Sinuswerte[Bearbeiten] TabelleBei der klassischen DDS wird die aus dem Akkumulator abgeleitete Phase direkt als Adresse einer Ram/Rom Tabelle genutzt, in der der Sinus abgelegt wurde. Diese lässt sich mit Excel leicht erzeugen und analysieren. Danach kann sie in ein Daten-Array in VHDL oder direkt als Definitions-file für die FPGA-internen BRAMs angelegt werden. [Bearbeiten] Sinus-Approximation 1Die nachfolgende Formel beschreibt dagegen eine einfache Approximation: Der Faktor 4 ist so gewählt, daß der Scheitel der Parabel mit dem Maximum der sin-Kurve zusammenfällt. Die Abweichung dieses leicht oberhalb des Sinus verlaufenden Bogens beträgt nicht mehr als 12.5%[1] und eignet sich daher für viele Applikationen, bei denen es nicht auf 100% Genauigkeit ankommt. [Bearbeiten] Sinus-Approximation 2Die Beschreibung einer optimierten Approximation bis auf <0.1% @ 10Bit folgt. [Bearbeiten] WeiterverarbeitungBei der direkten Erzeugung des Wertes durch Formeln kann die Berechung mit jeder beliebigen Auflösung erfolgen. Eine Interpolation oder Filterung ist in diesen Fällen nicht unbedingt nötig. Um dennoch Zwischenwerte zu bekommen gibt, es folgende Möglichkeiten: [Bearbeiten] InterpolationDie bisher nicht genutzten unteren Bits des Phasenakkumulators, werden in eine Geradengleichung eingesetzt, die aus dem aktuellen und dem nächsten Punkt gewonnen wird. [Bearbeiten] FilterungEine anschliessende Filterung kann die Güte des Sinus weiter erhöhen. Ein einfaches, auf die zu erzeugende Frequenz abgestimmtes, IIR-Filter eliminiert zuverlässig die hochfrequenten Anteile z.B. die verbleibenden Knicke der Interpolation. [Bearbeiten] AnwendungsbeispieleAls Beispiele seien genannt: [Bearbeiten] Signalsynthese[Bearbeiten] TongenerationIn den 80ern konnte ich (in Assembler!) so ohne Interpolation oder Filterung wie bei einer DDS arbeiten und mit dem VC20 und VC64 Pseudo-Sinustöneerzeugen, die in der Frequenz genau zu variieren waren. Bei nur ca 2MHz Taktfrequenz liessen sich mit einer einfachen Schleife schon bei 64 Punkten Sweeps und kontinuierliche Portamentoeffekte für das komplette Audiospektrum mehrkanalig produzieren. Die im Signal freilich enthaltenen Oberwellen wirken dabei mit zusätzlicher Musikalität. [Bearbeiten] MotorsteuerungBei dem Betrieb von Schrittmotoren werden die X/Y-Wicklungen mit Strömen angesteuert, die Sinus/Cosinus-Verläufe aufweisen, um einen Feinschrittbetrieb zu ermöglichen. Die im Signal enthaltenen Oberwellen sind hier sogar günstig für den Beschleunigungsverlauf, da die Steigungen der Funktion genau dort grösser sind, als der echte Sinus, wo der Motor aufgrund des Haltemoments am meisten Widerstand entgegen setzt. (Nur ein Motor ohne Haltemomentpunkte würde 100%ige COS/SIN benötigen) [Bearbeiten] Signalverarbeitung[Bearbeiten] IQ-ModulationDer Vorteil der kontinuierlichen, nicht an Tabellen gebundenen, Sinussynthese zeigt sich besonders bei der IQ-Modulation, wo die Akkumulatorrundung bei kleinen Tabellen ohne eine Interpolation zu unerwünschtem Phasenrauschen führt, das minunter schwerwiegendere Fehler generiert, als der systematische Amplitudenfehler. [Bearbeiten] Fußnoten
[Bearbeiten] LinksDiskussion um DDS:
|