Filter werden häufig in der Signalverarbeitung unter dem Gesichtspunkt der Rauschentfernung verwendet. Implementieren Sie den einfachsten FIR-Filter in Python und C. Es wird davon ausgegangen, dass der Filter basierend auf Python ausgewertet wird und das Ergebnis in eine auf C-Sprache basierende Anwendung integriert wird.
Die Implementierung des FIR-Filters mit scipy ist unten dargestellt. Das ursprüngliche Signal "x" ist eine Zufallszahl, und der Filterkoeffizient wird durch "scipy.signal.firwin" berechnet. Vergleichen Sie das Signal "y" nach dem Aufbringen des Filters mit scipy und das Signal "d" nach dem Aufbringen des Filters mit solid.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
import numpy as np
import scipy.signal
from pylab import *
import csv
import matplotlib.pyplot as plt
#x kann alles sein
x = np.random.rand(512)
plt.plot(x)
plt.show()
fs = 512 #Abtastfrequenz
nyq = fs / 2.0 #Nyquist-Frequenz
#Filterdesign
f1 = 1 / nyq #Grenzfrequenz 1
f2 = 30.0 / nyq #Grenzfrequenz 2
numtaps = 255 #Anzahl der Filterkoeffizienten(Seltsam)
b = scipy.signal.firwin(numtaps, f1) #Tiefpass
#b = scipy.signal.firwin(numtaps, f2, pass_zero=False) #Hochpass
#b = scipy.signal.firwin(numtaps, [f1, f2], pass_zero=False) #Bandpass
#Filterkoeffizienten speichern
with open('coeff.csv', 'w') as f:
writer = csv.writer(f, lineterminator='\n') #Zeilenvorschubcode (\n) angegeben ist
writer.writerow(b)
#FIR-Filter von scipy
y = scipy.signal.lfilter(b, 1, x)
#FIR-Filter durch festes Schreiben
d = np.zeros(fs)
for i in range(len(x)):
d[i] = 0
for j in range(len(b)):
if(i-j)>=0:
d[i] += b[j]*x[i-j]
plt.plot(y,color='r')
plt.plot(d,color='b')
plt.show()
Originalsignal
Nach dem Auftragen des Filters (rot: y, blau: d)
Wenn das solide Ergebnis in Python korrekt ist, legen Sie es in C-Sprachcode ab. Es ist ein bisschen chaotisch, aber b
speichert ein Array von Koeffizienten.csv, die durch Python-Code generiert wurden. Es wird im CSV-Format gespeichert. Wenn Sie es also mit einem Texteditor usw. öffnen, können Sie es kopieren und so einfügen, wie es ist.
int sampleRate = 512
x= //Obwohl es grob ist, beschreiben Sie x entsprechend
float* filteredData = (float*)malloc(sizeof(float)*512);
float b[] = {} //Rau, aber in Python geschrieben.Fügen Sie den Inhalt von csv in Klammern ein
for(int i=0;i<sampleRate;i++){
float d = 0;
for(int j=0; j<(sizeof b)/(sizeof b[0]); j++){
if((i-j)>=0){
d += b[j]*x[i-j];
}
}
filteredData[i]=d;
}
free(filteredData)
Es ist sehr einfach, aber es ist nur ein Memorandum. Verzeihen Sie mir, wie implementieren Sie den FIR-Filter? Wenn es jemandem hilft, der sagt.
Recommended Posts