Odtworzenie filtru drugiego rzędu Matlab w Pythonie

Nov 20 2020

Chcę utworzyć niestandardowe filtry w filterDesignernarzędziu Matlab , a następnie zastosować te filtry do dużego zestawu plików audio. Chcę użyć Pythona, aby zastosować filtry do audio.

Utworzyłem filtr Butterwortha w Matlabie i wyeksportowałem go jako plik ASCII. Tam mam dwie dane. Macierz SOS i wartości skali . Następnie przeczytałem plik w pythonie i otrzymałem macierz SOS i przefiltrowałem mój sygnał, używając wyniku w następujący sposób ( używającscipy.sosfilt )

from scipy import signal

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

Wynik, który otrzymuję, ma pożądany kształt, z wyjątkiem różnicy w amplitudzie (zastosowałem ten sam filtr w Matlabie i porównałem dane wyjściowe z kodu Pythona). Rozumiem, że wartości skali muszą być uwzględnione w tym równaniu. Ale jak to włączyć? Nie rozumiem tej odpowiedzi . To pytanie zawiera odpowiedzi wyjaśniające wartości skali, ale nadal nie mam pojęcia, jak powinienem tego użyć w kodzie Pythona


EDYCJA: (Po uzyskaniu odpowiedzi) Dla każdego, kto jest zainteresowany ostatecznym kodem, oto jest. W tym wątku znowu jest wyjaśnienie

from scipy import signal
import numpy as np

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

Odpowiedzi

1 Hilmar Nov 20 2020 at 21:15

Wartości skali powinny być wszystkimi $1$ z wyjątkiem pierwszego Chyba że to $1$także. Pomnóż sygnał wyjściowy przez pierwszą wartość skali LUB pomnóż pierwsze trzy liczby w pierwszych trzech wierszach macierzy SOS przez tę liczbę przed filtrowaniem.

EDYTOWAĆ

Okazuje się, że projektant filtrów sprawia, że ​​jest to bardziej zawiłe, niż powinno. Po prostu pomnóż wszystkie wartości skali i pomnóż wynik przez iloczyn.