Forum: Digitale Signalverarbeitung / DSP / Machine Learning C167 DFT Performance


von Philipp (Gast)


Lesenswert?

Hallo,

ich habe leider keinerlei Erfahrung mit der Rechenleistung von µCs und 
hoffe, dass ich mich für diese Frage nicht in Grund und Boden schämen 
muss;-)

Ich möchte aus einem Signal, dass ich mit 80 kHz abtaste, herausfinden, 
welche Phasenlage meine Grundwelle mit 5 kHz hat. Zur Verfügung steht 
mir hierzu ein Infineon C167 bei ca. 20 MHz. Die Berechnung soll 
kontinuierlich ablaufen und mir immer möglichst schnell ein Ergebnis 
liefern; maximale Rechenzeit wäre die Periodendauer der Grundwelle 
(1/5kHz).
Ich bin jetzt davon ausgegangen, dass ich hierfür einen möglichst 
einfachen DFT-Algorithmus (KissFFT?) verwenden würde. Wie gesagt, die 
einzig relevante Information die ich extrahieren möchte ist die 
Phasenlage.

Ich brauche jetzt keine reale Implementierung/ Code. Ich müsste nur 
wissen, ob es geht und welche Rechendauer ich zu erwarten habe.

Ich hoffe ich hab alle wichtigen Informationen genannt, ansonsten geb 
ich mein Bestes alles nötige nachzuliefern.

Vielen Dank
Philipp

von Ex-Siemensianer (Gast)


Lesenswert?

Braucht man dazu eine FFT? Das müsste doch mit dem Signal selbst gehen, 
wenn dessen Frequenz bekannt ist.

von Philipp (Gast)


Lesenswert?

Hallo,
ich weiß leider nicht wie ich das anders bestimmen kann, hättest du da 
einen Tipp?
Es handelt sich um einen mehr oder weniger rechteckförmigen 
Signalverlauf. Dieser kann aufgrund von Lastsprüngen auch mal einen 
"Zwischendip" aufweisen. Der Algorithmus darf sich davon aber nicht 
ablenken lassen.
Die Frequenz ist bekannt.

von optimax (Gast)


Lesenswert?

Hi,

also wenn deine Grundwelle @ 5kHz nahezu konstant ist und wirklich die 
Grundwelle gefordert wird, reicht es aus, nur den "DFT-Algo für die 
Grundwelle"* rüberzuwerfen, unter der  Vorraussetung, dass dein Fenster 
genau einer Periodendauer entspricht.

Damit wirst Du schneller sein als mit einer FFT, da du die DFT nicht 
vollständig durchführen musst, sowie es bei einer FFT der Fall wäre.

*Erläuterung:


Frequenzvektor
Ergebnis d. DFT          typische DFT-Matrix     SAMPLES
[f_dc f_0 f_1 ... f_n]^T = [complexe Matrix]    *  [s_0 s_1 ... s_n]^T

^T => transponiert

Die Grundwelle findet sich bei f_0, das ergibt eine Vektormultiplikation 
mit dem 2tem Zeilenvektor der Martix mal SAMPLES.
Die Zwischendips sollten keinen Einfluss mehr haben.

So würde ich das veruschen.

Phasenlage (zum Beispiel) zur Spannung: Die DFT zum 
Spannungsnulldurchgang starten -> Fenster ist dein neues Bezugssystem, 
ansonsten gleichzeitig auch noch die DFT über die Spannung prügeln.

für einen Phasenwinkel:
Rechenzeit:= 2*SAMPLES == Multiplikationen, da complexe Matrixelemente 
a+jb
            +2*SAMPLES == Additionen
            +arctan(Im/Re) für die Phasenlage

von Philipp (Gast)


Lesenswert?

Danke! Das ist genau das, wonach ich gesucht habe. Hab mich nie so genau 
mit der Materie befasst und wusste gar nicht, dass es solch einen 
einfachen Algorithmus gibt.
Ich gehe jetzt mal davon aus, dass ich diese einfache Implementierung 
auch locker mit dem C167 in gegebener Zeit schaffe. Habe das gerade mal 
in Mathcad ausprobiert und da kommen auch gute Lösungen raus. Ich denke 
die Genauigkeit reicht mir.
Vielen Dank!

von optimax (Gast)


Lesenswert?

Keine Ursache,

ich habe mit diesem Konzept in MATLAB mal Zeitbereichsmessungen 
auswerten müssen, und es war eben nur die Phasenverschiebung der 
Grundwellen gefordert.
Es waren einige hundert Messungen, da wäre eine FFT viel zulangsam 
gewesen, zu mal die Zeitbereiche(50kSamples+) nicht 2pi-periodisch waren 
(-> Zero-Padding); so war das eine Sache ms statt Sekunden.

Einige Taktzyklen kann man sich vielleicht noch einsparen, wenn man den 
blöden arctan(), "irgendwie" weglassen kann oder eine eigene 
"Reihen-Entwicklung" für diese Operation zusammenstrickt, sofern keine 
optimierte Math-Bib zur Hand ist.

UND den Anti-Alaising-Filter nichtvergessen, ohne diesen könnte das 
Ergebnis verfälscht werden.


Und mal interesse halber:

C167, ist das nicht ein kleines Monster mit mehreren Registersätzen & 
Registerumbennung, ich kenn den nur aus einer Vorlesung, hatte mich 
damals gefragt, wer sowas freiwillig programmieren will ;)

von Philipp (Gast)


Lesenswert?

Hi,
ich hatte jetzt erwartet, dass man den arctan mittels Lookup-Tabellen 
relativ performant implementieren kann. Insbesondere erwarte ich, dass 
in meinem Fall keine hohe Genauigkeit benötigt wird, weshalb die 
Tabellen noch recht klein ausfallen können.

Allerdings ist es für mich eh nicht nötig, eine reale Implementierung 
des Algorithmus aufzubauen. Meine Aufgabe war es vielmehr, eine 
Abschätzung abzuliefern, ob dieser Chip unser Problem lösen kann. 
Natürlich fehlen hier jetzt noch zusätzliche Berechnungen, wie der 
Anti-Aliasing-Filter, oder Sicherheitsfunktionen, die 
fehlerhafte/unerwünschte Ausgaben ausschließen. Aber ich bin mir in dem 
Fall sicher, dass die Rechenleistung dafür auch ausreichen wird, da die 
eigentliche DFT viel einfacher implementiert werden kann, als ich 
erwartet habe.

Zum C167 kann ich gar nicht so viel sagen. Der hat halt schon knapp 20 
Jahre auf dem Buckel und scheint aufgrund seines guten 
Preis/Leistungsverhältnis viel im Einsatz zu sein. Allerdings würden 
auch wir uns viel lieber was Moderneres wünschen, aber an den 
Zertifizierungsprozess traut sich keiner ran ;-) Und solange der alte 
noch lieferbar ist wird sich das auch nicht ändern.

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.