Значения окна Hanning не совпадают в Python и Matlab - PullRequest
1 голос
/ 07 июня 2019

Я работал в фильтре нижних частот, который должен фильтровать WAV-файл, используя окно Ханна и некоторые пользовательские цифровые фильтры.

Я сделал весь код для Matlab, и сегодня я написал егов Python, но когда я начал сравнивать значения функции hann в Python x Matlab, у нее НИЧЕГО не было ...

#python hanning
hanning(10)
# array([0., 0.11697778, 0.41317591, 0.75, 0.96984631, 0.96984631, 0.75, 0.41317591, 0.11697778, 0.])
%matlab hanning
hanning(10)
% ans =
%    0.0794
%    0.2923
%    0.5712
%    0.8274
%    0.9797
%    0.9797
%    0.8274
%    0.5712
%    0.2923
%    0.0794

Ответы [ 2 ]

4 голосов
/ 07 июня 2019

TL; WR:

Они используют разные определения. Матлаб, эквивалентный Numpy's hanning, равен hann, а не hanning.


В Matlab , hanning(n) создает симметричное окно. Из кода в файле hanning.m для четных n первая половина этого окна вычисляется как

m = n/2;
w = .5*(1 - cos(2*pi*(1:m).'/(n+1)))

, а затем полное окно получается как w = [w; w(end:-1:1)]. За исключением проблем с числовой точностью (которые, вероятно, являются причиной, по которой Matlab вычисляет только половину, а затем отражает ее), это эквивалентно

w = .5*(1 - cos(2*pi*(1:n).'/(n+1)));

В Numpy , согласно документации , формула другая. В синтаксисе Matlab это соответствует

w = .5*(1 - cos(2*pi*(0:n-1).'/(n-1)));

, что соответствует Matlab hann(n), как описано в его документации .

3 голосов
/ 07 июня 2019

В scipy.signal функция hanning устарела. Используемая функция: scipy.signal.hann.

numpy.hanning и scipy.signal.hann вычисляют одно и то же окно. Функции включают нулевые значения в конце окна. Чтобы соответствовать выводу функции Matlab, показанной в вопросе, добавьте 2 к аргументу scipy.signal.hann, а затем отбросьте нули на концах:

In [1]: from scipy.signal import hann                                                                                                                                           

In [2]: hann(12)                                                                                                                                                                
Out[2]: 
array([0.        , 0.07937323, 0.29229249, 0.57115742, 0.82743037,
       0.97974649, 0.97974649, 0.82743037, 0.57115742, 0.29229249,
       0.07937323, 0.        ])

In [3]: hann(12)[1:-1]                                                                                                                                                          
Out[3]: 
array([0.07937323, 0.29229249, 0.57115742, 0.82743037, 0.97974649,
       0.97974649, 0.82743037, 0.57115742, 0.29229249, 0.07937323])
...