mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Wie Sinus erzeugen?


Autor: Mike (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Ich möchte mittels DSP Sinussignale erzeugen. Die Frequenz soll 
innerhalb eines engen Bereichs variabel sein, hohe Anforderungen an den 
Klirrfaktor existieren nicht. Üblicherweise wird das ja über DDS 
gemacht: Ein Phasenakkumulator wird pro Abtastintervall um einen 
konstanten Wert erhöht, wobei bei 2*Pi zyklisch wieder bei null begonnen 
wird. Der jeweilige Pahsenwert dient als Index in eine Sinustabelle. Der 
Sinuswert wird dann auf den DAC gegeben, der das Ausgangssignal erzeugt.

Nachteilig ist, dass man eine recht große Tabelle im Speicher vorhalten 
muss.

Ich hätte eine andere Idee:

Es wird zunächst ein Rechtecksignal erzeugt, das anschließend durch ein 
IIR-Filter geschickt wird, dessen Grenzfrequenz knapp oberhalb der 
höchsten zu erzeugenden Sinusfrequenz liegt. Dadurch werden die 
Oberwellen unterdrückt und es bleibt die Grundschwingung zurück.


Ich habe das anhand eines 4.Ordnung Butterworth in Matlab mal 
ausprobiert, es scheint zu funktionieren.

Nachteilig ist der etwas höhere Rechenaufwand.

Wäre hier irgendein Pferdefuss in der praktischen Umsetzung zu erwarten?

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Mar. Wa. (elektrowagi78) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Mike schrieb:
> Es wird zunächst ein Rechtecksignal erzeugt, das anschließend durch ein
> IIR-Filter geschickt wird, dessen Grenzfrequenz knapp oberhalb der
> höchsten zu erzeugenden Sinusfrequenz liegt. Dadurch werden die
> Oberwellen unterdrückt und es bleibt die Grundschwingung zurück.
>
> Ich habe das anhand eines 4.Ordnung Butterworth in Matlab mal
> ausprobiert, es scheint zu funktionieren.

Ich glaube, das sind die innovativen Lösungsansätze, die hier 
angesprochen wurden:

Beitrag "Re: Hardwareentwickler als Technischer Informatiker"

Das Thema ist 100mal diskutiert und genau so oft gelöst.

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike schrieb:
> Nachteilig ist, dass man eine recht große Tabelle im Speicher vorhalten
> muss.
>
> Ich hätte eine andere Idee:
>
> Es wird zunächst ein Rechtecksignal erzeugt, das anschließend durch ein
> IIR-Filter geschickt wird,

Ach herrje...

Rechne dir den sinus einfach aus und benutze dazu die simple Formel nach 
"Sinus nach Pedersen". Das kostet vermutlich weniger Zeit als dein 
IIR-Filter und liefert annähernd 6 gültige Dezimalstellen - sollte dir 
ausreichen. Das Thema hatten wir hier schon mal.

W.S.

Autor: DSP Entwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst den hier:
Beitrag "Re: arm_sin_cos_f32() gibt keine Ergebnisse aus"

Guter Tipp. Danke. Kannte Ich noch gar nicht.

Autor: W.S. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
DSP Entwickler schrieb:
> Du meinst den hier

Nö.

Sondern: Beitrag "Sinusberechnung auf Controller STM32F030"

Nochmal ganz kurz:
y:= x * (K*x^2 + L + M / (x^2 + N));

mit
K = 0.15625
L = -11.45242628
M = 480.1488517
N = 38.55864669

W.S.

Autor: Progger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da komme Ich aber nicht auf einen Sinus!
Sieht eher aus wie eine Näherung von COS/7  im Bereich +/-PI.
Aber nicht gut.

????

Autor: Progger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch es stimmt! Vorzeichenfehler.

Autor: Sabberalot W. (jetztnicht)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Tabelle (64 oder 128) und lineare Interpolation.

Autor: BuDe (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
W.S. schrieb:
> Nochmal ganz kurz:
  y:= x * (K*x^2 + L + M / (x^2 + N));

Wie ist denn diese Formel anzuwenden?
Ich vermute mal y=Sinuswert, x=Winkelwert(Grad).

Dann müsste mit x=90, y zu 1 werden.
Nach meiner Rechnung ist y dann 19.178940.....
Wo ist ist denn hier der Bock??

viele Grüße

Autor: W.S. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
BuDe schrieb:
> Wie ist denn diese Formel anzuwenden?

Bogenmaß und 1. Quadrant.

W.S.

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Solche Formeln sind praktisch immer im Bogenmass. Also X von -PI bis PI.

Oder digital in 8 Bit:

https://www.mikrocontroller.net/wikifiles/thumb/b/...

k1 = 1,0000, k2= -0,0444, k3= -0,0207, k4= -0,0018, k5= -0,00255.

Siehe Digitale Sinusfunktion

Autor: BuDe (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
BuDe schrieb:
> Wie ist denn diese Formel anzuwenden?

W.S. und J.Schuhmacher:
vielen Dank Euch beiden, mit Bogenmaß geht die Rechnung auf.

Gruß
BuDe

Autor: Edi. M. (Firma: Industrie 1.0) (elektromeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> "Sinus nach Pedersen".
Super! Danke für diese Info. Kannte Ich bisher noch nicht.

Jürgen S. schrieb:
> k1 = 1,0000, k2= -0,0444, k3= -0,0207, k4= -0,0018, k5= -0,00255.
Woher kommt diese Formel? Quelle?

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Edi M. schrieb:
> Jürgen S. schrieb:
>> k1 = 1,0000, k2= -0,0444, k3= -0,0207, k4= -0,0018, k5= -0,00255.
> Woher kommt diese Formel? Quelle?
Empirisch gefunden, durch Ausprobieren optimiert. Ob sie effektiv ist, 
hängt davon ob, wie effektiv die INT-Multiplikationen sind. Bei einem 
floating point DSP braucht es das nicht. Aber mit einem 8-Bit uc lässt 
sich das leicht realisieren. Ist auch grob 0,1% genau.

Autor: Mar. Wa. (elektrowagi78) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> Nochmal ganz kurz:

Hallo W.S. sehr guter Tipp. Heute morgen mal kurz eingetippt: Klappt.

Jetzt müsste man nur noch wissen, wie man bei den Werten einfach die 
Frequenz ändern kann. (?)

Autor: Sabberalot W. (jetztnicht)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Jetzt müsste man nur noch wissen, wie man bei den Werten einfach die
Frequenz ändern kann. (?)

Das Konzept des DDS hast du aber verstanden ?

Autor: Thomas U. (thomasu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> K = 0.15625
> L = -11.45242628
> M = 480.1488517
> N = 38.55864669

gibt es auch praktische Bedeutung zu diesen Werten? Ich als Physike lese 
da Längen und Momente, etc aber deren Verknüpfung macht so in der Formel 
eigentlich keinen Sinn.

Autor: Harald Wilhelms (wilhelms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas U. schrieb:

> Ich als Physike lese da Längen und Momente,

Man muss ja nicht unbedingt die ganze Welt
auf das cgs-System zurückführen. :-)

Autor: Thomas U. (thomasu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage wäre halt, woher die Bezeichnungen kommen und was sie 
bedeuten?

Autor: Roland Franz (rhf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

> Die Frage wäre halt, woher die Bezeichnungen kommen und was sie
> bedeuten?

A, B, C,...

rhf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.