Forum: Digitale Signalverarbeitung / DSP / Machine Learning Wie Sinus erzeugen?


von Mike (Gast)


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?

von eProfi (Gast)


Lesenswert?


von Michael W. (Gast)


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.

von W.S. (Gast)


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.

von DSP Entwickler (Gast)


Lesenswert?

Du meinst den hier:
Beitrag "Re: arm_sin_cos_f32() gibt keine Ergebnisse aus"

Guter Tipp. Danke. Kannte Ich noch gar nicht.

von W.S. (Gast)


Lesenswert?

DSP Entwickler schrieb:
> Du meinst den hier

Nö.

Sondern: Beitrag "Sinusberechnung auf Controller STM32F030"

Nochmal ganz kurz:
1
y:= x * (K*x^2 + L + M / (x^2 + N));
2
3
mit
4
K = 0.15625
5
L = -11.45242628
6
M = 480.1488517
7
N = 38.55864669

W.S.

von Progger (Gast)


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.

????

von Progger (Gast)


Lesenswert?

Doch es stimmt! Vorzeichenfehler.

von Pandur S. (jetztnicht)


Lesenswert?

Tabelle (64 oder 128) und lineare Interpolation.

von BuDe (Gast)


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

von W.S. (Gast)


Lesenswert?

BuDe schrieb:
> Wie ist denn diese Formel anzuwenden?

Bogenmaß und 1. Quadrant.

W.S.

von J. S. (engineer) Benutzerseite


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/b3/Opimierte_naeherung_sinusfunktion2_js.png/480px-Opimierte_naeherung_sinusfunktion2_js.png

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

Siehe Digitale Sinusfunktion

von BuDe (Gast)


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

von Edi M. (Gast)


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?

von J. S. (engineer) Benutzerseite


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.

von Michael W. (Gast)


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. (?)

von Pandur S. (jetztnicht)


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 ?

von T.U.Darmstadt (Gast)


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.

von Harald W. (wilhelms)


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. :-)

von T.U.Darmstadt (Gast)


Lesenswert?

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

von Roland F. (rhf)


Lesenswert?

Hallo Thomas,

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

A, B, C,...

rhf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.