im Rahmen meiner Projektarbeit soll ich einen Vergleich zwischen der Scipy Funktion lfilter() und einer C-Funktion die wie lfilter() funktioniert durchführen. Der Vergleich soll auf einem Raspberry Pi in Python stattfinden. Was bedeutet, dass man die C-Funktion in Python Aufrufen und Ausführen können muss.
Die C-Funktion die wie lfilter() funktioniert habe ich folgender Seite entnommen:https://github.com/frankxiongzz/lfilter ... r/lfiler.c
Mein Python-Code ist wie folgt aufgebaut:
Zuerst filtere ich ein Signal aus zufälligen Zahlen bestehend mit den angegebenen Filterkoeffizienten (diese habe ich aus einem Beispiel meines Professors übernommen) und lasse mir die Werte des gefilterten Signals ausgeben.
Im zweiten Teil lade ich die erstellte Library des C-Files, definiere die Koeffizienten ähnlich wie in der C main-Funktion und lasse mir die Ausgangswerte des gefilterten Signals ausgeben. Allerdings stimmen die Ausgangswerte nach Aufruf der C-Funktion nicht. Ich weiß nicht genau ob es sich um einen Fehler bei den Datentypen oder einen Definitionsfehler handelt. Ich würde mich auch als Python Anfängerin bezeichnen, deswegen bitte ich um Nachsicht und nur ernst gemeinte Korrekturvorschläge. Bei weiteren Fragen zum Code können Sie sich gerne melden.
Code: Alles auswählen
#### Filterfunktion in Python
# Defintion
import scipy.signal as scs
import matplotlib.pyplot as plt
import numpy as np
import ctypes
from numpy.ctypeslib import ndpointer
# lfilter()-Funktion in Python
b = np.array([0.0637,0,-0.1061,0,0.3183,0.5,0.3183,0,-0.1061,0,0.0637], dtype=np.float32)
plt.plot(b)
plt.xlabel('n')
plt.ylabel('h(n)')
plt.title('Impulsantwort des FIR-Filters')
# Zufallssignal
x = np.array([2,5,6,7,8,2,3,5,1,2,4,3,9,1], dtype=np.float32)
# lfilter()
y = scs.lfilter(b,1,x)
print('Python: y = ',y)
#### mit C Filter-Funktion
lib = ctypes.cdll.LoadLibrary("/home/pi/Dokumente/CodeLite/filter/filter.so")
cfilter = lib.bb_digital_float_filter
#cfilter(b, a, x, y, Z, len_b, len_x, stride_X, stride_Y)
a = np.array(1, dtype=np.float32)
y1 = np.array(np.zeros(1), dtype=np.float32)
delay = np.array(np.zeros(10), dtype=np.float32)
cfilter.restypes = ctypes.c_float
cfilter.argtypes = [ndpointer(shape=b.shape, dtype=ctypes.c_float),
ndpointer(shape=a.shape, dtype=ctypes.c_float),
ndpointer(dtype=ctypes.c_float),
ndpointer(shape=y1.shape, dtype=ctypes.c_float),
ndpointer(shape=delay.shape, dtype=ctypes.c_float),
ctypes.c_int, ctypes.c_uint, ctypes.c_int, ctypes.c_int]
for i in range(0,14):
cfilter(b,a,np.array(x[i]),y1,delay,11,1,1,1)
print('C: y =', y)
#fig, axs = plt.subplots(2)
#axs[0].plot(x)
#axs[0].set_title('Signal')
#axs[1].plot(y1)
#axs[1].set_title('Signal gefiltert mit Python')
#axs[2].plot(y2)
#axs[2].set_title('Signal gefiltert mit C')
#plt.show()
Code: Alles auswählen
>>>
================= RESTART: /home/pi/Dokumente/fir_filter.py =================
Python: y = [ 0.1274 0.31849999 0.16999999 -0.08460002 0.5096 1.97620004
4.38870006 6.92590009 7.48940012 5.93110007 4.14080008 3.28280004
3.4555 2.70720004]
C: y = [ 0.1274]
C: y = [ -4.36068723e+29]
C: y = [ inf]
C: y = [-inf]
C: y = [ nan]
C: y = [ nan]
C: y = [ nan]
C: y = [ nan]
C: y = [ nan]
C: y = [ nan]
C: y = [ nan]
C: y = [ nan]
C: y = [ nan]
C: y = [ nan]
>>>