首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB和SciPy给出了不同的“纽扣”函数的结果

MATLAB和SciPy给出了不同的“纽扣”函数的结果
EN

Stack Overflow用户
提问于 2015-01-20 22:36:39
回答 1查看 786关注 0票数 4

我正在尝试使用buttord函数设计一个模拟巴特沃斯过滤器(实际上,我正在移植一个从MATLAB到Python调用该函数的程序)。

我的参数是:

通带频率(Fp) = 10 Hz,Wp = 2*pi*10 Hz

停止频带频率(Fs) = 100 Hz,Ws = 2*pi*100 Hz

通带损耗和阻带损耗(Rp,Rs)分别为3和80 dB。

在MATLAB中,我使用以下代码:

代码语言:javascript
复制
Wp = 2 * pi * 10
Ws = 2 * pi * 100
Rp = 3
Rs = 80
[N, Wn] = buttord(Wp, Ws, Rp, Rs, 's')

这给了我N = 5Wn = 99.581776302

在SciPy中,我也尝试这样做:

代码语言:javascript
复制
from numpy import pi
from scipy import signal
Wp = 2 * pi * 10
Ws = 2 * pi * 100
Rp = 3
Rs = 80
(N, Wn) = signal.buttord(Wp, Ws, Rp, Rs, analog=True)

我得到了N = 5Wn = 62.861698649592753。Wn与MATLAB给出的值不同,并且奇怪地接近Wp。这里怎么了?

深入研究了SciPy的来源和问题,我发现此拉请求可以解释如下: MATLAB和SciPy有不同的设计目标(MATLAB试图优化匹配阻带频率,SciPy试图优化匹配通带频率)。

我正在使用MATLAB R2013a、Python3.4.2和SciPy 0.15.0 (如果这一点重要的话)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-21 17:15:13

(我还将以下内容张贴在“参与”邮件列表上。)

当你设计一个巴特沃斯过滤器与纽扣,没有足够的自由度,以满足所有的设计限制。因此,可以选择过渡区域的哪一端达到约束条件,哪一端是“过度设计”。在ciply0.14.0中所做的更改将该选择从停止带边缘切换到了通带边缘。

一张照片就能把它弄清楚。下面的脚本生成以下情节。(我把Rp从3变到1.5。-3 dB与Wn的增益一致,这就是为什么Wn与Wp相同的原因。使用旧的或新的约定生成的过滤器都满足设计约束。在新的惯例中,响应只是在通带结束时遇到约束。

代码语言:javascript
复制
import numpy as np
from scipy.signal import buttord, butter, freqs
import matplotlib.pyplot as plt


# Design results for:
Wp = 2*np.pi*10
Ws = 2*np.pi*100
Rp = 1.5      # instead of 3
Rs = 80

n_old = 5
wn_old = 99.581776302787929

n_new, wn_new = buttord(Wp, Ws, Rp, Rs, analog=True)

b_old, a_old = butter(n_old, wn_old, analog=True)
w_old, h_old = freqs(b_old, a_old)

b_new, a_new = butter(n_new, wn_new, analog=True)
w_new, h_new = freqs(b_new, a_new)


db_old = 20*np.log10(np.abs(h_old))
db_new = 20*np.log10(np.abs(h_new))

plt.semilogx(w_old, db_old, 'b--', label='old')
plt.axvline(wn_old, color='b', alpha=0.25)
plt.semilogx(w_new, db_new, 'g', label='new')
plt.axvline(wn_new, color='g', alpha=0.25)

plt.axhline(-3, color='k', ls=':', alpha=0.5, label='-3 dB')

plt.xlim(40, 1000)
plt.ylim(-100, 5)

xbounds = plt.xlim()
ybounds = plt.ylim()
rect = plt.Rectangle((Wp, ybounds[0]), Ws - Wp, ybounds[1] - ybounds[0],
                     facecolor="#000000", edgecolor='none', alpha=0.1, hatch='//')
plt.gca().add_patch(rect)
rect = plt.Rectangle((xbounds[0], -Rp), Wp - xbounds[0], 2*Rp,
                     facecolor="#FF0000", edgecolor='none', alpha=0.25)
plt.gca().add_patch(rect)
rect = plt.Rectangle((Ws, ybounds[0]), xbounds[1] - Ws, -Rs - ybounds[0],
                     facecolor="#FF0000", edgecolor='none', alpha=0.25)
plt.gca().add_patch(rect)

plt.annotate("Pass", (0.5*(xbounds[0] + Wp), Rp+0.5), ha='center')
plt.annotate("Stop", (0.5*(Ws + xbounds[1]), -Rs+0.5), ha='center')
plt.annotate("Don't Care", (0.1*(8*Wp + 2*Ws), -Rs+10), ha='center')

plt.legend(loc='best')
plt.xlabel('Frequency [rad/s]')
plt.ylabel('Gain [dB]')
plt.show()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28056404

复制
相关文章

相似问题

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