3 Stimmen

Interpolation der Sinustabelle

Ich möchte ein SDR-System zusammenstellen, das zunächst AM, später FM usw. empfängt. Das System, das ich dafür verwenden will, wird eine Sinus-Lookup-Tabelle für die direkte digitale Synthese (DDS) haben. Um richtig abstimmen zu können, muss ich in der Lage sein, die Frequenz der Sinuswelle, die dem Mischer (in diesem Fall dem Multiplikator) zugeführt wird, genau zu steuern. Ich erwarte, dass eine lineare Interpolation nahe dran ist, denke aber, dass eine nicht-lineare Methode bessere Ergebnisse liefern wird.

Was ist eine gute und schnelle Interpolationsmethode für Sinustabellen? Multiplikation und Addition sind auf dem Zielsystem billig, Division ist kostspielig.

Bearbeiten: Ich plane, Konstanten mit Multiplikations-/Shift-Funktionen zu implementieren, um die Konstanten auf skalierte Ganzzahlen zu normalisieren. Zwischenwerte werden breite Additionen verwenden, und Multiplikationen werden 18 oder 17 Bits verwenden. Fließkomma-"Vorberechnungen" können verwendet werden, aber nicht auf der Zielplattform. Wenn ich sage "Division ist teuer", dann meine ich damit, dass sie mit Hilfe der Multiplizierer und einer Menge Code implementiert werden muss. Das ist nicht undenkbar, sollte aber vermieden werden. Echte IEEE-Fließkommamethoden würden jedoch auf dieser Plattform eine erhebliche Menge an Ressourcen sowie eine benutzerdefinierte Implementierung erfordern.

Jede SDR-Erfahrung wäre hilfreich.

1voto

David Cary Punkte 4991

Es gibt erstaunlich cleveren Code für die schnelle Berechnung von sin() auf Systemen mit winzigem Speicher, die nicht einmal einen Hardware-Multiplikationsbefehl haben, geschweige denn einen Divisionsbefehl.

In der Reihenfolge der zunehmenden Komplexität:

  • Verwenden Sie eine Rechteckwelle. Viele AM-Radios verwenden Rechteckwellen in ihren Ringdemodulator und ich sehe nicht ein, warum Ihr AM-Demodulator etwas Komplizierteres benötigt.

  • Approximieren Sie sin(), indem Sie den "nächstgelegenen Wert" in einer Rohtabelle mit 256 Werten pro Viertelstunde nachschlagen. Ja, Sie sehen schrecklich aussehende Treppenstufen, aber (mit ein wenig analoger Filterung) funktioniert das oft gut. (Tatsächlich ist dies oft ein Overkill, und eine viel kürzere Tabelle ist ausreichend).

  • Annäherung an sin() durch Nachschlagen der 2 nächstgelegenen Werte in einer Rohtabelle und lineare Interpolation zwischen ihnen.

  • Die Annäherung von sin() mit 16 kurzen, gleichmäßig verteilten kubischen Splines pro Viertelzyklus "ergibt eine bessere Genauigkeit als 16 Bit" für sin(x).

Wikibooks: Festkommazahlen Links zu einigen cleveren Umsetzungen der letzten 3.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X