Matlab freqz function in Python

Matlab freqz function in Python

In version 1.2.0 of SciPy, the fs argument was added to scipy.signal.freqz. So you can write

f, h = freqz(range(1, 6), 1, fs=12.5)

For example,

In [18]: f, h = freqz(range(1, 6), 1, fs=12.5)                                                

In [19]: len(f)                                                                               
Out[19]: 512

In [20]: f[:10]  # Matches the Matlab output shown in the question.                                                                       
Out[20]: 
array([0.        , 0.01220703, 0.02441406, 0.03662109, 0.04882812,
       0.06103516, 0.07324219, 0.08544922, 0.09765625, 0.10986328])

In older versions of SciPy,
signal.signal.freqz doesnt have an option to return the frequencies in Hz, so youll have to scale the frequencies yourself afterwards.

The equivalent of Matlabs

[h, f] = freqz(b, a, n, fs)

using freqz from scipy.signal is:

w, h = freqz(b, a, worN=n)
f = fs * w / (2*np.pi)

For example,

In [15]: import numpy as np

In [16]: from scipy.signal import freqz

In [17]: w, h = freqz(range(1,6), 1, worN=512)

In [18]: h[:6]
Out[18]: 
array([ 15.00000000+0.j        ,  14.99755288-0.24541945j,
        14.99021268-0.49073403j,  14.97798292-0.73583892j,
        14.96086947-0.98062944j,  14.93888050-1.22500102j])

In [19]: w[:6]
Out[19]: 
array([ 0.        ,  0.00613592,  0.01227185,  0.01840777,  0.02454369,
        0.03067962])

In [20]: f = 12.5*w/(2*np.pi)

In [21]: f[:6]
Out[21]: 
array([ 0.        ,  0.01220703,  0.02441406,  0.03662109,  0.04882812,
        0.06103516])

In both languages freqz expects numerator coefficients b for the first argument, not a like you wrote. Should be

freqz(b, a, ...)

Looks like you are trying to find the response of an FIR filter, for which there are only numerator coefficients and a is always 1.

Matlab freqz function in Python

Leave a Reply

Your email address will not be published. Required fields are marked *