%零相移带通滤波器
clc
close all
clear all
% 滤波器设计
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 100;%100秒
t = 0:0.001:N;%时间
Fs = 1000;%采样率
% 滤波器通止参数设定;
fp=[0.1 15];
fs = [0.05 50];
rp = 1.5;
rs = 12;
wp = fp*2*pi/Fs;
ws = fs*2*pi/Fs;
% 阶次;
[n,wn] = buttord(wp/pi,ws/pi,rp,rs);
% 滤波器系数与辐频响应;
[b,a] = butter(n,wp/pi);
[h,w] = freqz(b,a,256,Fs);
h = 20*log10(abs(h));
figure(1)
plot(w,h);grid;ylabel('Bandpass DF');xlabel('Hz');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%信号的产生
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f1 = 0.001;%准直流
f2 = 5;%有用信号,取1Hz到10Hz之间
f3 = 50;%工频干扰
x1 = 100+10*sin(2*pi*f1*t);
x2 = 10*sin(2*pi*f2*t);
x3 = 10*sin(2*pi*f3*t);
figure(2)
subplot(3,1,1)
plot(t,x1);grid;
subplot(3,1,2)
plot(t,x2);grid;
subplot(3,1,3)
plot(t,x3);grid;
figure(3)
x = x1+x2+x3;
plot(t,x);grid;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
w_d = 200;
M = 1;%数据起始点%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%问题所在%%%%%%%%%%%%%%%%%%%%%%%%%%%
xn = x(M:80*w_d+M);%取x中一段数据xn
figure(4)
plot(xn);
n0 = length(xn);
L = 600;
for i = 1:L %前后延拓的数据
xa(i) = 2*xn(1)-xn(L+2-i);
xz(i) = 2*xn(n0)-xn(n0-i);
end
xnaz = [xa xn xz];%前后延拓
yaz = filtfilt(b,a,xnaz);%做零相位带通滤波
y = yaz((L+1):(L+n0)); %去延拓
figure(5)
plot(y);
%问题:数据起始点M的取值关系到边界效应。只有当M取1,401,801,1201……时边界失真才小,
%取其他值时边界失真都很大。请问各位其中原因,有何方法使无论起始点取何值都能边界失真维持
%在较小的范围内。
%程序本身能够独立运行,各位可调整M值看各图结果。
%谢谢大家了!:handshake :handshake
%延拓是根据武汉大学陈淑珍的一篇参考文献编写的,不知如何上传,但论坛中已有,感兴趣的朋友可查看
%论坛中貌似关于零相移滤波器的讨论不多,所以好找
%希望能够得到大家的指点:handshake