xiongyihui / notes

Notes
https://xiongyihui.github.io/notes/
3 stars 0 forks source link

filter design #23

Open xiongyihui opened 5 years ago

xiongyihui commented 5 years ago

滤波器设计

窗函数法设计FIR滤波器

https://wenku.baidu.com/view/a75c0e9cc281e53a5802ff8a.html https://www.cnblogs.com/xinyuyuanm/archive/2013/05/24/3098176.html https://zhuanlan.zhihu.com/p/24318554

窗函数的主瓣宽度和旁瓣抑制是要权衡的点,主瓣越小,旁瓣衰减越弱。 主瓣小,则滤波器过渡带越小。 矩形窗的主瓣小,但旁瓣衰减太弱,而且信号泄漏严重。

kaiser窗有一个调整参数调整主瓣大小和旁瓣衰减,在matlab、octave或scipy中,可以通过kaiserord()函数设计。 比如matlab代码:

fs = 48000;
fcuts = [8000*0.96 8000];
mags = [1 0];
devs = [0.01 0.001];

[n,Wn,beta,ftype] = kaiserord(fcuts, mags, devs, fs)
hh = fir1(n, Wn, ftype, kaiser(n+1, beta), 'noscale');

freqz(hh)

python代码:

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

fs = 48000
cutoff = 8000 - 0.04 * 8000
width = 0.04 * 8000
ripple = 65
numtaps, beta = signal.kaiserord(ripple, width/(0.5*fs))
taps = signal.firwin(numtaps, cutoff=cutoff, window=('kaiser', beta), scale=False, fs=fs)

w, h = signal.freqz(taps, worN=8000)
w *= 0.5*fs/np.pi  # Convert w to Hz.
plt.plot(w, 20*np.log10(np.abs(h)))
plt.show()

通过零、极点设计滤波器

https://zhuanlan.zhihu.com/p/45138629