2026a
# filter
fi 对象一维 FIR 滤波
函数库:TyFixedPoint
# 语法
y = filter(b,1,x)
y,zf = filter(b,1,x,zi)
# 说明
y = filter( b, 1, x ) 使用 fi 向量 b 描述的滤波器对 fi 向量 x 进行滤波,滤波后的数据在 fi 向量 y 中返回。
- 当 x 为向量时,对整个向量滤波;
- 当 x 为二维矩阵时,对第一个长度不为 1 的行或列进行滤波;
- 多维数组目前暂不支持。
y, zf = filter( b, 1, x, zi ) 使用 fi 向量 zi 作为滤波的初始延迟,向量 zi 的长度等于滤波器向量 b 的长度减 1,zi 的定标属性必须与 y = filter(b,1,x) 返回的 y 相同。
注意
以上 API 仅支持 fi 定点类型的一维滤波,不支持非定点数及二维以上的多维数组。
y = filter(b,1,x,zi,dim) 仍在开发中,暂不对外开放。
注意:
# 示例
从定点正弦波信号中滤除高频部分
从同时包含低频和高频定点正弦波的信号中滤除高频信号。
using TyFixedPoint
w1 = 0.1*pi;
w2 = 0.6*pi;
n = 0:1:999;
xd = Array{Float64}(undef,1000);
for i in 0:999
xd[i+1] = sin(w1*i) + sin(w2*i);
end
x = fi(xd,1,12);
b = fi([0.1:0.1:1;1-0.1:-0.1:0.1]/4,0,10);
gd = Int((length(b)-1)/2);
y = filter(b,1,x);
绘制结果,适应滤波器的延迟。
using TyPlot
plot(n[1:end-gd],x[1:end-gd])
hold("on")
plot(n[1:end-gd],y[gd+1:end],"r--")
axis([0 50 -2 2])
legend("Unfiltered Signal","Filtered Signal")
xlabel("Sample Index (n)")
ylabel("Signal Value")

# 输入参数
b — 滤波系数向量
滤波系数,指定为 fi 向量或一维矩阵。
数据类型: fi
复数支持: 否
x — 输入信号向量 | 矩阵 | 数组
输入信号,指定为 fi 向量或矩阵。
数据类型: fi
复数支持: 否
zi — 滤波延迟初始条件向量
# 输出参数
y — 滤波后的信号向量 | 矩阵 | 数组
滤波后的信号,指定为 fi 向量或矩阵。
数据类型: fi
zf — 滤波延迟最终条件向量 | 矩阵 | 数组
滤波延迟最终条件,指定为 fi 向量或一维矩阵。
数据类型: fi
# 建议
- 以上 filter 函数接口仅支持一维 FIR 滤波;
- 滤波系数 b 的 numerictype 可以不与 输入信号 x 相同;
- 滤波延迟初始条件 zi 的 numerictype 必须与 y 和 zf 相同,如果想要指定滤波延迟初始条件,却不知道 zi 的类型参数,可先执行 filter(b,1,x),参考返回值 y 的类型进行设置;
- 第二个参数必须为 1 或 1.0。
# 算法
滤波长度(L)
滤波长度为滤波系数向量 b 的长度。
滤波阶数(N)
滤波阶数为滤波延迟向量 zi 的长度,等于滤波系数 b 的长度减 1。
FIR 滤波器
该函数使用 Direct-Form Transposed FIR 这个差分方程实现:
y[n] = b[1] * x[n] + b[2] * x[n-1] + ... + b[L] * x[n-N]
下图为 FIR 滤波器结构。

fimath 传播规则
- 输入数据的 fimath 属性仅用于中间计算过程;
- 输出数据始终绑定默认的 fimath;
- 如果 zi 设置了 fimath,zf 会保留 zi 的 fimath 属性。
# 另请参阅
fi | numerictype | fimath