mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP software Tiefpassfilter


Autor: Filtrix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte gern mit einem Mega Controller zur Übung einen Tiefpassfilter 
2. Ordnung in C programmieren. Grenzfrequenz sollte z.B. 1kHz sein.

Ich habe leider nirgends gefunden wie man sich die Grundbausteine wie 
z.B. Samplefrequenz so zurechtlegt, wie es das Filter benötigen wird.

Hat jemand Ratschläge bezüglich guter Literatur oder gar die Zeit dazu 
mal einen solchen Code wie gefordert mit Erklärung zu posten?


Danke

: Verschoben durch Admin
Autor: Michael Roek (mexman) Benutzerseite
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Na, wie funktioniert ein Filter?


Im Prinzip musst Du nur
- einen Analogwert einlesen
- ihn mit dem vorherigen Analogwert vergleichen und
- daraufhin einen berechneten Analogwert ausgeben.

Wie funktioniert ein Tiefpass?
Du berechnest die Differenz (neuer Eingangs-Analogwert - alter 
Eingangs-Analogwert)
und berechnest daraus die Aenderung des Ausgabewertes.
Fuer einen Tiefpass muss
- bei setigendem EIngangswert der Ausgangswert steigen
- die Groesse des Anstieges abhaengen von der DIfferenz der 
EIngangswerte
(alles bei Abtastung  in gleichmaessigen Zeitabstaenden)


Im Extremfall machst Du das so:
neue Einangsspannung > alte Eingangsspannung -> Inkrementiere den 
Ausgangswert

neue Einangsspannung < alte Eingangsspannung -> Dekrementiere den 
Ausgangswert


Gruss

Michael

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
// Tiefpass-Filter:
// adc_akt   : akt. ADC-Messwert
// adc_value : akt. Mittelwert
// adc_tmp   : Mittelwert des letzten Zyklus
// k         : Integer Wert mit k > 1
//
// adc_value = (k-1)/k * adc_tmp + 1/k * adc_akt
// wir arbeiten mit k = 4
//==============================================
// ADC_ReadSound
//==============================================
void ADC_ReadSound( WORD adc_akt)
{
  static WORD adc_tmp;

  if (adc_tmp == 0)      // falls erste Messung
    adc_tmp = adc_akt;

  adc_values[ADC_SOUND].value_ist = (adc_tmp + adc_tmp + adc_tmp) / 4  + (adc_akt / 4);
  adc_values[ADC_SOUND].valid     = true;
  adc_tmp                         = adc_akt;
}

Autor: edgar S. (hbl333)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann sieh mal hier nach:

http://de.wikipedia.org/wiki/Filter_mit_endlicher_...

jetzt brauchst du nur noch Filterkoeffizienten und fertig.

Autor: Filtrix (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mehmet Kendi schrieb:
 adc_tmp = adc_akt; 

Das dürfte nicht viel bringen, wenn du deinen letzten Messwert in der 
nächsten Berechnung mehr Wertigkeit gibst als dem Neuen. Damit 
verschiebst du dein Messergebnis lediglich um eine Messung nach hinten.
 adc_temp = adc_values[ADC_SOUND].value_ist 

higegen macht Sinn, siehe Anhang.

Welchen Einfluss hat jetzt noch die Sample-Rate? Je schneller ich 
sample, desto weniger bringt das Filter!

Autor: Mathias Fendl (minglifu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

also willst du das ordentlich und richtig machen, so geb ich dir das 
Stichwort: Bilineare-Transformation von der s-Ebene in die z-Ebene!

MfG
MingliFu

Autor: gk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also es gab mal einen Artikel in der c't Heft 12, 1987(!) mit dem Titel 
"Frequenzen wegrechnen" da war zum einen die Theorie gut beschrieben 
(ähnlich Wiki), der Filteralgorythmus und die Berechnung der zugehörigen 
Parameter mit Beispielprogrammen.
gk

Autor: avr (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im EDN stand auch mal was, ich habs mal angehängt.

Ist ein einfacher TP mit Erklärung.

avr

Autor: TP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft das Skript weiter:

https://books.google.de/books?id=Tn2nCQAAQBAJ&prin...

Autor: Georg G. (df2au)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier
http://www.minidsp.com/applications/advanced-tools...
findest du eine gute Übersicht über verfügbare Software, die dir hilft, 
die Filterkoeffizienten zu ermitteln.

Das Programm im Anhang ist eine quick and very dirty Implementation 
eines Bandpasses.

Hier
t-filter.appspot.com
gab es einmal ein sehr gutes Programm, um online Filter zu entwerfen. 
Momentan (?) ist es leider nicht zugänglich.

Google zeigt dir unter "fir filter design online" noch viele andere 
Hilfen.

Eine Kurpackung Entwurfssoftware für Windows findest du unter
http://iowahills.com/

: Bearbeitet durch User
Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch immer eine gute Adresse das "The Scientist and Engineer's Guide to 
Digital Signal Processing" zu finden hier:
http://www.dspguide.com/pdfbook.htm

und speziell zum Filterdesign:
http://www.dspguide.com/ch20.htm

Man kann sich die Kapitel auch als PDF runterladen.

Gerhard

Autor: Henk (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Michael Roek schrieb:
> Wie funktioniert ein Tiefpass?
> Im Extremfall machst Du das so:
> neue Einangsspannung > alte Eingangsspannung -> Inkrementiere den
> Ausgangswert
>
> neue Einangsspannung < alte Eingangsspannung -> Dekrementiere den
> Ausgangswert

Was ist denn DAS für eine seltsame Definition für einen TP? Wie sieht da 
wohl die Ü-Funktion aus?

Autor: Joe F. (easylife)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Henk schrieb:
> Wie sieht da
> wohl die Ü-Funktion aus?

so:
cat /dev/random

Autor: Markus B. (russenbaer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mehmet Kendi schrieb:
> Mehmet Kendi
>         (mkmk)
>
>
>
>
>
>
>
>
>       Datum: 08.03.2011 15:09


Hab Dir einen Bodediagramm für Deine Filterkoeffizienten und den Fall 
fs=2kHz gemacht.
Die sind nicht gerade berühmt...

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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