Forum: Digitale Signalverarbeitung / DSP / Machine Learning Beste Option gesucht, um DC aus Daten vor FFT zu entfernen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Nick (Gast)


Lesenswert?

Ich denke, die Überschrift ist klar: Es geht darum, vor einer FFT die 
Daten um einen möglichen DC-Offset zu bereinigen, um zu guten Daten zu 
kommen.

In der Literatur und Publikationen wir u.a. empfohlen, die Nullfrequenz 
zu ignorieren, was mir nicht zielführend erscheint, weil die nicht den 
vollen DC Offset angibt, sondern dieser sich auch in anderen Frequenzen 
niederschlägt.

Andere empfehlen einen Hochpass, wobei die einfachste Version, nämlich 
das Abziehen des Mittelwertes auch wieder bereichsempfindlich ist und 
nicht stimmen kann, wie folgendes Beispiel zeigt:

2,9,6,4,5,3,6,3,7,4,5,1

Bilde ich den Mittelwert aller 12 Zahlen, ergibt es einen anderen Wert, 
als bei nur 11 Zahlen und der ist wieder unterschiedlich zwischen den 
Werten 0...11 und 1...12.

Ein richtiger Hochpass wäre gut, aber wie bauen?

von p*rn (Gast)


Lesenswert?

>Ein richtiger Hochpass wäre gut, aber wie bauen?
1
FILTERCONST = 0.001f; 
2
3
out = in - f;
4
f += out * FILTERCONST;

von jemand (Gast)


Lesenswert?

Den Hochpass kannst du zB als FIR (längere Verzögerung bei gleicher 
„Leistung“) oder IIR Filter (kann dafür oszillieren, wenn man Pech hat) 
implementieren.
Da gibt's mehrere Verfahren für, die auszulegen, du solltest in Internet 
aber ne ganze Menge dazu finden.

von MJF (Gast)


Lesenswert?

Hi,
vielleicht den Mittelwert der Eingangswerte der FFT bestimmen und 
subtrahieren?
Grüße
Markus

von MJF (Gast)


Lesenswert?

MJF schrieb:
> Hi,
> vielleicht den Mittelwert der Eingangswerte der FFT bestimmen und
> subtrahieren?
> Grüße
> Markus

Argh! Ich habe nicht den ganzen Text gelesen, vergiss meine Antwort.

von Olaf (Gast)


Lesenswert?

> In der Literatur und Publikationen wir u.a. empfohlen, die Nullfrequenz
> zu ignorieren, was mir nicht zielführend erscheint,

Hast du das schonmal ausprobiert? Ich habe es mal probiert und es klappt
perfekt. Mach einfach mal eine FFT, setze Real und Imag Teil von DC auf
null und mache eine reverse FFT. Bei mir sieht das signal dann 1:1 
Deckungsgleich aus, nur ohne Offset.

> Ein richtiger Hochpass wäre gut, aber wie bauen?

FIR halt, allerdings der wird dann in irgendeiner Weise deine Daten
beeinflussen. Wie stark haengt natuerlich davon ab wie der genau
aussieht.

Olaf

von Mathias (Gast)


Lesenswert?

Nick schrieb:
> Bilde ich den Mittelwert aller 12 Zahlen, ergibt es einen anderen Wert,
> als bei nur 11 Zahlen und der ist wieder unterschiedlich zwischen den
> Werten 0...11 und 1...12.

Warum solltest du beim Mittelwert denn Zahlen weglassen wollen?

von Dieter H. (kyblord)


Lesenswert?

MJF schrieb:
> Hi,
> vielleicht den Mittelwert der Eingangswerte der FFT bestimmen und
> subtrahieren?
> Grüße
> Markus

Ja das ist ja gerade ein Hochpass, den er ja sucht lol.
Der gleitende Mittelwert ist ein Tiefpass. Im Frequenzbereich:

Signal - Signal * Tiefpass = Signal * (1- Tiefpass) = Signal * Hochpass

von W.S. (Gast)


Lesenswert?

Nick schrieb:
> Ein richtiger Hochpass wäre gut, aber wie bauen?

Ganz einfach: Bau einen Tiefpaß und mach per Spektralinversion daraus 
einen Hochpaß.
Aber viel wichtiger ist die Frage nach der Grenzfrequenz des Hochpasses. 
Die muß du nämlich mit dir selber ausmachen. Da kann dir keiner bei 
helfen.

W.S.

von Nick (Gast)


Lesenswert?

