Сборка фильтра с Python и MATLAB, результаты не совпадают - PullRequest
0 голосов
/ 20 марта 2019

Я хочу перевести этот код MATLAB на Python, наверное, я все сделал правильно, хотя я не получил те же результаты.

Сценарий MATLAB:

n=2   %Filter_Order
Wn=[0.4 0.6]  %# Normalized cutoff frequencies 
[b,a] = butter(n,Wn,'bandpass') % Transfer function coefficients of the filter

Pythonscript:

import numpy as np
from scipy import signal

n=2   #Filter_Order
Wn=np.array([0.4,0.6]) # Normalized cutoff frequencies 
b, a = signal.butter(n, Wn, btype='band') #Transfer function coefficients of the filter 

a коэффициенты в MATLAB: 1, -5.55e-16, 1.14, -1.66e-16, 0.41

a коэффициенты в Python: 1, -2.77e-16, 1.14, -1.94e-16, 0.41

Может ли это быть просто вопросомточность, поскольку оба различных значения (второе и четвертое) имеют порядок 10^(-16)?!

Коэффициенты b одинаковы с другой стороны.

1 Ответ

4 голосов
/ 20 марта 2019

Точность вашей машины составляет около 1e-16 (в MATLAB это легко проверить с помощью eps(), я предполагаю, что то же самое в Python).Таким образом, «ошибка», с которой вы имеете дело, имеет порядок точности станка, то есть фактически не рассчитывается в пределах точности подгонки.

Также следует отметить, что MATLAB ~ = Python (или! = В Python), таким образом,реализации butter() с одной стороны и signal.butter() с другой будут немного отличаться, даже если вы используете точно такие же числа из-за того, что оба языка переводятся в машинный код.

Редко имеет значение иметь коэффициенты, отличающиеся на 16 порядков;меньшие были бы по существу забыты.Если вам нужны точные значения, рассмотрите возможность использования символьной математики или некоторой арифметики с переменной точностью (vpa() в MATLAB), но я полагаю, что в вашем случае разница не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...