Les filtres sont souvent utilisés dans le traitement du signal du point de vue de la suppression du bruit. Implémentez le filtre FIR le plus simple en Python et C. On suppose que le filtre est évalué en fonction de Python, puis le résultat est incorporé dans une application basée sur le langage C.
La mise en œuvre du filtre FIR à l'aide de scipy est illustrée ci-dessous. Le signal d'origine «x» est un nombre aléatoire et le coefficient de filtre est calculé par «scipy.signal.firwin». Comparez le signal «y» après avoir appliqué le filtre par scipy et le signal «d» après avoir appliqué le filtre par solide.
#!/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 peut être n'importe quoi
x = np.random.rand(512)
plt.plot(x)
plt.show()
fs = 512 #Fréquence d'échantillonnage
nyq = fs / 2.0 #Fréquence de Nyquist
#Conception de filtre
f1 = 1 / nyq #Fréquence de coupure 1
f2 = 30.0 / nyq #Fréquence de coupure 2
numtaps = 255 #Nombre de coefficients de filtre(Impair)
b = scipy.signal.firwin(numtaps, f1) #Passe-bas
#b = scipy.signal.firwin(numtaps, f2, pass_zero=False) #Passe haut
#b = scipy.signal.firwin(numtaps, [f1, f2], pass_zero=False) #Passe de bande
#Sauvegarde des coefficients de filtre
with open('coeff.csv', 'w') as f:
writer = csv.writer(f, lineterminator='\n') #Code de saut de ligne (\n) est spécifié
writer.writerow(b)
#Filtre FIR par scipy
y = scipy.signal.lfilter(b, 1, x)
#Filtre FIR par écriture solide
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()
Signal d'origine
Après avoir appliqué le filtre (rouge: y, bleu: d)
Si le résultat solide sur Python est correct, déposez-le dans le code du langage C. C'est un peu brouillon, mais b
stocke un tableau de coeff.csv généré par le code Python. Puisqu'il est enregistré au format csv, si vous l'ouvrez avec un éditeur de texte, etc., vous pouvez le coller tel quel par copier-coller.
int sampleRate = 512
x= //Bien que ce soit approximatif, décrivez x correctement
float* filteredData = (float*)malloc(sizeof(float)*512);
float b[] = {} //Rugueux, mais coeff écrit en Python.Insérez le contenu de csv entre parenthèses
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)
C'est très simple, mais ce n'est qu'un mémorandum, alors pardonnez-moi, comment implémentez-vous le filtre FIR? Si cela aide quelqu'un qui dit.
Recommended Posts