Olaf schrieb:
> Hast du das schonmal ausprobiert? Ich habe es mal probiert und es klappt
> perfekt.
ja, bei mir aber nicht. Die "Nullfrequenz" ist die tiefste und die 
enthält den gesamten Bereich, der durch sie abgedeckt ist. Also bei 16 
Frequenzen alles im Bereich 1/16 Nyquist +/- 1/32. Klar, darin enthalten 
sind weite Teile des Offsets, aber eben nicht nur. Wenn man die 
rausnimmt, bekommt man einen Hochpass.

W.S. schrieb:
> Aber viel wichtiger ist die Frage nach der Grenzfrequenz des Hochpasses.
Genau! Ideal wäre es, wenn man Signale zu prozessieren hat, deren untere 
Grenzfrequenz bekannt ist und weit weg liegt von der Nyqist/n , bzw man 
genug "n" machen kann und darf, das das passiert.
Also z.B. 32 FFT-Frequenzen bei 100kHz, tiefste ist 10kHz. Dann haue ich 
alles unter 1kHz weg und habe Platz in beide Richtungen.

von Nick (Gast)


Lesenswert?

Mathias schrieb:
> Warum solltest du beim Mittelwert denn Zahlen weglassen wollen?

Die FFT nutzt eine bestimmte Anzahl von Werten, die ja etwas willkürlich 
ist. In meinem Beispiel waren es 11. Nimmt man jeweils den Mittelwert 
aller 11 aktuell zu nutzenden Zahlen, ergibt sich einmal ein Mittelwert 
der Reihe 0-10, als nächstes 1-11, dann 2 bis 12 und so weiter.

Nimmt man sich ein Zahlenmaterial vor, bestimmen die wechselnden Werte 
jeweils einen anderen Mittelwert. Als Beipspiel das hier:

7
3
6
4  5,7
8  5,1
5  5,4
7  5,0
3  5,1
5  4,3
3  4,1
5  3,7
2
4
4

Das sind die jeweiligen Mittelwerte von 7 Zahlen, im ersten Fall von der 
ersten 7 bis zur zweiten 7 -> 5.7.  Nimmt man für die nächste Berechnung 
die nächsten Zahlen, dann bekomme ich als Mittelwert 5,1.  Ich würde 
also vor jeder FFT jedesmal einen anderen Wert abziehen.

Dieser Mittelwert ist also nicht der echte Offset der gesamten Daten. 
Den sieht man so ohne Weiteres nicht. Er ist nur der Offset der Daten 
der in die FFT fliesst. Oder reicht das und ist genau so optimal?

Beitrag #6846030 wurde vom Autor gelöscht.
von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Nick schrieb:
> Nimmt man für die nächste Berechnung
> die nächsten Zahlen, dann bekomme ich als Mittelwert 5,1.  Ich würde
> also vor jeder FFT jedesmal einen anderen Wert abziehen.

Klingt so, als ob du nicht eine normale FFT berechnest, sondern eine 
Sliding-FFT, Kurzzeit-FFT, zeitabhängige FFT  oder so etwas in der 
Richtung. Wäre nett gewesen wenn du das von Anfang an geschrieben 
hättest ...

Zuerst mal die aller einfachste Lösung: Schalte einen Kondensator in den 
Analogeingang deines Samplingsystems. Schwupp ist der DC-Offset weg.

> Dieser Mittelwert ist also nicht der echte Offset der gesamten Daten.

Der Mittelwert kann nur eine Näherung sein. Die Näherung wird um so 
besser je mehr Samples du berücksichtigst. Den besten Mittelwert M 
bekommst du aus den Samples x[i] als:

Nur ist der ein "bisschen" blöd zu berechnen und sehr unpraktisch. Real 
kannst du eine Folge von Mittelwerten bekommen:
Aber auch das ist nicht so sonderlich schön zu berechnen. Und wenn n 
überläuft ist der Spaß sowieso vorbei.

Der praktische Kompromiss ist daher einen gleitenden Mittelwert zu 
verwenden und auch dabei eine größere Anzahl von Samples zu 
berücksichtigt. Das in der Hoffnung, dass der Wert relativ schnell 
konvergiert. Also nicht nur die Samples aus deinem aktuellen Window (in 
deinem Beispiel jeweils 11 Samples), sondern einige historische davor 
(z.B. insgesamt fünf Windowlängen), sobald du die Samples hast.

Wenn du die jeweilige FFT zeitlich verzögerst, dann kannst du den 
gleitenden Mittelwert um die Mitte deines Windows zentrieren. D.h. nicht 
nur historische Samples, sondern auch "zukünftige" Samples bei der 
Mittelwertberechnung verwenden.

