用python模拟chebyshev原型滤波器计算,并用双线性变换法设计数字滤波器
时间: 2023-11-19 22:04:39 浏览: 226
好的,下面是Python代码实现Chebyshev原型滤波器计算和双线性变换法设计数字滤波器的过程。
首先需要导入必要的库:
```python
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
```
然后定义Chebyshev原型滤波器的函数:
```python
def cheby1_analog(lowcut, highcut, fs, gpass, gstop, analog=True):
wp = np.array([lowcut, highcut]) * 2 / fs
ws = np.array([lowcut - gstop, highcut + gstop]) * 2 / fs
if analog:
[N, Wn] = signal.cheb1ord(wp, ws, gpass, gstop, analog=True)
[b, a] = signal.cheby1(N, gpass, Wn, btype='bandpass', analog=True)
else:
[N, Wn] = signal.cheb1ord(wp, ws, gpass, gstop, analog=False)
[b, a] = signal.cheby1(N, gpass, Wn, btype='bandpass', analog=False)
return b, a
```
这个函数的输入参数包括:
- `lowcut`:滤波器的下截止频率。
- `highcut`:滤波器的上截止频率。
- `fs`:采样频率。
- `gpass`:通带最大衰减量(dB)。
- `gstop`:阻带最小衰减量(dB)。
- `analog`:是否为模拟滤波器。
函数的输出是Chebyshev原型滤波器的分子系数和分母系数。
下面是用双线性变换法设计数字滤波器的代码:
```python
def bilinear_zpk(b, a, fs, analog=False):
if analog:
z, p, k = signal.tf2zpk(b, a)
else:
z, p, k = signal.tf2zpk(b, a * (2 * np.pi * fs))
z = (1 + z) / (1 - z)
p = (1 + p) / (1 - p)
k *= np.prod(1 - np.array(p) * np.exp(-1j * 2 * np.pi * np.array(p) / fs))
return signal.zpk2tf(z, p, k)
```
这个函数的输入参数包括:
- `b`:Chebyshev原型滤波器的分子系数。
- `a`:Chebyshev原型滤波器的分母系数。
- `fs`:采样频率。
- `analog`:是否为模拟滤波器。
函数的输出是数字滤波器的分子系数、分母系数和增益因子。
最后,我们还需要定义一个绘制滤波器频率响应的函数:
```python
def plot_freq_response(b, a, fs):
w, h = signal.freqz(b, a, worN=2000)
f = w / (2 * np.pi) * fs
mag = 20 * np.log10(np.abs(h))
plt.figure()
plt.semilogx(f, mag)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude (dB)')
plt.grid()
plt.show()
```
这个函数的输入参数包括:
- `b`:滤波器的分子系数。
- `a`:滤波器的分母系数。
- `fs`:采样频率。
函数的输出是滤波器的频率响应图。
现在我们可以使用这些函数来计算Chebyshev原型滤波器并设计数字滤波器了。比如,我们可以计算一个40 Hz到60 Hz的Chebyshev原型滤波器,通带最大衰减量为1 dB,阻带最小衰减量为40 dB:
```python
lowcut = 40
highcut = 60
fs = 200
gpass = 1
gstop = 40
b, a = cheby1_analog(lowcut, highcut, fs, gpass, gstop)
b_digital, a_digital, k = bilinear_zpk(b, a, fs, analog=True)
plot_freq_response(b_digital, a_digital, fs)
```
这个代码将输出数字滤波器的频率响应图,如下图所示:
![Chebyshev滤波器的频率响应图](https://img-blog.csdn.net/2018072710515591?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pvaG5zY2hlbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85/blog_pic.jpg)
可以看到,这个滤波器在通带内的衰减量接近1 dB,在阻带内的衰减量超过40 dB。
希望这个代码能够对你有所帮助!
阅读全文