mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP 50Hz Softwarefilter


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.
Autor: Mini Maus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kennt jemand den Weg / Möglichkeiten eines 50Hz Filter in Software?

: Verschoben durch Moderator
Autor: Jemand (Gast)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Ja.

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
https://en.wikipedia.org/wiki/High-pass_filter

-> Algorithmic implementation

Autor: Jemin K. (jkam)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sliding mean über 20 ms.

Autor: Mini Maus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gilt das auch für Gleichspannungssignale?
Also einfache Spannungsmessung am ADC?
Die dort abgebildeten Filter sind doch für AC - oder?
 function highpass(real[0..n] x, real dt, real RC)
   var real[0..n] y
   var real α := RC / (RC + dt)
   y[0] := x[0]
   for i from 1 to n
     y[i] := α * y[i-1] + α * (x[i] - x[i-1])
   return y

Autor: Jemin K. (jkam)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hä?

Autor: HildeK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mini Maus schrieb:
> gilt das auch für Gleichspannungssignale?

Wenn du nur Gleichspannung hast, was willst du dann wegfiltern? Gut, mit 
einem Hochpass kannst du auch die Gleichspannung wegfiltern, aber es ist 
dann einfacher, einfach das Kabel durchzuschneiden ...

Autor: Adam P. (adamap)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mini Maus schrieb:
> Kennt jemand den Weg / Möglichkeiten eines 50Hz Filter in Software?

Such mal nach "WinFilter", der erzeugt dir dann auch C-Code.

Bei mir hab ich ein Bandpass 4 Ordnung für 380Hz laufen, funktioniert 
super.

Für den Offset nutze ich dies:
struct offset_filter_t
{
  long last_f;
  uint32_t last_s;
  int32_t filtered;
};
typedef struct offset_filter_t offset_filter_t;


int32_t dc_offset_filter(offset_filter_t *data, uint32_t sample)
{
  data->filtered = 0.999 * (data->last_f + (long)sample - (long)data->last_s);

  data->last_f = data->filtered;
  data->last_s = sample;

  return (int32_t)data->filtered;
}

