Seite 1 von 1
LP-Filter in "C" nach Python transcribieren ?
Verfasst: Samstag 3. Juni 2006, 02:32
von snakeseven
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:
im Deklarationsteil ?
Den Rest bekomme ich hoffentlich selbst raus.
Gruss, Seven
Re: LP-Filter in "C" nach Python transcribieren ?
Verfasst: Samstag 3. Juni 2006, 10:52
von DatenMetzgerX
snakeseven hat geschrieben:
Code: Alles auswählen
#include <math.h>
#include "st_i.h"
#include "btrworth.h"
Sind Libarys ....
Verfasst: Samstag 3. Juni 2006, 14:54
von snakeseven
schade,schade,schade.

Verfasst: Samstag 3. Juni 2006, 14:59
von Python 47
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.

Verfasst: Samstag 3. Juni 2006, 16:28
von murph
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!
Verfasst: Samstag 3. Juni 2006, 16:32
von Python 47
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.

Verfasst: Samstag 3. Juni 2006, 16:38
von murph
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?
Verfasst: Samstag 3. Juni 2006, 16:41
von Python 47
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.

Verfasst: Samstag 3. Juni 2006, 16:46
von murph
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
Verfasst: Samstag 3. Juni 2006, 16:57
von DatenMetzgerX
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...
Verfasst: Samstag 3. Juni 2006, 17:00
von murph
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...
Verfasst: Samstag 3. Juni 2006, 18:52
von Joghurt
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)
Verfasst: Samstag 3. Juni 2006, 23:52
von snakeseven
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
Verfasst: Sonntag 4. Juni 2006, 08:00
von snakeseven
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 !?
Bestimmt habe ich irgendwas falsch nach Python konvertiert. Nur was ?
Gruss, Seven
Verfasst: Sonntag 4. Juni 2006, 10:35
von Joghurt
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
Verfasst: Sonntag 4. Juni 2006, 19:16
von snakeseven
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

.Habe das fertige Script zur Downsampling-Routine gepackt.
Besten Dank !
Seven
P.S. Warum nimmt der meinen Wiki-Link nicht ??