von Mathias (Gast)


Lesenswert?

Hannes J. schrieb:
> Klingt so, als ob du nicht eine normale FFT berechnest, sondern eine
> Sliding-FFT, Kurzzeit-FFT, zeitabhängige FFT  oder so etwas in der
> Richtung. Wäre nett gewesen wenn du das von Anfang an geschrieben
> hättest ...

Ich denke auch. Beschreib mal, was du insgesamt machen willst denn:

Nick schrieb:
> Ich denke, die Überschrift ist klar:

Da stimme ich überhaupt nicht zu. Wie sieht deine Anwendung oder 
Programm genau aus?

Nick schrieb:
> Die FFT nutzt eine bestimmte Anzahl von Werten, die ja etwas willkürlich
> ist.

Bei mir war das noch nie willkürlich. Erkläre, warum das bei dir 
willkürlich ist. Dann können wir dir besser helfen.

von frequenzbereichsbastler (Gast)


Lesenswert?

Du könntest ja den Mittelwert über einen größeren Zeitraum bilden und 
dann abziehen.

Die FFT geht dann z.B. über 16 Datenpunkte, der Mittelwert für den 
Offset aber über 256 oder 512 Werte.

Ganz loswerden wirst du den "Drift" nicht, immerhin willst du den Offset 
ja aus Input = Offset + Unbekanntes Signal herausrechnen. Da kann das 
unbekannte Signal auch immer noch seinen eigenen Offset mit rein tragen.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Wir sind hier wieder an der Stelle, wo wir hier bereits einmal waren:
Beitrag "Re: Datenfensterung"

Die glättende Fensterfunktion ist das Entscheidende. Diese eliminiert / 
reduziert diese Effekte, welche durch das "hüpfende" rechteckige Fenster 
entstehen. Ein gleitender Mittelwert mit Gewichtungsfaktoren 1.0 wirkt 
wie ein Rechteck, d.h. der Beitrag eines Wertes ist schlagartig da und 
wieder weg und dann springen die Ergebnisse logischerweise.

Wenn man nun so klug ist, das Window so auszudehnen, wie die FFT, dann 
hat man das Problem schon stark reduziert. Gleichwohl bleibt das Problem 
der Qualität der FFT an sich: Bildet man diese nur über das gewünschte 
Betrachtungsfenster und nicht über eine größere Zahl von Perioden, dann 
ist die Trennung der Frequenzen eben eine andere.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Jürgen S. schrieb:
> die Trennung der Frequenzen

Gemeint war natürlich die Trennung der Amplitudenwerte der 
(Stütz-)frequenzen, also die Qualität, mit der ein Wert wirklich die 
Frequenz repräsentiert und nicht von den Nachbarn beeinflusst wird. Das 
wird er nämlich infolge der Endlichkeit der Berechnung und der dadurch 
zwangsläufig auftretenden Fehler.

frequenzbereichsbastler schrieb:
> Du könntest ja den Mittelwert über einen größeren Zeitraum bilden und
> dann abziehen.
>
> Die FFT geht dann z.B. über 16 Datenpunkte, der Mittelwert für den
> Offset aber über 256 oder 512 Werte.

Damit schleppt man aber doch wieder einen offset in die FFF, die damit 
klarkommen muss. Das Beste ist nach wie vor den Offset in dem Bereich zu 
eliminieren, der auch der FFT zugeführt wird. Und wie gesagt muss man 
sich bewusst sein, dass die FFT gefenstert werden MUSS, um Probleme zu 
verhindern und dieses Fenster wiederum eine Deformation bringt, weswegen 
es so groß wie möglich sein sollte, damit der abflachende Bereich 
möglichst wenig Beitrag liefert.

Lange FFT : Gute Aussage
Kurze FFT : naja ...


Für die Fensterfunktionen gibt es unterschiedliche Randbedingungen und 
Qualitiäten, z.B. will man eine gute Repräsentation der Amplituden, der 
gesamten Energie im Signal oder eine möglichst gut Seitenbanddänpfung. 
Diese bekommt man z.B. a) Hamming, d) Kaiser-7, c) Kaiser 
Blackman-Harris II

Oder man möchte eine FFT, deren Ergebnisse man nutzen kann, um im 
Audiobereich Formanten zu bearbeiten, die Tonhöhe anzupassen und einiges 
mehr und dass so, dass man es anschließend wieder möglichst Artefaktfrei 
resynthetisieren kann. Das erfordert ganz bestimmte Längen, Bandbreiten 
und ein angepasstes Fenster.

: Bearbeitet durch User

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]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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