: Bearbeitet durch User
Autor: Mini Maus (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
"Wenn du nur Gleichspannung hast, was willst du dann wegfiltern? "
störende Wechselspannung dazwischen?!...

Im Audiobereich habe ich Wechselspannung und will dort Wechselspannungen 
filtern..ich messe aber Gleichspannung und will die Wechselspannung 
filtern.könnte ja sein das das einen Untetrschied macht..
Habe Beispiele gesehen, wo ein C in Reihe und ein R Parallel ist..kannte 
vorher aber nur R in reihe und C Parallel..


Danke für die restlichen Hinweise, ich werde mir auch mal Winfilter 
ansehen

Beitrag #5836577 wurde von einem Moderator gelöscht.
Autor: HildeK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mini Maus schrieb:
> könnte ja sein das das einen Untetrschied macht..
> Habe Beispiele gesehen, wo ein C in Reihe und ein R Parallel ist..kannte
> vorher aber nur R in reihe und C Parallel..

Es macht insofern einen Unterschied, dass diese Beschreibungen auf einen 
Hochpass (C in Reihe und R parallel) und einen Tiefpass (R in Reihe und 
C parallel) hindeuten (wenn ich deine Prosa richtig verstehe, einen Link 
auf deine Infos oder ein Bild wären nützlich gewesen).
Beide Lösungen können 50Hz dämpfen, mit einem Hochpass ist die 
Gleichspannung dann aber auch weg.

Autor: oszi40 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt Hochpass, Tiefpass, Bandpass und Bandsperre.
Filtern ist leider immer die zweitbeste Möglichkeit, da die URSACHE oft 
woanders liegt! Gegen Brummen hilft z.B. auch ausreichende Abschirmung.

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mini Maus schrieb:
> gilt das auch für Gleichspannungssignale?
> Also einfache Spannungsmessung am ADC?

Ein HP wäre da nicht passend.
Wichtig zu wissen wäre, welche Signalanteile du nicht herausfiltern 
möchtest.
Wenn die Frequenz für die du dich interessierst unterhalb 50 Hz liegt 
(sagen wir mal, die Abtastrate des ADC ist ohnehin < 25 Hz), hilft ein 
Tiefpass mit Grenzfrequenz (deutlich) unterhalb von 50 Hz.
Möglichst höherer Ordnung, denn ein Filter 1. Ordnung reduziert den 
Brumm nur um 6dB pro Oktave.

Falls auch Frequenzen oberhalb 50 Hz durchgelassen werden soll hilft ein 
Notch-Filter bei genau 50 Hz.

: Bearbeitet durch User
Autor: Burkhard K. (buks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mini Maus schrieb:
> Im Audiobereich habe ich Wechselspannung und will dort Wechselspannungen
> filtern.

Was hast Du denn überhaupt vor?

Nachträglich Brumm aus Aufnahmen entfernen?
  Audacity -> Effekt -> Notch oder HP -> Filtergüte (Q) wählen -> 
speichern

Oder was ganz anderes? Und wie groß ist der Brumm im Vergleich zum 
Nutzsignal?

BTW: 50 Hz entspricht in etwa dem Kontra-G (E-Seite) auf dem Bass - das 
fehlt dann nach dem Filtern

Autor: Mini Maus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Burkhard K. (buks)

"Was hast Du denn überhaupt vor?"

"gilt das auch für Gleichspannungssignale?
Also einfache Spannungsmessung am ADC?"

Autor: Ingo W. (uebrig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Burkhard K. schrieb:
> Nachträglich Brumm aus Aufnahmen entfernen?
>   Audacity -> Effekt -> Notch oder HP -> Filtergüte (Q) wählen ->
> speichern

Würde ich auch, als Test auf jeden Fall mal empfehlen.

Könnte sich nämlich herausstellen, das es sich hier nicht um einen 
reinen, 50Hz-Sinus handelt, sondern um verformte 100Hz (nach der 
Gleichrichtung), schlimmstenfalls sogar um Nadelimpulse mit der 
entsprechenden Grundfrequenz, in diesem Falle mit einer reinen 
Bandsperre kaum auszufiltern.

Autor: Peter Petersson (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mini Maus schrieb:
> gilt das auch für Gleichspannungssignale?
> Also einfache Spannungsmessung am ADC?
> Die dort abgebildeten Filter sind doch für AC - oder?
>  function highpass(real[0..n] x, real dt, real RC)
>    var real[0..n] y
>    var real α := RC / (RC + dt)
>    y[0] := x[0]
>    for i from 1 to n
>      y[i] := α * y[i-1] + α * (x[i] - x[i-1])
>    return y

Vielleicht grundlegend nochmal anschauen was überhaupt der Sinn eines 
Filters ist. Ich weiß nicht ob ich lachen oder weinen soll.

Autor: Peter Petersson (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder was ein Signal und eine Frequenz, AC und DC überhaupt bedeuten. Du 
scheinst das grundlegend nicht zu verstehen.

Autor: HildeK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Burkhard K. schrieb:
> Was hast Du denn überhaupt vor?

Ja, das habe ich mich auch lange gefragt. Wenn man gut ist im Lesen 
zwischen den Zeilen, könnte man ahnen, dass er eine verbrummte 
Versorgungsspannung überwachen will. Nix Audio etc.
@Mini Maus (Gast): Ist das so? Dann bitte bestätigen!

Dann hilft auf der analogen Seite ein schön tief angelegter Tiefpass 
oder eben ein Tiefpass in Software. Wenn man bei der 
Spannungsüberwachung einen langsamen Drift aus den Spezifikationen 
erfassen will, dann reicht vermutlich schon eine einfache oder eine 
gleitende Mittelwertbildung über eine Reihe von Samples.

Autor: Mini Maus (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
"zwischen den Zeilen, könnte man ahnen, dass er eine verbrummte
Versorgungsspannung überwachen will. Nix Audio etc.
@Mini Maus (Gast): Ist das so? Dann bitte bestätigen!"

Ja, logo ist ja irgendwie naheliegend..
Ich schrieb
Spannungsmessung, ADC 50Hz Filter..da muss man ja kein Genie sein, zu 
wissen was ich meine ;-)

Autor: HildeK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mini Maus schrieb:
> Ja, logo ist ja irgendwie naheliegend..
> Ich schrieb
> Spannungsmessung, ADC 50Hz Filter..da muss man ja kein Genie sein, zu
> wissen was ich meine ;-)

So glasklar war dein Anliegen nicht. Ich war ja offensichtlich nicht der 
Einzige, der länger gebraucht hat um es zu verstehen.

Spannungen sind nicht nur bei DC vorhanden.
Auch das ist dann sinnlos und wenig hilfreich, um auf eine DC-Messung zu 
kommen:
Mini Maus schrieb:
> function highpass(real[0..n] x, real dt, real RC)

Und du redest von "Gleichspannungssignale". Oder meinst du doch nur 
Versorgungsspannungen? Signal wechseln irgendwann, sonst könnten sie 
nichts signalisieren ...
Mini Maus schrieb:
> gilt das auch für Gleichspannungssignale?

50Hz stören auch oft in Audiosignalen und bei vielen anderen 
Anwendungen.

Warum hast du überhaupt auf einer DC-Spannung unerwünschte 50Hz? Oder 
werden die dort benötigt? Wenn nicht, solltest du da schon mal ansetzen, 
das hilft auch andere Probleme zu vermeiden.
Ansonsten: ein Widerstand und ein dickes C vor den ADC-Eingang.

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mini Maus schrieb:
> Ich schrieb
> Spannungsmessung, ADC 50Hz Filter..da muss man ja kein Genie sein, zu
> wissen was ich meine ;-)

Ein sehr netter Tonfall um Hilfe zu bekommen :-(

Beschreibe endlich eindeutig, wie Dein zu messendes Signal aussieht und 
aus welcher Quelle es stammt.

Autor: Logikpolizei (Gast)
Datum:

Bewertung
-3 lesenswert
nicht lesenswert
Adam P. schrieb:
> Bei mir hab ich ein Bandpass 4 Ordnung für 380Hz laufen, funktioniert
> super.

Na? Wer hat da die Aufgabenstellung nicht gelesen?

Mini Maus schrieb:
> Kennt jemand den Weg / Möglichkeiten eines 50Hz Filter in Software?

1. Falsche Frequenz
2. Faslche Filterkurve

1+2 = falsche Antwort!

Autor: Joe F. (easylife)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Logikpolizei schrieb:
> 2. Faslche Filterkurve

False Sreibweise.

Autor: Adam P. (adamap)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Logikpolizei schrieb:
>> Bei mir hab ich ein Bandpass 4 Ordnung für 380Hz laufen, funktioniert
>> super.
>
> Na? Wer hat da die Aufgabenstellung nicht gelesen?

Hättest du verstanden, dass meine Filter ebenfalls mit WinFilter erzeugt 
wurden, dann würdest du erkennen, dass es lediglich ein 
Erfahrungsbericht war und "Mini Maus" sich ihren eigenen Filter selbst 
zusammenklicken kann...

Autor: GEKU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mini Maus schrieb:
> Möglichkeiten eines 50Hz Filter in Software?

Man könnte durch die Software ermitteln mit welcher Amplitude und 
Phasenlage das 50 Hz Signal im Nutzsignal vorkommt. (Fourier Analyse)

Kennt man diese beiden Werte, dann kann man dieses Signal vom Nutzsignal 
abziehen.
Man kann natürlich auch mit den Oberwellen so verfahren.

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.