【发布时间】:2014-03-07 20:21:37
【问题描述】:
我正在尝试在 matlab 中设计和测试一个简单的数字高通滤波器。 我有两个脚本:第一个是设计过滤器,第二个是递归算法的实现
第一个脚本:过滤器的设计:
s=sym('s');
z=sym('z');
w=sym('w');
p=sym('p');
f=sym('f');
x=sym('x');
Pi=sym('Pi');
Ts=sym('Ts');
vc=sym('vc');
n=2;
Fspb=1/(s^2+sqrt(2)*s+1); % simple low pass butterworth
Fs=subs(Fspb, s, 2*Pi*vc/s); % tranform to high pass butterworth with vc cutting freq
Fz=subs(Fs, s, 2/Ts*(z-1)/(z+1)); %bilinear transformation
Fp=subs(Fz, z, exp(Ts*p))
Fw=subs(Fp, p, 1i*w);
Ff=subs(Fw, w, 2*Pi*f);
vmax=5000;
vc_val=1000; %1000 Hz
vccont=1/Pi/Ts*tan(Pi*Ts*vc_val);
Ts_val=0.0001
fval=0:0.1:vmax;
pretty(expand(Fz))
[num, den]=numden(Fz);
cn=coeffs(num,z)
cd=coeffs(den,z)
它给了我系数(对于 z)和滤波器的频率响应:
cn =
[ 1, -2, 1]
cd =
[ Pi^2*Ts^2*vc^2 - 2^(1/2)*Pi*Ts*vc + 1, 2*Pi^2*Ts^2*vc^2 - 2, Pi^2*Ts^2*vc^2 + 2^(1/2)*Pi*Ts*vc + 1]
这是使用freqz函数显示的mfilter:
还有我的第二个脚本,在一个简单的正弦函数上实现过滤器和测试:
Pi=3.14;
v=500;
Ts=0.0001;
x=0:Ts:100000*Ts;
y=sin(x*2*Pi*v); % sinus, freq=v
figure;
plot(x,y);
%% filter def
vc_val=1; %1000 Hz
vccont=1/Pi/Ts*tan(Pi*Ts*vc_val);
a=Pi^2*Ts^2*vccont^2;
b=sqrt(2)*Pi*Ts*vccont;
%% filtering
yf=zeros(1,size(y,2));
y1=0; y2=0; y3=0; y4=0; x1=0; x2=0; x3=0; x4=0;
for i=3:size(y,2)
if (i>1)
y1=yf(i-1);
x1=xyi-1);
if (i>2)
y2=yf(i-2);
x2=y(i-2);
end
end
yf(i)=1/(a-b+1)*(-(2*a-2)*y1-(a+b+1)*y2+y(i)-2*x1+x2);
end
figure;
plot(x,yf);
但它并没有给我我期望的结果(左:原始窦,右:切割频率的 1/2 处的过滤结果):
我检查了我的过滤器是否稳定,我看不出可能是什么问题。你有什么提示吗?
谢谢!
【问题讨论】:
-
你的第二个脚本只给出了 1 个
b系数。你不应该有 3 个吗? -
我不明白你说的只有一个
b系数是什么意思?b正好等于2^(1/2)*Pi*Ts*vc,不是分母的系数,分别是a-b+1、2a-2和a+b+1 -
您可以尝试使用过滤器命令吗?这会将问题缩小到过滤器功能或过滤器系数。还可以使用您的滤波器系数运行 freqz 或 fvtool 以检查您的响应。
-
谢谢!使用过滤器功能时,我得到的结果与我的算法相似,所以我猜问题出在过滤器设计上。我用 freqz 的结果更新了问题
标签: algorithm matlab filtering digital-filter