Recréer le filtre de second ordre Matlab en python

Nov 20 2020

Je souhaite créer des filtres personnalisés dans l' filterDesigneroutil 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

1 Hilmar Nov 20 2020 at 21:15

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.