2014-02-10 105 views
1

我試圖在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] 

filter

這裏是MFILTER displaye d與freqz功能:

filter

和我的第二個腳本,實現一個簡單的正弦函數的過濾器和測試:

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的濾波結果):

results

我檢查了我的過濾器是穩定的,我看不出有什麼問題。你有沒有提示?

謝謝!

+0

你的第二個腳本只給出1'b'係數。你應該沒有3? – learnvst

+0

我不確定我是否明白你的意思是隻有一個'b'係數?'b'恰好等於'2 ^(1/2)* Pi * Ts * vc',它不是分母的係數,它們是'a-b + 1','2a-2'和'a' + b + 1' – Ben

+1

你可以嘗試使用過濾命令嗎?這將把問題縮小到濾波器功能或濾波器係數。同時運行freqz或fvtool與您的濾波器係數來檢查您的響應。 – Navan

回答

0

我發現這個問題,即matlab的numden()函數沒有給出正確的分子和分母。感謝那些花時間幫助我的人!

以下代碼給出了一個錯誤的結果:

z=sym('z'); 
Pi=sym('Pi'); 
Ts=sym('Ts'); 
vc=sym('vc'); 

Fz=1/((Pi^2*Ts^2*vc^2)/(z^2 - 2*z + 1) + (2^(1/2)*Pi*Ts*vc)/(z - 1) + (2*Pi^2*Ts^2*vc^2*z)/(z^2 - 2*z + 1) + (Pi^2*Ts^2*vc^2*z^2)/(z^2 - 2*z + 1) + (2^(1/2)*Pi*Ts*vc*z)/(z - 1) + 1) 

[num, den]=numden(Fz); 
cn=coeffs(num,z) 
cd=coeffs(den,z) 

MATLAB給出的係數:

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]

這是obvisoulsy錯

的感謝!

+0

你能澄清一下numden是否有bug或者你的使用不被支持? – Navan

+0

那麼,我很難說這是一個錯誤還是我沒有按預期使用它...... 我更新了我的回覆,給出了一個簡單的代碼示例,其中顯示了numdem的錯誤係數。我正在使用matlab 2011b – Ben

+0

你爲什麼說這些係數是錯誤的或者'numden'不工作?對我來說似乎是正確的。寫成的'Fz'不是標準形式,分子和分母是'z'中的多項式。嘗試'漂亮(簡化(FZ))'。這是'numden'操作的形式,係數來自哪裏。 – horchler

1

結果可能是正確的。你的正弦波頻率是500,你的採樣頻率是10000.你的標準化頻率是500/10000 = 0.05,它被過濾。所以你看到高度衰減的輸出。你應該增加你的正弦波頻率,並看看你是否在濾波後得到正弦波。

相關問題