LP-Filter in "C" nach Python transcribieren ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hi,
will für meine Downsample-Routine (http://www.python-forum.de/topic-6118.html) einen Low-Pass Filter programmieren. Alles was ich gefunden habe, ist ein Beispiel in 'C'. Da ich mich mit C nicht auskenne, der Algorythmus so komplex aber nicht aussieht, müßte eigentlich eine Portierung nach Python möglich sein !? Der LP-Filter in C sieht so aus:

http://www.koders.com/c/fidA0DDEDE48422 ... FAD59.aspx

Meine Frage, weil hier ja viele C drauf haben. Was bedeuten die Zeilen:

Code: Alles auswählen

#include <math.h>
#include "st_i.h"
#include "btrworth.h"
Wenn das irgendwelche Bibliotheken sind, für die es keine Equivalenz in Python gibt, kann ich es natürlich vergessen.

Und was bedeutet:

Code: Alles auswählen

int st_lowpass_getopts (effp, n, argv) 
im Deklarationsteil ?

Den Rest bekomme ich hoffentlich selbst raus.

Gruss, Seven
Zuletzt geändert von snakeseven am Samstag 3. Juni 2006, 14:55, insgesamt 1-mal geändert.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

snakeseven hat geschrieben:

Code: Alles auswählen

#include <math.h>
#include "st_i.h"
#include "btrworth.h"
Sind Libarys ....
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

schade,schade,schade. :cry:
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Naja du könntest dir jemanden suchen, der C kann und ihn Fragen was das Programm nun konkret macht und das ganze auf Python übertragen. Und die Lybaries sollte es auch in Python geben. Und wenn nicht gibt es auch garantiert Python Module die sowas ähnliches machen. :wink:
mfg

Thomas :-)
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

und du solltest die dateien "st_i.h" und "btrworth.h" haben...
das sind header-dateien, in denen funktionen deklariert werden, auf die im skript zurückgegriffen wird.
die anführunf´gszeichen heißen, dass das keine normalen bibliotheken sind, sondern eigene dateien, die im gelichen ordner wie die angezeigte liegt.
also auf jeden fall noch die beiden anderen dateien finden!
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Hast du dir mal mein Post durchgelesen? :?
Er soll das ganze doch auf Python übertragen, da braucht er die Libary doch gar nicht. :?

Er braucht nur jem. der ihm sagt, was das C Programm macht und das ganze
überträgt er auf Python, sofern das möglich ist. :P
mfg

Thomas :-)
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

einfache Antwort: "JA!!!"
Ich denke, dass es schon bedeutung hat, ob eine Bibliothek allgemein ist (un daher man nachlesen kann, was die Mehtoden bringen) oder es selbstgeschriebene sind, deren inhalt man nicht kennt.
So ist das Programm ja unvollständig.
Solange man den Inhalt derer nicht kennt, kann man lange nach Entsprechungen in Python suchen...
es ist doch nur eine erweiterung deiens posts! Wie soll ein C-Spezialist denn wissen, was das bringt, solange er keine header-datei-infos hat?
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Lol ich hab deinen Beitrag nur überflogen und dabei nicht gemerkt, dass du geschrieben hast, dass es Eigene Datein sind. Ich dachte das es keine Standardbiblotheken sind, sondern welche, die zusätzlich gedownloaded wurden. Daher bin ich davon ausgegangen, dass es genügend Infos zu denen gibt. :lol:
mfg

Thomas :-)
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

habs ja auch nur gesagt, weil schon gefragt wurde, was das
(#include<blabla>)überhaupt ist.
dachte mir, dass das für einen C-n00b schon interessant ist...
nichts für ungut
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

ich hab jetzt von dem keine Ahnung, aber....

Z.B wxPython ist zum grössten Teil in C. Könntest du das nicht einfach irgend wie einbinden und das ganze dann nur noch aufrufen...
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

also snakeseven will das nun mal in C haben...
aber sonst bräuchte man genausoviel ahnung, weil man das ganze umschreiben muss!
man muss ja python.h includen und dann darauf zurückgreifen!
sonst kann das ja gar nicht mit den argumentenübergaben und dem return klappen, oder nur shr umsständlich...
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Hier kannst du dir deinen Filter designen lassen. Den C-Code kannst du recht einfach in Python portieren.

(Die Filter arbeiten als Feedback filter, d.h. zum aktuellen Sample wird eine kombination aus früheren Samplen addiert)

(Als Ordnung einen kleinen Wert wie 2 wählen, je größer die Ordnung, desto schärfer die Kante, desto mehr Rechenzeit)
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Joghurt hat geschrieben:Hier kannst du dir deinen Filter designen lassen. Den C-Code kannst du recht einfach in Python portieren
Das sieht gut aus, klasse Tool. Werds auf jeden Fall ausprobieren. Und der generierte Filter kommt komplett ohne irgendwelche zusätzlichen Libraries aus !

Gruss, Seven
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

So, hab jetzt mit Joghurts Link folgenden LP-Filter generiert (Ansi C):

Code: Alles auswählen

/*
filtertype 	= Butterworth 	   
passtype 	= Lowpass 	   		   
order 	= 2 	   
samplerate = 44100 	   
corner1 	= 4000 */

#define NZEROS 2
#define NPOLES 2
#define GAIN   1.748240362e+01

static float xv[NZEROS+1], yv[NPOLES+1];

static void filterloop()
  { for (;;)
      { xv[0] = xv[1]; xv[1] = xv[2]; 
        xv[2] = `next input value' / GAIN;
        yv[0] = yv[1]; yv[1] = yv[2]; 
        yv[2] =   (xv[0] + xv[2]) + 2 * xv[1]
                     + ( -0.4476808265 * yv[0]) + (  1.2188793364 * yv[1]);
        `next output value' = yv[2];
      }
  }
In Python müßte das meiner Meinung nach so aussehen:

Code: Alles auswählen

def filterLP(wave):
    lenraw = len(wave[44:])
    rawd = struct.unpack(str(lenraw)+'b',wave[44:]) 
    xv = [0,0,0]
    yv = [0,0,0]
        
    rawdfiltered = []
    for i in range(0,lenraw):
        xv[0] = xv[1] 
        xv[1] = xv[2]
        xv[2] = rawd[i] / 1.748240362e+01
        yv[0] = yv[1] 
        yv[1] = yv[2]
        yv[2] = (xv[0] + xv[2]) + 2 * xv[1] + ( -0.4476808265 * yv[0]) + (  1.2188793364 * yv[1])
        value = yv[2]
        
        if value < -128: rawdfiltered.append(-128)                  #Falls Clippen, begrenzen auf gültigen Wertebereich 
        elif value > 127: rawdfiltered.append(127) 
        else: rawdfiltered.append(value) 
        
    result = wave[:44] + struct.pack(str(lenraw)+'b',*rawdfiltered)
    return result
Erzeugt leider nur Rauschen !? :roll:
Bestimmt habe ich irgendwas falsch nach Python konvertiert. Nur was ?

Gruss, Seven
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Die Samples werden als Float erwartet. Wertebereich -1 bis +1, IIRC

Und bist du sicher, dass das WAV 8 Bit ist? Die meisten sind doch 44100Hz bei 16 Bit
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hi,
'signed short' soll es sein http://de.wikipedia.org/wiki/WAV_(Format). Damit klappts und beim Konvertieren nach 8KHz bringt der Filter auch die erwarteten Ergebnisse :D .Habe das fertige Script zur Downsampling-Routine gepackt.

Besten Dank !
Seven

P.S. Warum nimmt der meinen Wiki-Link nicht ??
Antworten