Har*_*ime 6 python response filter
我有一个与这篇文章直接相关的新问题- 在Python中构建我有一个具有给定特征的二阶IIR带通滤波器[以下代码是故意惯用的]:
fs = 40e6           # 40 MHz f sample frequency
fc = 1e6/fs         # 1 MHz center cutoff
BW = 20e3/fs        # 20 kHz bandwidth 
fl = (fc - BW/2)/fs # 0.99 MHz f lower cutoff
fh = (fc + BW/2)/fs # 1.01 MHz f higher cutoff
给出系数:
R  = 1 - (3*BW)
K  = (1 - 2*R*np.cos(2*np.pi*fc) + (R*R)) / (2 - 2*np.cos(2*np.pi*fc))
a0 = 1 - K                       # a0 =  0.00140
a1 = 2*(K-R)*np.cos(2*np.pi*fc)  # a1 =  0.00018 
a2 = (R*R) - K                   # a2 = -0.00158
b1 = 2*R*np.cos(2*np.pi*fc)      # b1 =  1.97241
b2 = -(R*R)                      # b2 = -0.99700
正如ukrutt在上一篇文章中所建议的那样,我使用了scipy.signal.freqz,但遗憾的是没有得到我想要的响应 - 我说相信过滤器按预期工作(代码如下).这是freqz的结果:

我的问题是:我如何生成更像预期响应的图表?
码:
a = [0.0014086232031758072, 0.00018050359364826498, -0.001589126796824103]
b = [1.9724136161684902, -0.9970022500000001]
w,h  = signal.freqz(a, b)
h_dB = 20 * np.log10(np.abs(h))
plt.plot(w/np.max(w),h_dB)
plt.grid()
使用线性 x 比例你不会看到任何漂亮的东西。我不知道 numpy,但我熟悉 matlab,并且有一些函数可以在日志中进行绘图。尝试使用 x-log 刻度:
import matplotlib.pyplot  as pyplot
fig = pyplot.figure()
ax = fig.add_subplot(2,1,1)    
line, = ax.plot(w/np.max(w), h_dB, color='blue', lw=2)
ax.set_xscale('log')
show()
顺便说一句,我还没有测试过,我没有安装 python :(
编辑:
我尝试在 matlab 中为一个 IIR 滤波器阶数 4 和一个 IIR 滤波器阶数 20 建模巴特沃斯滤波器。
%!/usr/local/bin/matlab
%% Inputs
fs = 40e6;
fc = 1e6;
BW = 20e3;
fl = (fc - BW/2);
fh = (fc + BW/2);
%% Build bandpass filter IIR Butterworth order 4
N   = 4;        % Filter Order
h  = fdesign.bandpass('N,F3dB1,F3dB2', N, fl, fh, fs);
Hd1 = design(h, 'butter');
%% Build bandpass filter IIR Butterworth order 50
N   = 20;        % Filter Order
h  = fdesign.bandpass('N,F3dB1,F3dB2', N, fl, fh, fs);
Hd2 = design(h, 'butter');
%% Compare
fvtool(Hd1,Hd2);


这里是第一个滤波器的系数 A 和 B:
FilterStructure: 'Direct-Form II Transposed'                                               
A: [2.46193004641106e-06 0 -4.92386009282212e-06 0 2.46193004641106e-06]     
B: [1 -3.94637005453608 5.88902106889851 -3.93761314372475 0.995566972065978]
如果我有时间,我会尝试用 numpy 做同样的事情!
| 归档时间: | 
 | 
| 查看次数: | 3784 次 | 
| 最近记录: |