用python绘制一张高通切比雪夫滤波器阶数为2,5,8时的的频率响应对比图和一张高通巴特沃斯滤波器阶数为2,5,8时的的频率响应对比图,确保带阻频段幅值不超过带通频段的五分之一,并输出绘图用到的所有数据到csv文件
时间: 2024-05-12 15:15:47 浏览: 8
下面是使用Python绘制高通切比雪夫滤波器和高通巴特沃斯滤波器的频率响应的代码和步骤:
首先需要导入必要的库:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import csv
```
然后,我们定义一些变量,包括滤波器的参数和绘图的频率范围:
```python
# 高通切比雪夫滤波器的参数
rp = 0.5 # 最大衰减量(dB)
rs = 30 # 最小衰减量(dB)
wp = 0.2 # 通带端点频率
ws = 0.1 # 阻带端点频率
n = [2, 5, 8] # 滤波器阶数
# 高通巴特沃斯滤波器的参数
butter_n = [2, 5, 8] # 滤波器阶数
butter_wc = 0.2 # 截止频率
btype = 'highpass' # 滤波器类型
# 绘图参数
fs = 1000 # 采样频率
f = np.linspace(0, fs/2, 10000) # 频率范围
```
接下来,我们循环计算每个滤波器的频率响应,并将结果保存到CSV文件中:
```python
# 计算高通切比雪夫滤波器的频率响应
with open('chitchev.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['阶数', '频率', '幅值'])
for i in range(len(n)):
b, a = signal.cheby2(n[i], rs, wp, btype='highpass', analog=True)
w, h = signal.freqs(b, a, f)
plt.plot(w, abs(h), label='n={}'.format(n[i]))
for j in range(len(w)):
writer.writerow([n[i], w[j], abs(h[j])])
plt.title('Chebyshev Highpass Filter Response')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.legend()
plt.savefig('chitchev.png')
# 计算高通巴特沃斯滤波器的频率响应
with open('butter.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['阶数', '频率', '幅值'])
for i in range(len(butter_n)):
b, a = signal.butter(butter_n[i], butter_wc, btype='highpass', analog=True)
w, h = signal.freqs(b, a, f)
plt.plot(w, abs(h), label='n={}'.format(butter_n[i]))
for j in range(len(w)):
writer.writerow([butter_n[i], w[j], abs(h[j])])
plt.title('Butterworth Highpass Filter Response')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.legend()
plt.savefig('butter.png')
```
最后,我们可以得到两张图片文件“chitchev.png”和“butter.png”以及两个数据文件“chitchev.csv”和“butter.csv”,它们分别包含了高通切比雪夫滤波器和高通巴特沃斯滤波器的频率响应数据。这些数据可以用于进一步分析和处理。