我試圖在matlab中設計和測試一個簡單的數字高通濾波器。 我有兩個腳本:第一個是設計的過濾器,第二個是FO遞歸算法matlab中的數字濾波沒有給出預期的結果
1腳本執行:過濾器的desgn:
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]
這裏是MFILTER displaye d與freqz功能:
和我的第二個腳本,實現一個簡單的正弦函數的過濾器和測試:
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? – learnvst
我不確定我是否明白你的意思是隻有一個'b'係數?'b'恰好等於'2 ^(1/2)* Pi * Ts * vc',它不是分母的係數,它們是'a-b + 1','2a-2'和'a' + b + 1' – Ben
你可以嘗試使用過濾命令嗎?這將把問題縮小到濾波器功能或濾波器係數。同時運行freqz或fvtool與您的濾波器係數來檢查您的響應。 – Navan