LP-Filter in "C" nach Python transcribieren ?
- snakeseven
- User
- Beiträge: 405
- Registriert: Freitag 7. Oktober 2005, 14:37
- Wohnort: Berlin
- Kontaktdaten:
LP-Filter in "C" nach Python transcribieren ?
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/fidA0DDEDE4842206D3E94128367D9A1182087FAD59.aspx
Meine Frage, weil hier ja viele C drauf haben. Was bedeuten die Zeilen:
[code=]#include <math.h>
#include "st_i.h"
#include "btrworth.h"[/code]
Wenn das irgendwelche Bibliotheken sind, für die es keine Equivalenz in Python gibt, kann ich es natürlich vergessen.
Und was bedeutet:
[code=]int st_lowpass_getopts (effp, n, argv) [/code]
im Deklarationsteil ?
Den Rest bekomme ich hoffentlich selbst raus.
Gruss, Seven
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/fidA0DDEDE4842206D3E94128367D9A1182087FAD59.aspx
Meine Frage, weil hier ja viele C drauf haben. Was bedeuten die Zeilen:
[code=]#include <math.h>
#include "st_i.h"
#include "btrworth.h"[/code]
Wenn das irgendwelche Bibliotheken sind, für die es keine Equivalenz in Python gibt, kann ich es natürlich vergessen.
Und was bedeutet:
[code=]int st_lowpass_getopts (effp, n, argv) [/code]
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.
- DatenMetzgerX
- User
- Beiträge: 398
- Registriert: Freitag 28. April 2006, 06:28
- Wohnort: Zürich Seebach (CH)
Re: LP-Filter in "C" nach Python transcribieren ?
snakeseven hat geschrieben:[code=]#include <math.h>
#include "st_i.h"
#include "btrworth.h"[/code]
Sind Libarys ....
- snakeseven
- User
- Beiträge: 405
- Registriert: Freitag 7. Oktober 2005, 14:37
- Wohnort: Berlin
- 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!
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!
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?
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?
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. 

mfg
Thomas
Thomas

- DatenMetzgerX
- User
- Beiträge: 398
- Registriert: Freitag 28. April 2006, 06:28
- Wohnort: Zürich Seebach (CH)
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)
(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: 405
- 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: 405
- Registriert: Freitag 7. Oktober 2005, 14:37
- Wohnort: Berlin
- Kontaktdaten:
So, hab jetzt mit Joghurts Link folgenden LP-Filter generiert (Ansi C):
[code=]
/*
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];
}
}[/code]
In Python müßte das meiner Meinung nach so aussehen:
Erzeugt leider nur Rauschen !?
Bestimmt habe ich irgendwas falsch nach Python konvertiert. Nur was ?
Gruss, Seven
[code=]
/*
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];
}
}[/code]
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
Wer ist online?
Mitglieder in diesem Forum: Bing [Bot]