Search This Blog

Thursday, April 21, 2016

Low Pass and High Pass Filter

Low pass နဲ့ high pass filter လေးတွေက အမြဲသုံးနေ၊ တွေ့နေ ရလို့ သူတို့ နဲ့ ပတ်သက်တဲ့ note အချို့ ရေးချ ထားချင်ပါတယ်။ ရိုးရှင်းတဲ့ first order RC circuit လေးတွေ အတွက်ပါပဲ။


Figure. Low pass and high pass filter.



Figure. First order RC low pass filter (Wikipedia)



Figure. First order RC high pass filter (Wikipedia)


Voltage divider အနေနဲ့ စဉ်းစားပြီး သူတို့ရဲ့ \(V_o\) နဲ့ \(V_i\) ဆက်သွယ်ချက် \(\mathbf{H}\) ကို အောက်က အတိုင်း ဖော်ပြနိုင်ပါတယ်။ $$ \begin{equation} \mathbf{H}_{lp}(\mathbf{s})=\frac{1}{\mathbf{s}RC+1} \end{equation} $$

$$ \begin{equation} \mathbf{H}_{hp}(\mathbf{s})=\frac{\mathbf{s}RC}{\mathbf{s}RC+1}=\frac{1}{\frac{1}{\mathbf{s}RC}+1} \end{equation} $$

အဲဒီမှာ RC ကို time constant \(\tau\) လို့ ခေါ်ကြပြီး cutoff frequency နဲ့ ဆက်သွယ် ချက်ကို အောက်မှာ ဖော်ပြထားပါတယ်။

$$ \tau = RC = \frac{1}{\omega_c} = \frac{1}{2\pi f_c} $$

Frequency \(\omega\) မှာ ရှိတဲ့ သူတို့ ရဲ့ gain နဲ့ phase shift ကို အောက်ကအတိုင်း ဖော်ပြနိုင်ပါတယ်။ $$ \begin{equation} \lvert \mathbf{H}_{lp}(\mathbf{s}) \rvert=\frac{1}{\sqrt {(\frac{\omega}{\omega_c})^2+1}} \end{equation} $$

$$ \begin{equation} \lvert \mathbf{H}_{hp}(\mathbf{s}) \rvert=\frac{1}{\sqrt {(\frac{\omega_c}{\omega})^2+1}} \end{equation} $$

$$ \begin{equation} \angle \mathbf{H}_{lp}(\mathbf{s})=-\tan^{-1}\frac{\omega}{\omega_c} \end{equation} $$

$$ \begin{equation} \angle \mathbf{H}_{hp}(\mathbf{s})=\tan^{-1}\frac{\omega_c}{\omega} \end{equation} $$

Low pass filter ရဲ့ transfer function ကို s domain ကနေ z domain ကို ပြောင်းကြည့်ပါမယ်။ ရှိပြီးသား transform table တွေမှာ အလွယ် တကူ ကြည့်လိုက်ရင် \( \frac{1}{\mathbf{s}+a} \) က \( \frac{\mathbf{z}}{\mathbf{z}-e^{-aT}} \) ဖြစ်တယ် လို့ သိထားပါတယ်။ အဲဒီမှာ pole က \(\mathbf{s}=-\frac{1}{RC} \) ဖြစ်တဲ့ အတွက် constant နဲ့ အဲဒီ pole ရှိတဲ့ z transform ကို အောက်ကအတိုင်း ရေးနိုင်ပါတယ်။ $$ \begin{equation} \mathbf{H}_{lp}(\mathbf{z})=\frac{K}{1-\mathbf{z}^{-1} e^{-\frac{T}{RC}}} \end{equation} $$ Low frequency ( \(\mathbf{s}=0 \) ) မှာဆိုရင် \(\mathbf{z}=1 \) ဖြစ်ပြီး အဲဒီမှာ low pass filer ရဲ့ gain ဟာ 1 ဖြစ်ရပါမယ်။ $$ \begin{equation} \lim_{z \to 1} \mathbf{H}_{lp}(\mathbf{z})=\frac{K}{1-e^{-\frac{T}{RC}}} = 1 \end{equation} $$ ဒါ့ကြောင့် low pass filter ရဲ့ z transform ကို အောက်ကအတိုင်းရပါမယ်။ $$ \begin{equation} \mathbf{H}_{lp}(\mathbf{z})=\frac{1-e^{-\frac{T}{RC}}}{1-\mathbf{z}^{-1} e^{-\frac{T}{RC}}} \end{equation} $$

