我有信号数据要使用带通滤波器进行滤波,频率为10-45s,45-150s和150-600s。如何在matlab中创建带通滤波器命令来过滤那些频率?
答案 0 :(得分:9)
假设您有信号处理工具箱(对于butter
命令 - 如果butter
不可用,请参阅较低的代码),如果您知道采样频率fs
,则可以制作使用以下代码使用低频和高频(以Hz为单位)-3dB的简单递归巴特沃斯滤波器。较高的order
s会以更长的脉冲响应和更多的计算费用为代价提供更好的异频抑制。
[b,a] = butter(order, [lowFreq hiFreq]/(fs/2), 'bandpass');
y = filter(b,a,x)
输出信号y
是通过使用x
命令生成的系数对输入信号butter
进行滤波而获得的。
如果您想同时获得所有3个波段的输出,您可以将3个独立滤波器操作的输出相加,每个波段一个。但是,如果要保留波段之间的相位关系,您可能希望在执行此操作时使用filtfilt
命令而不是filter
。
如果您没有信号处理工具箱,可以使用下面的代码创建二阶带通butterworth系数,其中dt = 1/fs
和fl
和fu
是低和高截止频率。
function [ b, a ] = butterTwoBp( dt, fl, fu )
q=pi*dt*(fu-fl);
r=pi*dt*(fu+fl);
N = (tan(q)^2) + sqrt(2)*tan(q) + 1;
M = (tan(q)^2) / N; %M after N because it depends on N
O = -cos(r) * (2*sqrt(2)*tan(q) + 4) / ((cos(q))*N);
P = (-2*(tan(q)^2) + (( (2*cos(r)) / (cos(q)) )^2) + 2 ) / N;
Q = cos(r)*(2*sqrt(2)*tan(q) - 4)/(cos(q)*N);
R = ( (tan(q)^2) - sqrt(2)*tan(q) + 1 ) / N;
b=[M 0 -2*M 0 M];
a=[1 O P Q R];