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 — 滤波延迟初始条件
向量

滤波延迟初始条件,指定为 fi 向量或一维矩阵。

  • zi 的数据类型必须与 yzf 相同;
  • zi 长度必须是 length(b) -1;
  • zi 当前不支持录入 [],如果不想指定延迟,可使用 filter(b,1,x)。

数据类型: fi
复数支持:

# 输出参数

y — 滤波后的信号
向量 | 矩阵 | 数组

滤波后的信号,指定为 fi 向量或矩阵。

数据类型: fi

zf — 滤波延迟最终条件
向量 | 矩阵 | 数组

滤波延迟最终条件,指定为 fi 向量或一维矩阵。

数据类型: fi

# 建议

  • 以上 filter 函数接口仅支持一维 FIR 滤波;
  • 滤波系数 bnumerictype 可以不与 输入信号 x 相同;
  • 滤波延迟初始条件 zinumerictype 必须与 yzf 相同,如果想要指定滤波延迟初始条件,却不知道 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