Neuerstellung des Matlab-Filters zweiter Ordnung in Python

Nov 20 2020

Ich möchte einige benutzerdefinierte Filter im Matlab- filterDesignerTool erstellen und diese Filter dann auf eine große Anzahl von Audiodateien anwenden. Ich möchte Python verwenden, um die Filter auf die Audios anzuwenden.

Ich habe in Matlab einen Butterworth-Filter erstellt und ihn als ASCII-Datei exportiert. Dort bekomme ich zwei Daten. SOS-Matrix- und Skalierungswerte . Dann las ich die Datei in Python und bekam die SOS-Matrix und filterte mein Signal mit dem Ergebnis wie folgt ( mitscipy.sosfilt )

from scipy import signal

x_sos = signal.sosfilt(sos, x)  # x is my signal

Das Ergebnis, das ich erhalte, hat die gewünschte Form, außer dass die Amplitude unterschiedlich ist (ich habe denselben Filter in Matlab angewendet und die Ausgabe des Python-Codes verglichen). Ich verstehe, dass Skalenwerte in diese Gleichung einfließen müssen. Aber wie baue ich das ein? Ich verstehe diese Antwort nicht . Diese Frage enthält Antworten zur Erläuterung der Skalierungswerte, aber ich habe noch keine Ahnung, wie ich das im Python-Code verwenden soll


EDIT: (nach Erhalt der Antwort) Für alle, die sich für den endgültigen Code interessieren, hier ist er. Und in diesem Thread gibt es noch einmal eine Erklärung

from scipy import signal
import numpy as np

x_sos = signal.sosfilt(sos, x) * np.prod(scale)  # x is my signal

Antworten

1 Hilmar Nov 20 2020 at 21:15

Die Skalenwerte sollten alle sein $1$ außer dem ersten Es sei denn, das ist $1$zu. Multiplizieren Sie Ihr Ausgangssignal mit diesem ersten Skalenwert ODER multiplizieren Sie die ersten drei Zahlen in den ersten drei Zeilen Ihrer SOS-Matrix mit dieser Zahl, bevor Sie filtern.

BEARBEITEN

Es stellt sich heraus, dass der Filterdesigner dies komplizierter macht, als es sein muss. Multiplizieren Sie einfach alle Skalenwerte und multiplizieren Sie die Ausgabe mit dem Produkt.