用python绘制一张切比雪夫滤波器阶数为2,5,8时的的频率响应对比图和一张巴特沃斯滤波器阶数为2,5,8时的的频率响应对比图,确保带阻频段幅值不超过带通频段的五分之一,并输出绘图用到的所有数据到csv文件
时间: 2024-05-06 11:17:13 浏览: 140
好的,我们可以使用Python中的SciPy库来实现这个需求。具体步骤如下:
1. 安装必要的库
```python
!pip install numpy scipy matplotlib pandas
```
2. 导入必要的库
```python
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
import pandas as pd
```
3. 定义滤波器参数
```python
# 切比雪夫滤波器
rp = 0.5 # 通带最大衰减量,单位dB
rs = 30 # 阻带最小衰减量,单位dB
wp = 0.2 # 通带边缘频率,归一化频率,0~0.5
ws = 0.3 # 阻带边缘频率,归一化频率,0~0.5
n = [2, 5, 8] # 滤波器阶数
# 巴特沃斯滤波器
wp1 = 0.2 # 通带边缘频率1,归一化频率,0~0.5
wp2 = 0.3 # 通带边缘频率2,归一化频率,0~0.5
ws1 = 0.15 # 阻带边缘频率1,归一化频率,0~0.5
ws2 = 0.35 # 阻带边缘频率2,归一化频率,0~0.5
n2 = [2, 5, 8] # 滤波器阶数
```
4. 绘制切比雪夫滤波器频率响应对比图并输出数据到csv文件
```python
# 绘制切比雪夫滤波器频率响应对比图
plt.figure(figsize=(10, 8))
plt.title("Comparison of Chebyshev Filters")
plt.xlabel("Normalized Frequency")
plt.ylabel("Amplitude (dB)")
for i in range(len(n)):
b, a = signal.cheby1(n[i], rp, wp, 'lowpass')
w, h = signal.freqz(b, a)
plt.plot(w / np.pi, 20 * np.log10(abs(h)), label="Chebyshev Order {}".format(n[i]))
df = pd.DataFrame({'Frequency': w / np.pi,
'Chebyshev Order {}'.format(n[i]): abs(h)})
df.to_csv('chebyshev_order_{}.csv'.format(n[i]), index=False)
plt.legend()
plt.show()
```
5. 绘制巴特沃斯滤波器频率响应对比图并输出数据到csv文件
```python
# 绘制巴特沃斯滤波器频率响应对比图
plt.figure(figsize=(10, 8))
plt.title("Comparison of Butterworth Filters")
plt.xlabel("Normalized Frequency")
plt.ylabel("Amplitude (dB)")
for i in range(len(n2)):
wn = [wp1, wp2]
b, a = signal.butter(n2[i], wn, 'bandstop')
w, h = signal.freqz(b, a)
plt.plot(w / np.pi, 20 * np.log10(abs(h)), label="Butterworth Order {}".format(n2[i]))
df = pd.DataFrame({'Frequency': w / np.pi,
'Butterworth Order {}'.format(n2[i]): abs(h)})
df.to_csv('butterworth_order_{}.csv'.format(n2[i]), index=False)
plt.legend()
plt.show()
```
6. 运行完毕后,当前目录下会生成6个csv文件,分别对应每个滤波器的不同阶数的频率响应数据。你可以使用Pandas库读取这些csv文件并进行进一步的数据分析和处理。
阅读全文