MATLAB中的filter(1维数字滤波器)函数
1、语法:
y = filter(b,a,x)
2、说明:
y = filter(b,a,x) 使用由分子和分母系数 b 和 a 定义的有理传递函数 对输入数据 x 进行滤波。
如果 a(1) 不等于 1,则 filter 按 a(1) 对滤波器系数进行归一化。因此,a(1) 必须是非零值。
1. 如果 x 为向量,则 filter 将滤波后数据以大小与 x 相同的向量形式返回。
2. 如果 x 为矩阵,则 filter 沿着第一维度操作并返回每列的滤波后的数据。
3. 如果 x 为多维数组,则 filter 沿大小不等于 1 的第一个数组维度进行计算。
3、输入参数
3.1、b
— 有理传递函数的分子系数
向量
有理传递函数的分子系数,指定为向量。
数据类型:
double
| single
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
复数支持: 是
3.2、a
— 有理传递函数的分母系数
向量
有理传递函数的分母系数,指定为向量。
数据类型:
double
| single
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
复数支持: 是
3.3、x
— 输入数据
向量 | 矩阵 | 多维数组
输入数据,指定为向量、矩阵或多维数组。
数据类型:
double
| single
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
复数支持: 是
4、有理传递函数
Z 变换域中这种 filter
运算的输入-输出说明是一种有理传递函数。有理传递函数采用如下形式:
,可同时处理 FIR 和 IIR 滤波器 [1]。na 是反馈滤波器阶数,nb 是前馈滤波器阶数。由于归一化,假定 a(1) = 1。
还可以将有理传递函数表示为以下差分方程:
此外,也可以使用如下图所示的 direct-form II 转置实现表示有理传递函数。此处,
na = nb = n-1。
filter
在样本 m 处的运算由时域差分方程给定
5、MATLAB实例
matlab代码:
clear;
close all;
clc;
%选择要用的数据并导入
filepath=strcat('******');
x=xlsread(filepath,"***");
y=x;
%对数据进行归一化处理
y= y/max(y);
%采样频率
samplerate = 25600;
%带通截止频率
fbpl = 10;
fbph = samplerate/2-1;
%带通滤波器
w1=fbpl/(samplerate/2);
w2=fbph/(samplerate/2);
[b2,a2]=butter(2,[w1 w2],'bandpass');
%进行带通滤波
outData=filter(b2,a2,y);
运行如上代码:
注:右侧数据为导入数据
运行结果:
注:右侧为给导入数据做带通滤波后的数据
下面让我们来看JAVA代码:
如图所示:我们导入了和MATLAB一致的数据
运行:
double[] litFilter=filter2(BandpassB,BandpassA,MaxList);后的结果如下图:
//带通滤波参数
double[] BandpassA=new double[5];
double[] BandpassB=new double[5];
if (SampleRate==25600){
BandpassA[0]=1;
BandpassA[1]=0.003123898595380;
BandpassA[2]=-1.996177032017240;
BandpassA[3]=-0.003111993949613;
BandpassA[4]=0.996189177160662;
BandpassB[0]=0.998092769815188;
BandpassB[1]=0;
BandpassB[2]=-1.996185539630380;
BandpassB[3]=0;
BandpassB[4]=0.998092769815188;
}