Recréer le filtre de second ordre Matlab en python
Je souhaite créer des filtres personnalisés dans l' filterDesigner
outil Matlab , puis appliquer ces filtres à un grand ensemble de fichiers audio. Je veux utiliser python pour appliquer les filtres aux audios.
J'ai créé un filtre Butterworth dans Matlab et je l'ai exporté sous forme de fichier ASCII. Là-dedans, j'obtiens deux données. Matrice SOS et valeurs d'échelle . Ensuite, j'ai lu le fichier en python et obtenu la matrice SOS et filtré mon signal en utilisant le résultat comme suit (en utilisantscipy.sosfilt )
from scipy import signal
x_sos = signal.sosfilt(sos, x) # x is my signal
Le résultat que j'obtiens a la forme souhaitée sauf que l'amplitude est différente (j'ai appliqué le même filtre dans Matlab et comparé la sortie du code python). Je comprends que les valeurs d'échelle doivent entrer dans cette équation. Mais comment incorporer cela? Je ne comprends pas cette réponse . Cette question a des réponses expliquant les valeurs d'échelle, mais je n'ai toujours aucune idée de la façon dont je devrais l'utiliser dans le code python
EDIT: (Après avoir obtenu la réponse) À tous ceux qui s'intéressent au code final, le voici. Et il y a encore une explication dans ce fil
from scipy import signal
import numpy as np
x_sos = signal.sosfilt(sos, x) * np.prod(scale) # x is my signal
Réponses
Les valeurs d'échelle doivent être toutes $1$ sauf pour le premier Sauf si c'est $1$aussi. Multipliez votre signal de sortie avec cette première valeur d'échelle OU multipliez les trois premiers nombres dans les trois premières lignes de votre matrice SOS par ce nombre avant le filtrage.
ÉDITER
Il s'avère que le concepteur de filtres rend cela plus compliqué qu'il ne devrait l'être. Multipliez simplement toutes les valeurs d'échelle et multipliez la sortie avec le produit.