首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中的Matlab freqz函数

Python中的Matlab freqz函数
EN

Stack Overflow用户
提问于 2015-04-14 06:37:30
回答 2查看 5.8K关注 0票数 2

我正在尝试为Matlab的频率响应函数实现Python等效。

代码语言:javascript
运行
复制
[h,f] = freqz(b, 1, 512, 12.5)

这里中描述。我目前的尝试

代码语言:javascript
运行
复制
f, h = scipy.signal.freqz(b, 1)

不会给出预期的结果。尝试参数worNwhole (参见这里)似乎解决不了这个问题。

应该怎么做呢?

编辑:

Matlab示例:

代码语言:javascript
运行
复制
>> [h, f] = freqz(1:5, 1, 512, 12.5)

h =

  15.0000 + 0.0000i
  14.9976 - 0.2454i
  14.9902 - 0.4907i
  14.9780 - 0.7358i
  14.9609 - 0.9806i
  14.9389 - 1.2250i
  ...

f =

         0
    0.0122
    0.0244
    0.0366
    0.0488
    0.0610
    ...

Python示例:

代码语言:javascript
运行
复制
>>> f, h = scipy.signal.freqz(range(1,6), 1)
>>> h
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,
        ...])
>>> f
array([ 0.        ,  0.00613592,  0.01227185,  0.01840777,  0.02454369,
        0.03067962,  ...])

换句话说,h函数给出了很好的值,但是f的值不匹配。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-14 11:38:02

在SciPy的1.2.0版本中,fs参数被添加到scipy.signal.freqz中。所以你可以写

代码语言:javascript
运行
复制
f, h = freqz(range(1, 6), 1, fs=12.5)

例如,

代码语言:javascript
运行
复制
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])

在较早版本的SciPy中,signal.signal.freqz没有以Hz返回频率的选项,因此您以后必须自己缩放频率。

与Matlab的等价

代码语言:javascript
运行
复制
[h, f] = freqz(b, a, n, fs)

使用来自freqzscipy.signal是:

代码语言:javascript
运行
复制
w, h = freqz(b, a, worN=n)
f = fs * w / (2*np.pi)

例如,

代码语言:javascript
运行
复制
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])
票数 1
EN

Stack Overflow用户

发布于 2015-04-14 09:06:45

在这两种语言中,freqz要求分子系数b作为第一个参数,而不是像您所写的a。应该是

freqz(b, a, ...)

看起来,您正在试图找到FIR滤波器的响应,对于FIR滤波器,只有分子系数,a总是1。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29620694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档