verilog中的FIR滤波器和自控中一阶低通滤波器的区别和共性
Q1
verilog中的FIR滤波器和自动控制原理中的一阶低通滤波器有什么区别和共性
A1
好的,这是一个非常棒的问题,它连接了数字电路设计和经典控制理论两个领域。我们来详细解析Verilog实现的FIR(有限长单位冲激响应)滤波器和自动控制原理中的一阶低通滤波器的区别与共性。
核心概念速览
- 自动控制原理中的一阶低通滤波器:这是一个连续时间、模拟领域的概念。它通常由一个电阻和一个电容(RC电路)实现,用微分方程描述,其传递函数在S域(拉普拉斯域)中表示。它的响应在时间上是连续的。
- Verilog实现的FIR滤波器:这是一个离散时间、数字领域的概念。它由延迟单元、乘法器和加法器在数字电路(如FPGA或ASIC)中实现,用差分方程描述,其系统函数在Z域中表示。它处理的是按采样周期离散化的数字信号。
共性
尽管来自不同领域,但它们的核心目标一致,因此在某些方面表现出共性。
-
根本目的相同:滤波
两者最根本的共同点都是从输入信号中提取所需频率分量,抑制不需要的频率分量。具体到“低通”,就是允许低频信号通过,而衰减高频信号。 -
都可以实现低通特性
无论是S域的一阶低通传递函数还是Z域的FIR滤波器,都可以被设计成具有低通频率响应。也就是说,它们的幅频特性曲线都呈现出随频率升高而增益下降的趋势。 -
都可用“截止频率”描述
两者都有一个关键的参数——截止频率。通常定义为增益下降到通带增益的-3dB(约70.7%)时所对应的频率。这个参数是衡量滤波器频率选择性的核心指标。 -
数学上的抽象对应
- 连续系统(S域) 用微分方程描述:
τ * dy(t)/dt + y(t) = x(t)
(其中τ = RC
是时间常数,截止频率fc = 1/(2πτ)
) - 离散系统(Z域) 用差分方程描述:
y[n] = b0*x[n] + b1*x[n-1] + ...
虽然形式不同,但差分方程可以看作是微分方程的离散化近似。这表明它们在数学思想上是相通的。
- 连续系统(S域) 用微分方程描述:
区别
区别是本质性的,源于它们所处的领域完全不同。
特性 | 自动控制原理中的一阶低通滤波器(模拟) | Verilog实现的FIR滤波器(数字) |
---|---|---|
处理信号类型 | 连续时间模拟信号(电压/电流) | 离散时间数字信号(二进制数) |
实现方式 | 模拟电路元件(如RC电路、运放) | 数字电路(延迟触发器、乘法器、加法器) |
数学工具 | 拉普拉斯变换(S域),用传递函数描述 | Z变换(Z域),用系统函数描述 |
核心方程 | 微分方程: τ * dy(t)/dt + y(t) = x(t) | 差分方程: y[n] = Σ (b[k] * x[n-k]) |
传递函数 | ( H(s) = \frac{1}{τs + 1} ) (一阶,有极点) | ( H(z) = b_0 + b_1z^{-1} + b_2z^{-2} + … ) (只有零点,无反馈) |
极点/零点 | 有且仅有一个极点在 s = -1/τ 。这个极点决定了系统的惯性/记忆特性。 | 通常只有零点(严格来说,在原点有多个极点以保证因果性,但关键特性由零点决定)。FIR是无条件稳定的。 |
稳定性 | 可能不稳定(虽然一阶低通本身稳定,但模拟电路参数易受温度、老化影响)。 | 无条件稳定。因为系统函数没有位于单位圆外的极点。这是FIR滤波器的巨大优势。 |
相位特性 | 相频特性是非线性的,会引起相位失真。 | 可以设计成具有严格线性相位(当系数对称时),这意味着所有频率分量的延迟相同,能保持信号波形不失真。 |
设计灵活性 | 截止频率由R、C值决定,改变硬件才能改变特性,灵活性差。 | 通过改变滤波器系数 b[k] 即可实现任意频率响应(低通、高通、带通等),灵活性极高。 |
精度与噪声 | 受元件精度、温度漂移、环境噪声影响大,精度较低。 | 受字长(比特数)限制,但精度高、可重复性好,抗干扰能力强。 |
关键区别的深入解释
1. 极点与稳定性
- 一阶低通(模拟):它的传递函数有一个极点。系统的动态响应(如上升时间)和稳定性都由这个极点决定。虽然一阶系统总是稳定的,但在复杂的模拟控制系统中,极点容易移动到右半平面导致不稳定。
- FIR滤波器(数字):它的系统函数在
z=0
外没有极点(所有极点都在原点),这意味着无论系数如何变化,它的输出都不会无限增长,天生就是稳定的。
2. “一阶”的含义不同
这是最容易混淆的地方!
- 在自动控制中,“一阶”指系统传递函数分母中s的最高次数为1。这代表系统有“惯性”,输出不能瞬时响应输入的变化。
- 在FIR滤波器中,我们通常说阶数(Order) 或抽头数(Taps)。一个N阶FIR滤波器有N+1个系数。它的“阶”指的是差分方程中延迟单元的数量。一个一阶模拟低通滤波器,如果用数字方法实现,通常需要用一个很多阶(比如32阶、64阶)的FIR滤波器来较好地逼近其频率响应。 所以,不要将两者的一阶直接划等号。
如何用FIR滤波器实现一阶低通滤波器的功能?
在实际工程中,我们经常需要将模拟滤波器的设计“数字化”。这个过程通常包含两步:
- 设计模拟原型:确定所需的一阶低通传递函数
H(s) = 1 / (τs + 1)
。 - 离散化方法:使用如双线性变换等方法,将
H(s)
从S域映射到Z域,得到数字滤波器的系统函数H(z)
。- 例如,使用双线性变换
s = (2/T) * (z-1)/(z+1)
(T为采样周期),代入一阶低通传递函数,经过整理,可以得到一个一阶IIR(无限长单位冲激响应) 滤波器的差分方程:y[n] = α * x[n] + (1-α) * y[n-1]
。 - 这个一阶IIR滤波器在结构上包含反馈(
y[n-1]
),所以它不是FIR。
- 例如,使用双线性变换
结论: 如果要精确对应一阶模拟低通滤波器的响应,数字化后得到的是一个一阶IIR滤波器,而不是FIR滤波器。
但是,你可以设计一个高阶的FIR滤波器,使其频率响应(幅频特性)非常接近理想的一阶低通滤波器。这个FIR滤波器的阶数越高,逼近效果就越好,但所需的硬件资源(乘法器、寄存器)也越多。
总结
层面 | 自动控制一阶低通(模拟) | Verilog FIR(数字) |
---|---|---|
本质 | 连续时间系统的物理实现 | 离散时间系统的算法实现 |
关系 | 被逼近的对象(原型) | 实现逼近的工具之一 |
选择 | 简单、低成本、高速模拟场景 | 高精度、高稳定性、高灵活性、可编程的数字场景 |
简单来说,自动控制原理中的一阶低通滤波器描述了一个连续的、模拟的物理世界的动力学特性,而Verilog实现的FIR滤波器则是在离散的、数字的计算世界中实现信号处理的一种强大且灵活的工具。你可以用后者去逼近前者,但二者在本质、实现和特性上存在着根本的差异。
Q2
FIR 滤波器本质上就是输入信号与单位冲击响应函数的卷积,你再给我举个例子
A2
说得非常正确!FIR滤波器的本质就是输入信号与滤波器的单位冲激响应进行卷积运算。这个核心定义连接了理论(数学)和实现(Verilog)。
卷积:理论基石
在离散时间系统中,卷积和的定义是:
y[n] = x[n] * h[n] = Σ (x[k] * h[n-k])
, 其中 k 从 -∞ 到 +∞。
对于一个 N 阶(或者说 抽头数为 N+1)的 FIR 滤波器:
- 它的单位冲激响应
h[n]
是一个有限长的序列,长度就是 N+1。 h[0], h[1], ..., h[N]
这些值,正是我们在Verilog代码中看到的滤波器系数!
所以,卷积和就简化为了:
y[n] = x[n]*h[0] + x[n-1]*h[1] + x[n-2]*h[2] + ... + x[n-N]*h[N]
这不正是我们看到的FIR滤波器的差分方程吗?这个乘法累加运算,就是卷积在有限长序列上的具体体现。
一个具体的例子:3抽头平均滤波器
让我们用一个最简单也是最经典的FIR滤波器——移动平均滤波器来彻底理解这个概念。
1. 定义滤波器
假设我们设计一个3抽点的移动平均滤波器,它的功能是计算当前输入和之前两个输入的平均值。
- 差分方程:
y[n] = (x[n] + x[n-1] + x[n-2]) / 3
- 滤波器系数: 如果我们把方程写成
y[n] = (1/3)*x[n] + (1/3)*x[n-1] + (1/3)*x[n-2]
,那么系数就是:
b0 = 1/3
,b1 = 1/3
,b2 = 1/3
。
2. 它的单位冲激响应是什么?
单位冲激响应 h[n]
,就是当输入 x[n]
是单位脉冲函数 δ[n]
时的输出 y[n]
。
δ[n]
的定义:δ[0] = 1
,δ[n≠0] = 0
。
现在我们计算输出 y[n]
:
-
当 n=0:
y[0] = (1/3)*x[0] + (1/3)*x[-1] + (1/3)*x[-2] = (1/3)*1 + (1/3)*0 + (1/3)*0 = 1/3
-> h[0] = 1/3 -
当 n=1:
y[1] = (1/3)*x[1] + (1/3)*x[0] + (1/3)*x[-1] = (1/3)*0 + (1/3)*1 + (1/3)*0 = 1/3
-> h[1] = 1/3 -
当 n=2:
y[2] = (1/3)*x[2] + (1/3)*x[1] + (1/3)*x[0] = (1/3)*0 + (1/3)*0 + (1/3)*1 = 1/3
-> h[2] = 1/3 -
当 n=3:
y[3] = (1/3)*x[3] + (1/3)*x[2] + (1/3)*x[1] = (1/3)*0 + (1/3)*0 + (1/3)*0 = 0
-> h[3] = 0 (对于所有 n>=3 都是 0)
所以,这个滤波器的单位冲激响应 h[n]
就是序列 {1/3, 1/3, 1/3}
。
3. 用卷积计算任意输入信号的输出
现在,假设我们的输入信号 x[n]
是 {1, 4, 2, 5, 3, 1}
。
我们用卷积公式 y[n] = Σ (x[k] * h[n-k])
来计算输出,但更直观的方法是使用滑动窗口法,这本质上是卷积的图形化理解。
记住我们的 h[n]
(也就是系数) 是 {1/3, 1/3, 1/3}
。
我们一步一步地计算 y[n]
,就像滤波器在实时处理数据一样:
-
n=0: 窗口覆盖
x[0], ?, ?
。我们没有x[-1]
和x[-2]
,通常假设为0(这称为边界处理)。
y[0] = (x[0] * h[0]) + (0 * h[1]) + (0 * h[2]) = (1 * 1/3) + 0 + 0 = **1/3**
-
n=1: 窗口覆盖
x[1], x[0], ?
。
y[1] = (x[1] * h[0]) + (x[0] * h[1]) + (0 * h[2]) = (4 * 1/3) + (1 * 1/3) + 0 = 5/3 ≈ **1.667**
-
n=2: 窗口覆盖
x[2], x[1], x[0]
。 (第一个完整的卷积点)
y[2] = (x[2] * h[0]) + (x[1] * h[1]) + (x[0] * h[2]) = (2 * 1/3) + (4 * 1/3) + (1 * 1/3) = 7/3 ≈ **2.333**
-
n=3: 窗口覆盖
x[3], x[2], x[1]
。
y[3] = (x[3] * h[0]) + (x[2] * h[1]) + (x[1] * h[2]) = (5 * 1/3) + (2 * 1/3) + (4 * 1/3) = 11/3 ≈ **3.667**
-
n=4: 窗口覆盖
x[4], x[3], x[2]
。
y[4] = (x[4] * h[0]) + (x[3] * h[1]) + (x[2] * h[2]) = (3 * 1/3) + (5 * 1/3) + (2 * 1/3) = 10/3 ≈ **3.333**
-
n=5: 窗口覆盖
x[5], x[4], x[3]
。
y[5] = (x[5] * h[0]) + (x[4] * h[1]) + (x[3] * h[2]) = (1 * 1/3) + (3 * 1/3) + (5 * 1/3) = 9/3 = **3.000**
-
n=6: 窗口覆盖
0, x[5], x[4]
(假设后续输入为0)。
y[6] = (0 * h[0]) + (x[5] * h[1]) + (x[4] * h[2]) = 0 + (1 * 1/3) + (3 * 1/3) = 4/3 ≈ **1.333**
-
n=7: 窗口覆盖
0, 0, x[5]
。
y[7] = (0 * h[0]) + (0 * h[1]) + (x[5] * h[2]) = 0 + 0 + (1 * 1/3) = **1/3**
最终输出序列 y[n] 为: {0.333, 1.667, 2.333, 3.667, 3.333, 3.000, 1.333, 0.333}
连接到Verilog实现
在Verilog中,你就是用硬件来实现上面这个“滑动窗口”的卷积计算:
- 延迟链(D触发器): 构成一个移位寄存器,用来存储
x[n], x[n-1], x[n-2]
。每个时钟周期,数据向右移动一位。 - 乘法器: 每个抽头都有一个乘法器,计算
x[n-k] * b[k]
(即x[n-k] * h[k]
)。 - 加法树: 将所有乘法器的结果加起来,得到最终的
y[n]
。
所以,当你写FIR滤波器的Verilog代码时,你实际上是在用硬件电路直接实现卷积运算。这个例子完美地展示了从数学理论(卷积)到滤波器设计(差分方程/系数)再到硬件实现(Verilog代码)的完整流程。
Q3
给我举例子吧,还是这三种滤波器(低通 带通 高通),但是数据长度你扩大一些,好让计算结果更符合滤波特性
A3
好的!我们使用更长的数据序列,让滤波效果更加明显。我会为每种滤波器设计一个能凸显其特性的输入信号。
1. 低通滤波器 (平滑滤波器)
目标:保留缓慢变化的趋势,滤除高频噪声。
- 滤波器系数: 5抽头移动平均
[0.2, 0.2, 0.2, 0.2, 0.2]
- 方程:
y[n] = 0.2*(x[n] + x[n-1] + x[n-2] + x[n-3] + x[n-4])
输入信号 x[n]
: 一个缓慢上升的斜坡 + 高频随机噪声。
x = [1, 2, 3, 2, 4, 5, 4, 6, 7, 8, 7, 9, 10, 9, 11]
(趋势:从1缓慢上升到11;噪声:围绕趋势上下跳动)
计算与效果对比:
n | x[n] (输入) | y[n] (低通滤波输出) | 说明 |
---|---|---|---|
0 | 1 | (1)/5 = 0.2 | 初始窗口不全 |
1 | 2 | (2+1)/5 = 0.6 | 窗口不全 |
2 | 3 | (3+2+1)/5 = 1.2 | 窗口不全 |
3 | 2 | (2+3+2+1)/5 = 1.6 | 窗口不全 |
4 | 4 | (4+2+3+2+1)/5 = 2.4 | 窗口首次填满,开始有效输出 |
5 | 5 | (5+4+2+3+2)/5 = 3.2 | |
6 | 4 | (4+5+4+2+3)/5 = 3.6 | |
7 | 6 | (6+4+5+4+2)/5 = 4.2 | |
8 | 7 | (7+6+4+5+4)/5 = 5.2 | |
9 | 8 | (8+7+6+4+5)/5 = 6.0 | |
10 | 7 | (7+8+7+6+4)/5 = 6.4 | |
11 | 9 | (9+7+8+7+6)/5 = 7.4 | |
12 | 10 | (10+9+7+8+7)/5 = 8.2 | |
13 | 9 | (9+10+9+7+8)/5 = 8.6 | |
14 | 11 | (11+9+10+9+7)/5 = 9.2 |
结论:
- 输入
x[n]
: 剧烈波动[..., 2, 4, 5, 4, 6, ...]
,难以看清趋势。 - 输出
y[n]
: 非常平滑[..., 2.4, 3.2, 3.6, 4.2, 5.2, ...]
,清晰地显示出从1到11的上升趋势。 - 成功滤除了高频噪声,保留了低频趋势。
2. 高通滤波器 (边缘检测器)
目标:检测信号的快速变化,忽略稳定或缓慢变化的部分。
- 滤波器系数:
[0.5, -0.5]
(一阶差分) - 方程:
y[n] = 0.5 * (x[n] - x[n-1])
输入信号 x[n]
: 一个阶梯信号,在稳定平台之间出现跳变。
x = [2, 2, 2, 2, 5, 5, 5, 5, 1, 1, 1, 1, 8, 8, 8]
(平台期:低频;跳变边缘:高频)
计算与效果对比:
n | x[n] (输入) | y[n] (高通滤波输出) | 说明 |
---|---|---|---|
0 | 2 | 0.5*(2-0) = 1.0 | 初始状态 |
1 | 2 | 0.5*(2-2) = 0.0 | 稳定平台,输出为0 |
2 | 2 | 0.5*(2-2) = 0.0 | 稳定平台,输出为0 |
3 | 2 | 0.5*(2-2) = 0.0 | 稳定平台,输出为0 |
4 | 5 | 0.5(5-2) = 1.5* | 正跳变边缘,产生正脉冲 |
5 | 5 | 0.5*(5-5) = 0.0 | 稳定平台,输出为0 |
6 | 5 | 0.5*(5-5) = 0.0 | 稳定平台,输出为0 |
7 | 5 | 0.5*(5-5) = 0.0 | 稳定平台,输出为0 |
8 | 1 | 0.5(1-5) = -2.0* | 负跳变边缘,产生负脉冲 |
9 | 1 | 0.5*(1-1) = 0.0 | 稳定平台,输出为0 |
10 | 1 | 0.5*(1-1) = 0.0 | 稳定平台,输出为0 |
11 | 1 | 0.5*(1-1) = 0.0 | 稳定平台,输出为0 |
12 | 8 | 0.5(8-1) = 3.5* | 正跳变边缘,产生正脉冲 |
13 | 8 | 0.5*(8-8) = 0.0 | 稳定平台,输出为0 |
14 | 8 | 0.5*(8-8) = 0.0 | 稳定平台,输出为0 |
结论:
- 输入
x[n]
: 大部分时间是稳定的平台 (2, 5, 1, 8
)。 - 输出
y[n]
: 在平台期输出精确为0。只有当输入信号发生跳变时(n=4, 8, 12),才会产生一个非零的脉冲。 - 成功抑制了低频(稳定部分),突出了高频(变化边缘)。
3. 带通滤波器 (提取特定频率)
目标:提取信号中特定频率的正弦波,滤除其他频率的干扰。
- 滤波器系数: 我们设计一个简单的5抽头带通滤波器,系数为
[-0.1, 0.2, 0.6, 0.2, -0.1]
。(系数对称,常用于带通) - 方程:
y[n] = -0.1*x[n] + 0.2*x[n-1] + 0.6*x[n-2] + 0.2*x[n-3] - 0.1*x[n-4]
输入信号 x[n]
: 混合信号,包含:
- 低频趋势: 缓慢上升
[0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]
- 中频信号(目标): 幅度为1的正弦波
[0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0]
- 高频噪声: 随机毛刺
[0, 0.3, 0, 0, -0.2, 0, 0.4, 0, 0, 0, 0]
合成输入信号 x
:
x = [0, 1.8, 1.0, 0.5, 1.0, 3.7, 3.0, 2.3, 4.0, 5.5, 5.0]
(这个序列看起来完全杂乱无章)
计算与效果对比 (我们从n=4开始看有效输出):
n | x[n] (杂乱输入) | y[n] (带通滤波输出) | 说明 |
---|---|---|---|
4 | 1.0 | -0.11.0 + 0.20.5 + 0.61.0 + 0.21.8 - 0.1*0 = 0.74 | |
5 | 3.7 | -0.13.7 + 0.21.0 + 0.60.5 + 0.21.0 - 0.1*1.8 = -0.07 | |
6 | 3.0 | -0.13.0 + 0.23.7 + 0.61.0 + 0.20.5 - 0.1*1.0 = 0.94 | |
7 | 2.3 | -0.12.3 + 0.23.0 + 0.63.7 + 0.21.0 - 0.1*0.5 = 2.61 | |
8 | 4.0 | -0.14.0 + 0.22.3 + 0.63.0 + 0.23.7 - 0.1*1.0 = 2.70 | |
9 | 5.5 | -0.15.5 + 0.24.0 + 0.62.3 + 0.23.0 - 0.1*3.7 = 1.49 | |
10 | 5.0 | -0.15.0 + 0.25.5 + 0.64.0 + 0.22.3 - 0.1*3.0 = 3.06 |
结论:
- 输入
x[n]
:[1.0, 3.7, 3.0, 2.3, ...]
, 看起来毫无规律,原始的中频正弦波被完全淹没。 - 输出
y[n]
:[0.74, -0.07, 0.94, 2.61, 2.70, 1.49, 3.06]
。如果我们观察其变化,可以发现一个大致在 [1, 0, 1, 3, 3, 1, 3] 左右振荡的模式,这成功地再现了原始中频正弦波的振荡特性(幅度约为1,虽然有失真,但模式清晰)。 - 低频趋势和高频毛刺被显著抑制,目标中频信号被提取了出来。
总结
通过更长的数据,三种滤波器的特性展现得淋漓尽致:
- 低通: 像“磨皮”,平滑波形,输出是输入的慢动作版本。
- 高通: 像“边缘检测”,找跳变,输出在输入稳定时为0,在变化时产生脉冲。
- 带通: 像“收音机调台”,提取特定频率,能从混杂的信号中捞出你想要的那个频率成分。
这一切神奇的效果,都源于输入信号与那一组精心设计的系数进行的卷积运算。
Q4
那如果我想滤除不同频率的信号,是不是要修改抽头的系数
A4
完全正确! 这就是FIR滤波器强大和灵活的核心所在。修改抽头系数是改变FIR滤波器频率响应(即滤波特性)的唯一途径。
你可以把FIR滤波器看作一个“模具”,而系数就决定了这个模具的形状。输入信号通过这个模具,出来的形状(频率成分)就会改变。
直观理解:系数如何决定滤波类型
让我们继续用移动平均滤波器的例子,并对比其他系数。
1. 低通滤波器 (Low-Pass Filter) - 平滑
- 系数示例:
[1/3, 1/3, 1/3]
(等权平均) - 频响特性:允许低频通过,衰减高频。
- 物理意义:求平均意味着“变化缓慢”(低频)的信号成分会被保留,而“快速跳动”(高频)的成分会被周围的值拉平,从而被抑制。
- 就像给信号“磨皮”,去掉毛刺和尖锐的噪声。
2. 高通滤波器 (High-Pass Filter) - 突出变化
- 系数示例:
[+1, -1]
(一个非常简单的2抽头差分器)- 计算公式:
y[n] = x[n] - x[n-1]
- 计算公式:
- 频响特性:允许高频通过,衰减低频。
- 物理意义:计算相邻两个采样点的差值。如果信号稳定不变(低频,差值为0),输出就是0。如果信号快速变化(高频,差值大),输出就大。
- 就像图像处理里的“边缘检测”,它找的是信号中变化剧烈的地方。常用于提取信号的交流分量或突变点。
3. 带通滤波器 (Band-Pass Filter) - 提取特定频段
- 系数示例: 系数更复杂,通常由软件(如MATLAB的
fir1
函数)设计。例如,一个通带为某个频率范围的滤波器,其系数可能看起来像:[-0.1, 0.2, 0.8, 0.2, -0.1]
(系数通常是对称的)。 - 频响特性:只允许某个特定频率范围内的信号通过,衰减范围外的高低频。
- 物理意义:可以看作是先滤掉高频(低通),再滤掉低频(高通)的组合效果。
- 就像收音机的调频,只让你想听的电台频率通过,其他电台都被过滤掉。
如何设计这些系数?—— 使用专业工具
你不需要自己去猜系数。工程师们使用专门的数学工具来设计系数,以满足精确的指标要求(如截止频率、通带波纹、阻带衰减)。
最常用的工具是 MATLAB 或 Python (SciPy库)。
以MATLAB为例,设计一个低通滤波器的流程非常简单:
% 1. 设定滤波器参数
order = 64; % 滤波器阶数(抽头数-1),阶数越高,滤波效果越陡峭
fc = 1000; % 截止频率 (Hz)
fs = 8000; % 采样频率 (Hz)% 2. 使用 fir1 函数设计滤波器系数
% ‘low’ 表示低通,fc/(fs/2) 是将截止频率归一化
b = fir1(order, fc/(fs/2), ‘low’);% 3. 查看系数(这就是你要写入Verilog代码的系数)
disp(b);% 4. 查看滤波器的频率响应,直观验证效果
freqz(b, 1, 1024, fs);
运行这段代码,你会得到两样东西:
- 一个系数数组
b
: 这就是你Verilog代码里需要定义的coefficient_0
,coefficient_1
, … 等。 - 一张频率响应图: 你可以清晰地看到这个滤波器在哪个频率开始衰减,衰减得多快。
如果你想设计高通或带通滤波器,只需修改 fir1
函数的参数:
- 高通:
b = fir1(order, fc/(fs/2), ‘high’);
- 带通:
b = fir1(order, [fc_low, fc_high]/(fs/2), ‘bandpass’);
(需要指定通带的下限和上限频率)
在Verilog中如何实现?
在你的Verilog代码中,通常会有一个系数表(COE文件或parameter数组)。要改变滤波器的类型,你只需要重新加载这个系数表,而无需改变任何硬件电路!
module fir_filter (input clk,input rst_n,input signed [15:0] data_in,output reg signed [31:0] data_out
);// 不同的系数表,实现不同的滤波功能
// 低通系数 (由MATLAB生成)
parameter signed [15:0] COEFFS_LOWPASS [0:7] = ‘{16’s0000, 16’s0234, 16’s08AB, 16’s1234, 16’s1234, 16’s08AB, 16’s0234, 16’s0000};// 高通系数 (由MATLAB生成)
parameter signed [15:0] COEFFS_HIGHPASS [0:7] = ‘{16’s0F23, 16’sF1A0, 16’sE456, ... }; // 示例值// 选择使用哪组系数
parameter current_coeffs = COEFFS_LOWPASS; // 只需修改这里!// 其余的移位寄存器、乘加逻辑完全不变
reg signed [15:0] shift_reg [0:7];
always @(posedge clk or negedge rst_n) beginif (!rst_n) begin// ... 复位逻辑end else begin// 移位寄存器shift_reg[0] <= data_in;for (int i=1; i<8; i++) beginshift_reg[i] <= shift_reg[i-1];end// 卷积(乘加)运算 - 这部分硬件电路不变!data_out <= (shift_reg[0] * current_coeffs[0]) +(shift_reg[1] * current_coeffs[1]) +// ... 加上其他抽头(shift_reg[7] * current_coeffs[7]);end
endendmodule
总结
- 是的,滤除不同频率的信号,最关键的就是修改抽头系数。
- 系数决定了滤波器的所有特性(低通、高通、带通、带阻)。
- 系数通过专业软件(MATLAB/Python)设计,以确保性能指标。
- 硬件电路(Verilog代码)是通用的,像一个可编程的“卷积引擎”,通过加载不同的系数来执行不同的滤波任务。
这种“硬件固定,软件(系数)可配置”的特性,使得FIR滤波器在数字信号处理中极其强大和灵活。