\(a = e^{-\frac{T}{RC}}\) လို့ ထားလိုက်မယ်၊ \(b=1-a\) လို့ထားလိုက်မယ် ဆိုရင် အောက်ပါအတိုင်းရပါမယ်။ $$ \begin{equation} \mathbf{H}_{lp}(\mathbf{z})=\frac{b}{1-a\mathbf{z}^{-1}} \end{equation} $$ Recursive equation နဲ့ဆို အောက်ကအတိုင်း ဖြစ်သွားပါမယ်။ $$ y(k)=b . x(k)+a . y(k-1) $$

High pass filter ရဲ့ ညီမျှခြင်းကို အောက်က အတိုင်း 1 ကနေ low pass filter ကို နုတ်ထားတာနဲ့ ပြနိုင်ပါတယ်။ $$ \begin{align} \mathbf{H}_{hp}(\mathbf{s})&=\frac{\mathbf{s}RC}{\mathbf{s}RC+1} \\ &=1-\frac{1}{\mathbf{s}RC+1} \\ &=1-\mathbf{H}_{lp}(\mathbf{s}) \end{align} $$

ဒါကြောင့် သူ့ရဲ့ z transform ကို အောက်ပါအတိုင်း ဖော်ပြနိုင်ပါတယ်။ $$ \begin{equation} \mathbf{H}_{hp}(\mathbf{z})=\frac{a-a\mathbf{z}^{-1}}{1-a\mathbf{z}^{-1}} \end{equation} $$ ယျေဘူယျ အားဖြင့် \(\frac{b-c\mathbf{z}^{-1}}{1-a\mathbf{z}^{-1}} \) ကို Recursive equation နဲ့ဆို အောက်ကအတိုင်း ပြနိုင်ပါတယ်။ $$ y(k)=a . y(k-1)+b . x(k) - c. x(k-1) $$ အခု case အတွက်တော့ ဒီလို ရေးနိုင်ပါတယ်။ $$ y(k)=a[( x(k)-x(k-1)+ y(k-1)] $$

Z transform ပြောင်းတဲ့ အခါ octave မှာ အောက် က အတိုင်း အလွယ် တကူ ပြောင်းနိုင်ပါတယ်။ Octave မှာ control package မရှိသေးရင် အောက်က command ကို ထည့်ဖို့လိုပါတယ်။
pkg load control
ဥပမာ အနေနဲ့ 22 kΩ resistor နဲ့ 1 μF capacitor တို့ကို သုံးပြီး MatLab code ရေးလိုက်ပါတယ်။

%Low pass filter
clc;
clear all;
close all;

R=22e3 %resistance (Ohm)
C=1e-6 %capacitance (F)
vc=1/(R*C) %angular cutoff frequency (rad/s)
fc=1/(2*pi*R*C) %cutoff frequency (Hz)
RC=R*C
H=tf([1],[RC 1]) %transfer function for 1/(sRC+1)
T=0.01 %sampling period (second)
Hd=c2d(H,T,'zoh') %discrete model using zero order hold
a=exp(-T/(RC)) %just to check coefficient
b=1-a

figure;
step(H,'-',Hd,'--')%check step response

figure;
bode(H,Hd) %check bode plot 

figure;
margin(Hd);%check gain margin and phase margin


%High pass filter
clc;
clear all;
close all;

R=22e3 %resistance (Ohm)
C=1e-6 %capacitance (F)
vc=1/(R*C) %angular cutoff frequency (rad/s)
fc=1/(2*pi*R*C) %cutoff frequency (Hz)
RC=R*C
H=tf([RC 0],[RC 1]) %transfer function for 1/(sRC+1)
T=0.01 %sampling period (second)
Hd=c2d(H,T,'zoh') %discrete model using zero order hold
a=exp(-T/(RC)) %just to check coefficient

figure;
step(H,'-',Hd,'--')%check step response

figure;
bode(H,Hd) %check bode plot 

figure;
margin(Hd);%check gain margin and phase margin



Figure. Output of the Octave program for low pass filter.


သူတို့ကို C နဲ့ implement လုပ်ထားတဲ့ နမူနာကို အောက်မှာ ပြထားပါတယ်။

// First Order RC High Pass and Low Pass filters
// Author: Yan Naing Aye
// http://coolemerald.blogspot.sg/
// Date: 2016 April 21
//-----------------------------------------------------
//External variables
float ah=0; //for high pass filter
float al=0; //for low pass filter
//-----------------------------------------------------
//initialize low pass filter
//input: (T: sampling period, fc: cutoff frequency)
void InitLowPass(float T,float fc) {al=exp(-T*2*PI*fc);}
//-----------------------------------------------------
//Low Pass Filter
float LowPass(float x){static float yl=0; yl=x+al*(yl-x); return yl;}
//--------------------------------------------------------
//initialize high pass filter
//input: (T: sampling period, fc: cutoff frequency)
void InitHighPass(float T,float fc) {ah=exp(-T*2*PI*fc);}
//-----------------------------------------------------
//High Pass Filter
float HighPass(float x){static float yh=0,xh=0; yh=ah*(x-xh+yh); xh=x; return yh;}
//-----------------------------------------------------


လက်တွေ့ အနေနဲ့ အဲဒီ 22 kΩ resistor နဲ့ 1 μF capacitor တို့ကို သုံးပြီး analog circuit တခုကို breadboard ပေါ်မှာဆက်လိုက်ပါတယ်။ ပြီးတော့ အဲဒီ တန်ဖိုးတွေအတိုင်းပဲ Arduino Zero ပေါ်မှာ A5 ကနေ analog input voltage ကိုဖတ်ပြီး၊ A0 ကနေ analog voltage ပြန်ထုတ်ပေးတဲ့ digital filter တခုဆောက်လိုက်ပါတယ်။ နောက်ပြီး waveform generator ကနေ sinusoidal waveform တခုကို ထုတ်ပေးပြီး RC analog filter ကိုရော၊ Arduino digital filter ကို ရော ပြိုင်တူ ပေးလိုက်ပါတယ်။ ပြီးတဲ့ အခါ frequency ကို 1 Hz ကနေ 30 Hz အထိ တန်ဖိုး အမျိုးမျိုး ပြောင်းပေးပြီး ထွက်လာတဲ့ တန်ဖိုးတွေကို oscilloscope ပေါ်မှာ ယှဉ်ပြီး တိုင်းကြည့်တဲ့ အခါ low pass ရော၊ high pass filter အတွက်ပါ ထပ်တူထွက်တာ ကို တွေ့ရပါတယ်။ High pass filter မှာ digital to analog converter ရဲ့ တန်ဖိုးက 0-1023 အပေါင်းတန်ဖိုးပဲ ထွက်နိုင်တာမို့ offset 512 ပေါင်းထည့်ဖို့လိုပါတယ်။


Figure. Experiment setup to compare the outputs of analog RC filters and digital filters.


Arduino program နဲ့ MatLab code တွေကို အောက်ကလင့်ခ်မှာ ယူနိုင်ပါတယ်။

https://github.com/yan9a/RC_Filters

No comments:

Post a Comment