# 数字滤波器设计思路及模拟报告

**实验任务：** 详述数字滤波器的设计思路，并进行 FIR 与 IIR 的对比模拟
**实验环境：** Python 3.14 (NumPy, SciPy, Matplotlib)
**文件路径：** `Homework/Digital_Filter_Design/`

---

## 1. 实验目的
理解数字滤波器（Digital Filter）的设计流程与核心思想，掌握从频域技术指标出发，分别设计无限长脉冲响应（IIR）和有限长脉冲响应（FIR）滤波器的方法，并通过编程模拟比较它们的时域滤波效果和频域响应特性。

---

## 2. 数字滤波器设计的基本思路

设计一个数字滤波器，通常需要遵循以下四个主要步骤：

### Step 1: 确定技术指标 (Specifications)
在设计之前，首先必须明确我们希望滤波器达到的性能要求。这通常包括：
- **通带截止频率 ($\omega_p$)** 和 **阻带截止频率 ($\omega_s$)**：决定了滤波器保留和滤除信号的频率边界。
- **通带波纹 ($R_p$ 或 $A_p$)**：允许信号在通带内波动的最大幅度（通常用 dB 表示）。
- **阻带衰减 ($A_s$)**：在阻带内信号必须衰减到的最低 dB 值。

### Step 2: 选择滤波器类型与逼近方法 (Approximation)
根据对相位的要求和系统资源的限制，选择 IIR 或 FIR：

#### A. IIR 滤波器（无限长脉冲响应）
- **核心思想**：利用已有的成熟**模拟滤波器**（如巴特沃斯 Butterworth、切比雪夫 Chebyshev、椭圆 Elliptic 等）的设计公式，先设计出模拟滤波器系统函数 $H_a(s)$，然后通过转换方法将其映射为数字滤波器的系统函数 $H(z)$。
- **转换方法**：
  1. **脉冲响应不变法**：保持时域脉冲响应的离散采样一致。缺点是存在频谱混叠。
  2. **双线性变换法**（Bilinear Transform）：将整个虚轴映射到单位圆上，避免了混叠，但会引入频率畸变（频率轴扭曲，需要预畸变处理）。
- **特点**：可以用**极低的阶数**达到很陡峭的幅频特性（高衰减），但相位通常是非线性的。

#### B. FIR 滤波器（有限长脉冲响应）
- **核心思想**：直接在离散域设计。因为不存在反馈（只有零点，极点全在原点），它天生稳定。
- **设计方法**：
  1. **窗函数法 (Window Method)**：用理想滤波器的无限长脉冲响应截断（乘以窗函数如 Hamming, Hanning 等）来得到有限长的响应。
  2. **频率采样法 (Frequency Sampling)**：在频域直接采样期望的频率响应，再通过 IDFT 得到时域系数。
  3. **最佳等波纹逼近法 (Parks-McClellan/Remez)**：使用优化算法让通带和阻带的误差最小化。
- **特点**：可以实现**严格的线性相位**（信号各频率成分延迟相同，波形不失真），但为了达到同样的阻带衰减，需要的**阶数远高于 IIR**。

### Step 3: 计算滤波器系数 (Coefficient Calculation)
确定了逼近方法后，通过计算得到数字滤波器 $H(z)$ 的分子多项式系数 $b$ 和分母多项式系数 $a$。
$$ H(z) = \frac{\sum_{k=0}^{M} b_k z^{-k}}{1 + \sum_{k=1}^{N} a_k z^{-k}} $$
*(注：对于 FIR 滤波器，所有的 $a_k = 0$，即分母为 1)*

### Step 4: 结构实现与验证 (Realization & Verification)
选择具体的网络结构（直接型、级联型、并联型等）进行硬件或软件实现，并分析有限字长效应（量化误差、溢出等）。

---

## 3. 模拟代码解析与结果分析

为了直观对比两种滤波器的设计思路，我使用 Python 编写了模拟代码 `filter_design_sim.py`。

### 3.1 模拟场景设定
- **采样频率 ($f_s$)**：1000 Hz
- **输入信号**：混合了 $10\text{ Hz}$（有用信号）、$100\text{ Hz}$ 和 $250\text{ Hz}$（高频噪声）的正弦波叠加信号。
- **设计目标**：设计一个低通滤波器，**截止频率设为 $50\text{ Hz}$**，滤除 $100\text{ Hz}$ 及以上的噪声。

### 3.2 IIR 与 FIR 滤波器设计参数
1. **IIR 滤波器**：使用了巴特沃斯 (Butterworth) 滤波器，阶数仅设定为 **4 阶**。
2. **FIR 滤波器**：使用了基于 Hamming 窗的窗函数法，抽头数（阶数+1）设定为 **101 阶**。

### 3.3 结果波形分析

![Digital Filter Design Simulation](digital_filter_design_sim.png)

#### 观察时域（上半图：Time Domain）
- 灰色的线是混有高频噪声的原始信号。
- 黑色的虚线是纯净的 10 Hz 目标信号。
- 红线 (IIR) 和蓝线 (FIR) 都非常成功地滤除了高频毛刺，恢复了平滑的正弦波，几乎与纯净信号（黑虚线）完全重合。
- （*注：代码中使用了 `filtfilt` 进行零相位滤波，因此时域波形没有表现出相移延迟，方便直观对比*）

#### 观察频域（下半图：Frequency Response）
- **IIR 滤波器（红线，4阶）**：在通带内极其平坦（巴特沃斯滤波器的特性），在截止频率 50 Hz（绿虚线）处下降到 -3 dB，随后快速衰减。仅仅 4 阶的极点就提供了非常可观的衰减斜率。
- **FIR 滤波器（蓝线，101阶）**：在阻带内由于 Hamming 窗的特性，表现出周期性的旁瓣衰减（约在 -50 dB 左右震荡）。为了达到和 4 阶 IIR 相近的主瓣过渡带陡峭程度，FIR 被迫使用了高达 101 的抽头数。

---

## 4. 结论与设计思路总结

通过模拟可以清晰地印证数字滤波器的核心设计取舍：
1. **如果系统对实时性、计算资源（乘法器数量）要求严苛，且对相位失真不敏感**：应优先选择 **IIR 滤波器**，它能用极低的阶数换取强大的幅频滤波性能。
2. **如果系统处理的是图像、音频、心电图等对相位极度敏感的信号**，要求波形形状在滤波后不发生畸变：必须选择 **FIR 滤波器**，尽管这需要更多的乘累加（MAC）运算资源。
