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