Search This Blog

Thursday, February 28, 2013

Non-inverting Amplifier Using op-amp

လတ်တလော သုံးနေတဲ့ amplifier (PiezoDrive PDX 150) လေးက ပျက်သွားတော့ အပိုရှိနေတဲ့ စပယ်ယာ amplifier လေးနဲ့ ပြောင်းသုံးဖို့ လိုလာပါတယ်။ အောက်ကပုံမှာ ပြထားတဲ့ စပယ်ယာ amplifier လေးက အဝင်ဗို့ -2 V ကနေ 12 V ရှိပြီး၊ အထွက်ဗို့က -20 V ကနေ 120 V ထုတ်ပေးနိုင်ပါတယ်။ ပျက်သွားတဲ့ ကောင်က ချဲ့ဆ ၂၀ ရှိပြီး၊ အပို ရှိတဲ့ amplifier လေးရဲ့ ချဲ့ဆ က ၁၀ ဆပဲရှိပါတယ်။ အဲဒီတော့ ချဲ့ဆ ၂ ဆရှိတဲ့ preamplifier လေး တစ်ခု ကို ကိုယ့်ဟာ ကိုယ် ဒီဇိုင်းလုပ်ပြီး ရှေ့ကနေ ခံသုံးဖို့ ဆုံးဖြတ်လိုက်ပါတယ်။

လုပ်ရမယ့် amplifier ရဲ့ အဝင်ဗို့က -1 V ကနေ 6 V ရှိမှာ ဖြစ်ပြီး၊ အထွက်ဗို့က -2 V ကနေ 12 V ထုတ်ပေးဖို့ လိုပါမယ်။ အဝင်ဗို့ နဲ့ အထွက်ဗို့က အတည့် (non-inverted) ဖြစ်ဖို့ လိုတာမို့ op-amp ကိုnon-inverting configuration သုံးပြီး ဒီဇိုင်းလုပ်လိုက်ပါတယ်။ ချဲ့ဆကို အသေးစိတ် ချိန်ညှိ ချင်တာဖို့ trimmer လေးကို ပါထည့်သုံးလိုက်ပါတယ်။ အလွယ်တကူ တွေ့တဲ့ LM358N op-amp IC ကိုပဲ ကောက်သုံးလိုက်ပါတယ်။ ဆားကစ် ပုံ နဲ့ lab ထဲမှာ အလွယ်တကူ ရတဲ့ ပစ္စည်းလေးတွေသုံးပြီး ရလာတဲ့ ဟာလေးကို အောက်မှာ ပြထားပါတယ်။ ဒီဆားကစ် ရဲ့ အဝင် ခုခံမှု (input impedance) က အရမ်းကြီးတာမို့ အဝင်ကို ဘာမှ ဆက်မထားတဲ့ အချိန် မှာ floating ဖြစ်မနေအောင် 56k ရီစစ္စတာလေး ထည့်လိုက်ပါတယ်။


ဒီ amplifier ရဲ့ ချဲ့ဆ ကို ၂ ဆတိတိရအောင် ချိန်တဲ့ အခါ oscilloscope ရဲ့peak to peak တန်ဖိုး ပြနေတာ ကို ဖတ်ရတာ သိပ်မသေချာဘူး ထင်တာနဲ့ တစ်ခြား နည်းလမ်း ကို ထပ်စဉ်းစား ကြည့်ပါတယ်။ နောက်တော့ ချန်နယ် ၁ နဲ့ ဆက်ထားတဲ့ အထွက် ကို 10 V per division ထားပြီး၊ ချန်နယ် ၂ နဲ့ ဆက်ထားတဲ့ အဝင်ကို 5 V per division ထားလိုက်ပါတယ်။ ပြီးတာနဲ့ trimmer လေးကို ဖြည်းဖြည်းခြင်း လှည့်ပြီး ထပ်တူကျတဲ့ လှိုင်းနှစ်ခု ရအောင် ချိန်လိုက်ပါတယ်။

Wednesday, February 6, 2013

TRIAC Power Control Circuit

အိမ်က ဖုန်စုပ်စက်လေး ပျက်သွားတော့ ဖျု့စ် ပျက်တာလောက် ဆိုရင် ပြင်လို့ ရရင် ရနိုင်ကောင်းရဲ့ ဆိုပြီး စက်ကို ဖွင့် ဖျု့စ်လိုက်ရှာတော့ မတွေ့ပါဘူး :P။ ပလပ်မှာ လည်း မပါတော့ ဒါ ဆိုရင် ပါဝါ ကွန်ထရိုး လုပ်ပေးတဲ့ ဆားကစ် ကပျက်တာ လည်း ဖြစ်နိုင်တာပဲ ဆို ပြီး အဝင်ကြိုးကို ဆားကစ် ကို မဆက်ပဲ ကျော်ပြီး မော်တာ ကို တိုက်ရိုက် ဆက်ကြည့်ပါတယ်။ ဒါလည်း မလုပ်ပါဘူး။ နောက်ဆုံး တော့ စက် အဟောင်းကို ပစ်ပြီး၊ ဖုန်စက် စက် အသစ် တစ်လုံး ဝယ် ပြီး ဖြေရှင်းလိုက်တယ်။ အေးရော :P။ ပါဝါ ကွန်ထရိုး လုပ်ပေးတဲ့ ဆားကစ် လေးကိုတော့ မပစ်ပဲ အားတဲ့အချိန် trace လိုက်ကြည့်ပါတယ်။ သူက ရိုးရှင်းတဲ့ RC ဆားကစ်လေးနဲ့ DIAC ကိုသုံးပြီး TRIAC ဘယ်လောက် နောက်ကျပြီးမှ ပွင့် မလဲဆိုတဲ့ အချိန်ကို ထိန်းသွားတာပါ။ ဆားကစ်လေးက ရိုးရှင်းပြီး အခြေခံ ကျပါတယ်။ သူ့ကို အောက်ကပုံတွေမှာ ပြထားပါတယ်။

Monday, January 21, 2013

k-means clustering using custom distance measuring method

ကြိုက်တဲ့ အကွာအဝေး တိုင်းတဲ့ နည်းသုံးပြီး k-means clustering လုပ်ပေးတဲ့ MATLAB ဖန်ရှင် လေး တစ်ခု ရေးကြည့် ထားပါတယ်။ ဥပမာ histograms တွေကို ခွဲခြားဖို့ဆိုရင် chi-square distance ကို သုံးတာက ပိုကောင်း ချင် ကောင်းနိုင်ပါတယ်။ အောက်က နမူနာမှာ chi-square distance သုံးထားတာကို ပြထားပေမယ့် အဲဒီ distance ဖန်ရှင်နေရာမှာ ကိုယ်ကြိုက်တဲ့ နည်း ကို အစားထိုးပြီး သုံးလို့ရပါတယ်။

%k-means test program
X = [randn(100,2)+ones(100,2);...
     randn(100,2)-ones(100,2)];

[idx,ctrs] = KMeansCustom(X,2);
%[idx,ctrs] = kmeans(X,2);

plot(X(idx==1,1),X(idx==1,2),'r.','MarkerSize',12)
hold on
plot(X(idx==2,1),X(idx==2,2),'b.','MarkerSize',12)
plot(ctrs(:,1),ctrs(:,2),'kx',...
     'MarkerSize',12,'LineWidth',2)
legend('Cluster 1','Cluster 2','Centroids',...
       'Location','NW')

function [Idx,C]=KMeansCustom(X,k)
%KMeansCustom partitions the points in the n-by-d data matrix X into k clusters.
%[Idx,C]= KMeansCustom(X,k) returns 
%n-by-1 vector IDX containing the cluster indices of each point and 
%k-by-d matrix C containing the k cluster centroid locations.
%For n sample points with d dimensions in each point, X has n rows and d columns.
%File name: KMeanCustom.m
%Author: Yan Naing Aye
%Website: http://cool-emerald.blogspot.sg/


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Define maximum number of iterations
MaxIter=500;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[n,d]=size(X);
k=round(k);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%step1 :arbitrarily choose k samples as the initial cluster centers
p=randperm(n);
Mu=X(p(1:k),:);
D=zeros(k,d);
for t=1:MaxIter
 %step2:distribute the samples X  to the clusters 
 for j=1:k
        for i=1:n
            D(j,i)=ChiDist(X(i,:),Mu(j,:));%Use custom distance
        end
 end
 [ValMin,IndexMin]=min(D);
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %step 3: update the cluster centers
    OldMu=Mu;
 for i=1:k
        Mu(i,:)=mean(X(IndexMin==i,:));
 end
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %step4 :check convergence
 if sum(sum(abs(OldMu-Mu))) == 0 %< 1e-9
        break
 end
end
Idx=IndexMin';
C=Mu;

function d=ChiDist(v1,v2)
    dv=(v1-v2).^2;
    sv=abs(v1)+abs(v2);
    %------------------------------------------------------
    %eliminate zero denominator
    sv(sv==0)=1e-9;
    %------------------------------------------------------
    d=sum(dv./sv)./2;    
end

Amplitude spectrum of a signal using Fourier transform

signal တစ်ခုရဲ့ amplitude spectrum ကို Fourier transform သုံးပြီး ရှာတဲ့ MATLAB ဖန်ရှင်လေး တစ်ခု ရေးကြည့်ထားပါတယ်။ အဲဒီ ဖန်ရှင်ကို နမူနာ သုံးတဲ့ ပုံစံ ရယ်၊ ဖန်ရှင် ရေးထားတဲ့ ကုဒ်တွေ ရယ်ကို အောက်မှာ ဖော်ပြထားပါတယ်။ MATLAB မှာ ပါတဲ့ ဖန်ရှင် fft ကို သုံးတဲ့ ဟာ ကို လည်း နောက်ထပ် နမူနာ တစ်ခု ပြထားပါတယ်။ ဒီဟာလေးတွေက amplitude spectrum တို့၊ power spectrum တို့ ရှာချင်တဲ့ သူတွေ အတွက် အသုံးဝင်မယ်လို့ မျှော်လင့်ပါတယ်။
%Example MATLAB code to test function FX
Fs=100;
t=(0:1/Fs:1-1/Fs)';
x=2*cos(2*pi*5*t)+sin(2*pi*10*t);
[f a]=FX(x,Fs);
plot(f,a);

function [f a]=FX(x,fs)
%Calculates amplitude spectrum of a signal x using Fourier transform
%[f a]=FX(x,fs)
%Input: x=signal, fs = sampling rate
%Output: f = frequency axis, a = amplitude spectrum
%File name: FX.m
%Author: Yan Naing Aye
%Website: http://cool-emerald.blogspot.sg/

dT = 1/fs; 
N=length(x);
dF=1/(N*dT);
NF=fs/2;%Nyquist Freq
%You can always limit freq range for faster performance
%NF=20;
t=(0:dT:(N-1)*dT)';
f=(0:dF:NF)';
a=f;%initialize a
a(1)=mean(x);
for i=2 : length(a)
    b=(2*mean(x.*cos(2*pi*dF*(i-1)*t)));
    c=(2*mean(x.*sin(2*pi*dF*(i-1)*t)));
    a(i)=sqrt(b^2+c^2);
end

%MATLAB program to calculates amplitude spectrum of a signal x using fft
%Author: Yan Naing Aye
%Website: http://cool-emerald.blogspot.sg/

Fs=100;
t=(0:1/Fs:1-1/Fs)';
x=2*cos(2*pi*5*t)+sin(2*pi*10*t);
L=length(x);

A=2*abs(fft(x)/L);
A=A(1:Fs/2+1);
f = Fs/2*linspace(0,1,Fs/2+1);
plot(f,A);

Sunday, January 13, 2013

Changing sampling rate using quadratic regression

signal တစ်ခုရဲ့ sampling rate ကို 333Hz ကနေ 5000Hz ကို ပြောင်းဖို့ အတွက် လုပ်ကြည့်ထားပါတယ်။ ပိုမို ချောမွေ့တဲ့ ရလာဒ် ရချင်တာမို့ ပုံမှန် zero order hold (ZOH) ကို သုံးမယ့်အစား second order hold ကို သုံးကြည့်ထားတာပါ။ ဒီမှာ sampling rate ကို တင်ဖို့လုပ်ထားပေမယ့်၊ ဒီနည်းကို down sampling လုပ်ဖို့လည်း သုံးလို့ရပါတယ်။ အခြား ဖြစ်နိုင်ချေတွေကတော့ noise ကို phase delay မရှိပဲ filter လုပ်တဲ့ဟာမျိုးတွေ အတွက်လည်း သုံးလို့ ရနိုင်ပါတယ်။ real-time application တွေအတွက်ပေါ့။
Approach 1: Quadratic regression
Quadratic ဖန်ရှင်တစ်ခုကို အောက်ပါအတိုင်း သတ်မှတ်နိုင်ပါတယ်။

$$f=w_0+w_1 x + w_2 x^2$$

အနည်းဆုံး ဖြစ်အောင် လုပ်မယ့် cost function ကို အောက်ကလို သတ်မှတ်မှာပါ။

$$J(w)=\frac{1}{2}\sum_{i=1}^{n}(y_i-f_i)^2$$
$$J(w)=\frac{1}{2}\sum_{i=1}^{n}(y_i-w_0+w_1 x_i + w_2 x_i^2)^2$$

ဒါဆို Optimal weights တွေကို differentiate လုပ်ပြီးသုည ညီလိုက်ပြီး ရှာနိုင်ပါတယ်။

$$\frac{\partial J(w)}{\partial w_0}=0$$
$$-\sum_{i=1}^{n}(y_i-w_0+w_1 x_i + w_2 x_i^2)=0$$
$$w_0\sum_{i=1}^{n}1+w_1\sum_{i=1}^{n}x_i+w_2\sum_{i=1}^{n}x_i^2=\sum_{i=1}^{n}y_i$$

w1 နဲ့ w2 ကိုလည်း အဲဒီလိုပဲ ရှာလိုက်မယ် ဆိုရင် အောက်အတိုင်း ထပ်ရလာပါမယ်။

$$w_0\sum_{i=1}^{n}x_i+w_1\sum_{i=1}^{n}x_i^2+w_2\sum_{i=1}^{n}x_i^3=\sum_{i=1}^{n}y_i x_i$$
$$w_0\sum_{i=1}^{n}x_i^2+w_1\sum_{i=1}^{n}x_i^3+w_2\sum_{i=1}^{n}x_i^4=\sum_{i=1}^{n}y_i x_i^2$$

အဲဒီ equation သုံးခုကို မေ့ထရစ် ပုံစံ နဲ့ အောက်ပါအတိုင်း ရေးလို့ရပါတယ်။

$$ \begin{bmatrix} \sum_{i=1}^{n}1 & \sum_{i=1}^{n}x_i & \sum_{i=1}^{n}x_i^2 \\ \sum_{i=1}^{n}x_i & \sum_{i=1}^{n}x_i^2 & \sum_{i=1}^{n}x_i^3 \\ \sum_{i=1}^{n}x_i^2 & \sum_{i=1}^{n}x_i^3 & \sum_{i=1}^{n}x_i^4 \end{bmatrix} \begin{bmatrix} w_0 \\ w_1 \\ w_2 \end{bmatrix} = \begin{bmatrix} \sum_{i=1}^{n}y_i \\ \sum_{i=1}^{n}y_i x_i \\ \sum_{i=1}^{n}y_i x_i^2 \end{bmatrix} $$
$$\mathbf{A}\mathbf{W}=\mathbf{B}$$
$$\mathbf{W}=\mathbf{A}^{-1}\mathbf{B}$$

Approach 2: Three equations
တကယ်တော့ ဒီကိစ္စမှာ နောက်ဆုံး အမှတ် ၃ ခုကိုပဲ သုံးလိုက်ရင်ရတဲ့ အတွက်၊ ညီမျှခြင်း သုံးကြောင်း ကို အောက်က အတိုင်း တစ်ခါတည်း ချရေးလို့လည်း ရပါတယ်။


$$y_1=w_0+w_1 x_1 + w_2 x_1^2$$
$$y_2=w_0+w_1 x_2 + w_2 x_2^2$$
$$y_3=w_0+w_1 x_3 + w_2 x_3^2$$
$$ \begin{bmatrix} 1 & x_1 & x_1^2 \\ 1 & x_2 & x_2^2 \\ 1 & x_3 & x_3^2 \end{bmatrix} \begin{bmatrix} w_0 \\ w_1 \\ w_2 \end{bmatrix} = \begin{bmatrix} y_1 \\ y_2 \\ y_3 \end{bmatrix} $$
$$\mathbf{A}\mathbf{W}=\mathbf{B}$$
$$\mathbf{W}=\mathbf{A}^{-1}\mathbf{B}$$

Approach 3: Two equations အကယ်၍ x1=-1, x2=0, နဲ့ x3=1 လို့ သတ်မှတ်လို့ ရတယ်ဆိုရင် y2 က w0 နဲ့ ညီသွားပါမယ်။ နောက်ကျန်တဲ့ အမှတ် ၂ ခုကနေ ညီမျှခြင်း နှစ်ကြောင်းပဲ ရှင်းဖို့ လိုပါတော့တယ်။

$$y_1=y_2-w_1+ w_2$$
$$y_3=y_2+w_1+ w_2$$
$$ \begin{bmatrix} -1 & 1 \\ 1 & 1 \end{bmatrix} \begin{bmatrix} w_1 \\ w_2 \end{bmatrix} = \begin{bmatrix} y_1-y_2 \\ y_3-y2 \end{bmatrix} $$
$$ \begin{bmatrix} w_1 \\ w_2 \end{bmatrix} = \begin{bmatrix} -0.5 & 0.5 \\ 0.5 & 0.5 \end{bmatrix} \begin{bmatrix} y_1-y_2 \\ y_3-y2 \end{bmatrix} $$

နောက် အောက်ကအတိုင်းရလာပါမယ်။

$$w_0=y_2$$
$$w_1=-0.5(y_1-y_2)+0.5(y_3-y2)$$
$$w_2=0.5(y_1-y_2)+0.5(y_3-y2)$$

အထက်ကနည်းတွေကို MatLab နဲ့စမ်းကြည့်ထားတာကို အောက်က ကုဒ်တွေမှာ တွေ့နိုင်ပါတယ်။
%-------------------------------------------------------------------------
clc;
close all;
clear all;
%-------------------------------------------------------------------------
% y= w0 + w1*x + w2* x^2;
%-------------------------------------------------------------------------
%Got x and y
x=[-1 0 1]';
Wo=[4 3 2]';
y=Wo(1)+Wo(2)*x+Wo(3).*x.*x;

%-------------------------------------------------------------------------
%Approach 1
%Polynomial regression of order 2
%For n=3
S1=3;
Sx=sum(x);
Sx2=sum(x.*x);
Sx3=sum(x.*x.*x);
Sx4=sum(x.*x.*x.*x);
Sy=sum(y);
Syx=sum(y.*x);
Syx2=sum(y.*x.*x);

P=[S1 Sx Sx2; Sx Sx2 Sx3; Sx2 Sx3 Sx4];
B=[Sy Syx Syx2]';
%P1=P^(-1);
W1=P\B

%-------------------------------------------------------------------------
%Approach 2
%Linear equations
A=[1 x(1) x(1)*x(1);1 x(2) x(2)*x(2); 1 x(3) x(3)*x(3)];
W2=A\y
%-------------------------------------------------------------------------
%Approach 3
%Only 2 linear equations
w0=y(2);
w1=-0.5*( y(1)- y(2))+0.5*( y(3)- y(2));
w2=0.5*( y(1)- y(2))+0.5*(y(3)- y(2));
W3=[w0 w1 w2]'
%-------------------------------------------------------------------------
အောက်ကပုံမှာ ဒီနည်းကို သုံးလို့ရတဲ့ ရလဒ် (အပြာ) နဲ့ ပုံမှန် zero order hold သုံးရင် ရမယ့် ရလဒ် (အနက်) တို့ကို ယှဉ်ပြထားပါတယ်။ ဒီနည်းက ပိုပြီး ညက်ညော ချောမွေ့တဲ့ ရလဒ်ကို ရပေမယ့် one sample delay ရှိသွားတာကိုတော့ သတိထားဖို့ လိုပါတယ်။
ဒီနည်းလမ်းကို LabVIEW မှာ C code သုံးပြီး လုပ်ထားတာကို အောက်ကပုံမှာ တွေ့နိုင်ပါတယ်။
ပထမ နှစ်ခုမှာ 3x3 matrix ကို inverse ရှာဖို့ လိုတဲ့အတွက် inverse ရှာတဲ့ C program လေးတစ်ခုကို ရေးပြီး စမ်းကြည့်ထားပါတယ်။
#include
#include
main()
{
    float M[3][3]={{3,0,2},{0,2,0},{2,0,2}}; //initialize a 3x3 matrix
    float N[3][3]={{0,0,0},{0,0,0},{0,0,0}}; //allocate for inverse
    int i,j;
    float d;
    //-------------------------------------------------------------------------
    N[0][0]=(M[1][1]*M[2][2]-M[2][1]*M[1][2]);
    N[1][0]=-(M[1][0]*M[2][2]-M[2][0]*M[1][2]);
    N[2][0]=(M[1][0]*M[2][1]-M[1][1]*M[2][0]);
    d=M[0][0]*N[0][0]+M[0][1]*N[1][0]+M[0][2]*N[2][0];
    N[0][0]/=d;
    N[1][0]/=d;
    N[2][0]/=d;
    N[0][1]=-(M[0][1]*M[2][2]-M[0][2]*M[2][1])/d;
    N[1][1]=(M[0][0]*M[2][2]-M[0][2]*M[2][0])/d;
    N[2][1]=-(M[0][0]*M[2][1]-M[0][1]*M[2][0])/d;
    N[0][2]=(M[0][1]*M[1][2]-M[0][2]*M[1][1])/d;
    N[1][2]=-(M[0][0]*M[1][2]-M[0][2]*M[1][0])/d;
    N[2][2]=(M[0][0]*M[1][1]-M[0][1]*M[1][0])/d;
    //-------------------------------------------------------------------------
    //print 3x3 matrix
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++) printf("%3.4f ",N[i][j]);
        printf("\n");
    }
    getch();
    return 0;
}

Wednesday, January 9, 2013

Rotations in 3D space using Euler angles

ကိရိယာ တစ်ခုရဲ့ body reference frame နဲ့ world reference frame ရဲ့ ဆက်သွယ်မှု ကို ရှာဖို့အတွက် Euler angle sequence တစ်ခုကို သုံးပြီး သရီးဒီ စပေ့ ထဲမှာ rotation လုပ်တဲ့ အကြောင်း ပြောချင်ပါတယ်။ အွိုင်လာ တင်ပြခဲ့တဲ့ သီအိုရမ်တစ်ခု မှာ ပြောထားတာက အောက်ပါအတိုင်း ဖြစ်ပါတယ်။
Any two independent orthonormal coordinate frames can be related by a sequence of rotations (not more than three) about coordinate axes, where no two successive rotations may be about the same axis.
{M} နဲ့ ကိုယ်စားပြု ခေါ်မယ့် world reference frame နဲ့ {B} နဲ့ ကိုယ်စားပြုမယ့် body reference frame တို့ကို အောက်မှာ ပုံနဲ့ နမူနာ ပြထားပါတယ်။
Pan angle rotation ကို α လို့ ခေါ်မှာ ဖြစ်ပြီး သူ့ကို computer vision ကနေ ရနိုင်ပါတယ်။ နောက် tilt angle rotation - β နဲ့ roll angle rotation - γ တို့ကိုတော့ ကိရိယာ ထဲမှာ တပ်ထားမယ့် accelerometers တွေကနေ မြေဆွဲအား (gravity- g ) ကို အာရုံခံ ပြီး သိရှိနိုင်ပါတယ်။ အရင်ဆုံး pan and tilt မရှိဘူး လို့ ယာယီ ယူဆပြီး roll angle ကို စဉ်းစားကြည့်ပါမယ်။ γ က သုည ဖြစ်နေချိန်မှာ Y ဝင်ရိုးက အထက်ကို ညွှန်ပြီး၊ X ဝင်ရိုးက right handed rule အတိုင်း ရေပြင်ညီ ရှိမယ်လို့ သတ်မှတ် ပါမယ်။ X ဝင်ရိုး accelerometer နဲ့ Y ဝင်ရိုး accelerometer တို့က မြေဆွဲအားကို အာရုံခံ တိုင်းလို့ရတဲ့ တန်ဖိုးတွေကို gx နဲ့ gy လို့ခေါ်ပါမယ်။ roll angle ကို သတ်မှတ် ထားပုံကို အောက် က ပုံမှာ ဖော်ပြထားပါတယ်။
Roll angle - γ ကို အောက်က ညီမျှခြင်း ကိုသုံးပြီး တွက်ယူလို့ ရပါတယ်။

$$ \gamma = \tan^{-1}\frac{gx}{gy} $$

နောက် second နဲ့ third quadrants တွေ မှာ ရှိမရှိကို ပြန်စစ်ပါမယ်။
if(gy<0)
  if(gx>=0)
    γ=π+γ;
  else
    γ=-π+γ;
  end
end
ဒါဆို roll angle rotation matrix - Rγ ကို အောက်က အတိုင်းရနိုင်ပါတယ်။

$$ \mathbf{R}_{\gamma}= \begin{bmatrix} \cos(\gamma) & -\sin(\gamma) & 0 \\ \sin(\gamma) & \cos(\gamma) & 0 \\ 0 & 0 & 1 \end{bmatrix}$$

Roll angle ကို ပြင်ပြီးတဲ့နောက် tilt angle ကိုဆက်စဉ်းစားပါမယ်။ Tilt angle ရဲ့ သတ်မှတ်ပုံ ကို အောက်မှာ ပြထားပါတယ်။
Tilt angle - β ကို Y နဲ့ Z မြေဆွဲအား တိုင်းတာမှုတွေ ကနေ တွက်လို့ရပါတယ်။ သတိထား ဖို့ လိုတာကတော့ အဲဒီတန်ဖိုးတွေက roll angle ပြင်ထားတဲ့ တန်ဖိုးတွေ ဖြစ်ရပါမယ်။ ပြောင်းသွားတဲ့ Y နဲ့ Z မြေဆွဲအား တိုင်းတာမှုတွေ ကို အောက်ပါအတိုင်း တွက်ယူနိုင်ပါတယ်။

$$ \begin{bmatrix} gx2 \\ gy2 \\ gz2 \end{bmatrix} = \mathbf{R}_{\gamma} \begin{bmatrix} gx \\ gy \\ gz \end{bmatrix} $$

ဒါဆို β ကို အောက်ပါ ညီမျှခြင်း ကနေရှာလို့ ရပါပြီ။

$$ \beta = \tan^{-1}\frac{gy2}{gz2} $$.

နောက် second and third quadrants တွေ အတွက် စစ်ပါမယ်။
if(gz2>=0)
  if(gy2>=0)
    β=-π+β;
  else
    β=π+β;
  end
end
အဲဒီအခါ Tilt angle rotation matrix -Rβ က အောက်ပါအတိုင်းရလာပါမယ်။

$$ \mathbf{R}_{\beta}= \begin{bmatrix} 1 & 0 & 0\\ 0 & \cos(\gamma) & -\sin(\gamma) \\ 0 & \sin(\gamma) & \cos(\gamma) \end{bmatrix}$$

အဲဒီလိုပါပဲ၊ pan angle rotation matrix - Rα နဲ့ pan angle ရဲ့ သတ်မှတ်ပုံတွေ ကိုလည်း အောက်ပါအတိုင်း တွေနိုင်ပါတယ်။

$$ \mathbf{R}_{\alpha}= \begin{bmatrix} \cos(\alpha) & -\sin(\alpha) & 0 \\ \sin(\alpha) & \cos(\alpha) & 0 \\ 0 & 0 & 1 \end{bmatrix}$$

အဲဒီ rotation matrices တွေရဲ့ မြှောက်လဒ် က rotation matrix တစ်ခု ပါပဲ။ $$ \mathbf{R}=\mathbf{R}_{\alpha} \mathbf{R}_{\beta} \mathbf{R}_{\gamma}$$
အဲဒီအခါ အောက်ပါအတိုင်း ရရှိလာမှာပါ။
M=RB

R က rotation matrix တစ်ခု ဖြစ်တာမို့ သူ့ရဲ့ inverse ကို ရှာဖို့ လိုခဲ့ရင် အဲဒါက R transpose နဲ့ အတူတူပါပဲ။ ဒီ 3D rotation ကို LabVIEW မှာ MabLab code သုံးပြီး လုပ်ထားတာကို အောက်ကပုံမှာ မြင်နိုင်ပါတယ်။

အခုလို 3D transformation တွေအတွက် Quaternion algebra ကလည်း လွယ်ကူပြီး ခေတ်စားနဲ့ နည်းတစ်နည်း ပါပဲ။

Reference:
Kuipers, Jack B., Quaternions and rotation sequences : a primer with applications to orbits, aerospace, and virtual reality, Princeton University Press, 1999, ISBN: 0691058725.

Wednesday, December 19, 2012

Current Driver for Laser Diode

Laser Diode ကို မောင်းဖို့ current driver ဆားကစ် တစ်ခုကို လုပ်ကြည့်ထား ပါတယ်။ ပုံမှန်အားဖြင့် အောက်က ပုံမှာ ပြထားတဲ့ အတိုင်း CE with RE ပုံစံ ကို LED အတွက် current source အနေနဲ့ သုံးရတာကို ကြိုက်ပါတယ်။ ဒီဆားကစ်မှာ Laser Components ကထုတ်တဲ့ laser diode ADL-65055TL ကိုသုံးထားပါတယ်။ သူ့ရဲ့ ပုံမှန် အလုပ်လုပ် တဲ့ operating current က 25mA၊ အမြင့်ဆုံး maximum current က 35mA နဲ့ ပုံမှန် အလုပ်လုပ်တဲ့ operating voltage က 2.2V ပါ။
12V ပါဝါ ဆပ်ပလိုင်း အတွက် ထရန်စစ်စတာရဲ့ VCE(saturation) ကို သုညလို့ အနီးစပ်ဆုံး ယူဆပြီး RE ရဲ့ တန်ဖိုးကို အောက်က အတိုင်း တွက်လို့ရပါတယ်။ $$R_E=\frac{Vcc-V_L}{I_{max}}=\frac{12-2.2}{35m}=280 \Omega $$ အဲဒီ CE configuration အတွက် ချဲ့ဆ အများကြီး မလိုတာနဲ့ bypass capacitor ကို မသုံးခဲ့ ပါဘူး။ ဒီ class A amplifier ရဲ့ အထွက် လျှပ်စီးcurrent ကို 23mA နဲ့ 29 mA ကြားမှာ ပြောင်းနေစေချင် တာနဲ့ ထရန်စစ်စတာ ၂ ရဲ့ ပုံမှန် quiescent emitter current ကို IE2=26mA (operating current ပတ်ဝန်းကျင်လောက်မှာ) လို့ သတ်မှတ်လိုက်ပါတယ်။ အဲဒါဆိုရင် emitter voltage က VE2=RE x Iop= 280 x 26m = 7.28V လို့ ရပါတယ်။ input impedance မြင့်ဖို့အတွက် CC amplifier ကိုရှေ့ကနေ တဆင့် ထပ်ခံလိုက်တဲ့ အခါ အောက်မှာ ပြထားတဲ့ ပုံအတိုင်း ဖြစ်သွားပါတယ်။
base-emitter junction voltage, VBE ကို 0.7V လို့ ယူလိုက်ရင် ထရန်စစ်စတာ ၁ ရဲ့ ပုံမှန် တည်ငြိမ် base voltage က VB1= 7.28+0.7+0.7=8.68V ဖြစ်သွားပါတယ်။ သေးငယ်လွန်းတဲ့ ဘေ့စ် လျှပ်စီးကို ထည့်မစဉ်းစား ပဲ R1 နဲ့ R2 ကို တွက်လိုက်ရင် $$ V_{B1}=Vcc \times \frac{R_2}{R_1+ R_2}$$ $$ \frac{R_1}{R_2}+ 1=\frac{12}{8.68V}$$ R2=2.6 R1 လို့ ထွက်လာပါတယ်။ R1 တန်ဖိုးကို 22k လို့ ကြုံရာ ယူလိုက်မယ်ဆိုရင် R2 က 57k လို့ရပါတယ်။ အဝင် ac input voltage ကတော့ (29-23)m x 280= 1.68V peak to peak လောက်ပေးရမှာ ဖြစ်ပါတယ်။ lab ထဲမှာ ရှိတဲ့ ဟာလေးတွေနဲ့ လုပ်ကြည့်ပြီး ရလာတဲ့ prototype လေးကို အောက်မှာ ပြထားပါတယ်။

Thursday, July 19, 2012

Myanmar (Burmese) Language with XeTeX and LuaTeX

LaTeX မှာ မြန်မာစာ ကို မှန်မှန်ကန်ကန် ပေါ်ဖို့ အတွက် ဆိုရင် ယူနီကုတ် ကို သုံးလို့ရတဲ့ ဇီးတက်ခ် (XeTeX) နဲ့ လူဝါတက်ခ် (LuaTeX) တို့ကို သုံးဖို့လိုပါတယ်။ မြန်မာစာ ပေါ်ဖို့ TeX Live တို့၊ MiKTeX တို့နဲ့ တစ်ခါတည်း ပါလာတဲ့ XeTeX နဲ့ LaTeX တွေဟာ နောက်ဆုံးပေါ် ဗားရှင်းတွေ ဖြစ်ဖို့ လိုကောင်း လိုပါလိမ့်မယ်။ အယ်ဒီတာ ဆော့ဖ်ဝဲ တွေဖြစ်တဲ့ TeXmaker တို့၊ TeXstudio တို့ မှာ TeX ဖိုင်တွေကို အလွယ်တကူ သုံးရလွယ်အောင် user command တွေ သတ်မှတ် လို့ရပါတယ်။ TeXstudio မှာ ဆိုရင် အဲဒီလို သတ်မှတ်ဖို့ အတွက် Options menu ကို သွားပြီး Configure TeXstudio... ကို နှိပ်ပါ။ နောက် Commands ကို နှိပ်ပြီး PdfLaTeX အတွက် သုံးထားတဲ့ command ကို ကော်ပီ ကူးယူပါ။
အဲဒီနောက် User menu ကိုပြန်သွားပြီး User Commands -> Edit User Commands ကို နှိပ်ပြီး အစိမ်းရောင် အပေါင်း လက္ခဏာ သင်္ကေတ ကို နှိပ်ပါ။ ပြီးရင် ခုနက ကော်ပီကူးထားတဲ့ command ကို Paste လုပ်ပြီး XeTeX ကို သုံးဖို့ pdflatex ဆိုတဲ့ နေရာမှာ xelatex နဲ့ အစားထိုးပါ။ LuaTeX ကိုသုံးဖို့ အတွက်လည်း ခုနက နည်းအတိုင်း ထပ်လုပ်ပြီး lualatex နဲ့ အစားထိုးပါ။
အောက်က နမူနာ (Z1.tex) က xelatex နဲ့ရော lualatex နဲ့ပါ အလုပ်လုပ် ပါတယ်။
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Zawgyi-One}
\begin{document}
ျမန္မာစာ
\end{document}
နောက်ထပ် lua script တွေ သုံးထားတဲ့ lualatex နမူနာ က luaZ1.tex ပါ။ LuaTeX ကို Zawgyi-One ၊ Padauk ၊ Myanmar3 ၊ Myanmar MN အစရှိတဲ့ ဖောင့်တွေနဲ့ စမ်းကြည့်တဲ့ အခါ Zawgyi-One တစ်ခုပဲ လက်ရှိ ဗားရှင်း (LuaTeX, Version beta-0.70.1-2011082320) မှာ လုပ်တာကို တွေ့ပါတယ်။
XeTeX ကတော့ Zawgyi-One နဲ့ Padauk ကို ပလက်ဖောင်း အားလုံးမှာ ပေါ်အောင် လုပ်နိုင်ပြီး၊ Myanmar MN ကိုလည်း Mac OS X မှာ ပေါ်အောင် လုပ်နိုင်ပါတယ်။ ဇော်ဂျီ အတွက် ဘာမှ ပြဿနာ မရှိပေမယ့် Unicode ဖောင့်တွေဖြစ်တဲ့ Padauk အစရှိတဲ့ ဖောင့်တွေမှာတော့ renderer ကို သတ်မှတ် ပေးဖို့လိုပါတယ်။ အောက်က နမူနာမှာတော့ Renderer=Graphite ဆိုပြီး Graphite ကို renderer အနေနဲ့ သတ်မှတ်ပေးလိုက် ပါတယ်။ Myanmar MN ဖောင့် အတွက် ဆိုရင်တော့ Renderer=AAT လို့ သုံးနိုင်ပါတယ်။ နမူနာ အနေနဲ့ အောက်မှာ ပြထားတဲ့ XeFontspec.tex ကို ကြည့်နိုင်ပါတယ်။
\fontspec[Renderer=Graphite]{Padauk} အစား renderer ကို သတ်မှတ်နိုင်တဲ့ တခြားနည်း ကတော့ \font\1="Padauk/GR" \1 ပါ။ အဲဒီမှာ /GR က Graphite font renderer အတွက် ဖြစ်ပြီး၊ /AAT က ATSUI renderer (Mac OS X အတွက်သာ) အတွက် နဲ့၊ /ICU ကို သုံးရင် ICU OpenType renderer အတွက် ဖြစ်ပါတယ်။ ဒါပေမယ့် အဲဒီလို renderer သတ်မှတ်တာ က ကျွန်တော့် Windows XP နဲ့ Ubuntu Linux မှာ ရှိတဲ့ xelatex ဗားရှင်းတွေ အတွက် အလုပ် မလုပ်ဘူး ဖြစ်နေ ပါတယ်။ ကံကောင်းချင်တော့ Calmhill ရဲ့ ဘလော့ဂ် မှာ Padauk ကို ပေါ်အောင် \fontspec[Script=Myanmar]{Padauk} ကို သုံးထားတဲ့ နည်းကို တွေ့ပါတယ်။ နမူနာက XePadauk.tex ပါ။
Myanmar MN အတွက် နမူနာက XeMyanmarMN.tex ပါ။ Myanmar3 ကိုစမ်းကြည့်တာတော့ လောလောဆယ် ပလက်ဖောင်း အားလုံးမှာ မရသေး ပါဘူး။

Updated post: မြန်မာဘာသာ အတွက် LaTeX Report ပုံစံ

Friday, June 8, 2012

LaTeX Bibliography with TeXstudio

TeXstudio (အရင်နာမည် TexMakerX ၊ http://texstudio.sourceforge.net/) က LaTeX နဲ့စာရေးဖို့အတွက် ဆော့ဖ်ဝဲ အယ်ဒီတာ တစ်ခုပါ။ ပုံမှန်အားဖြင့် တော့ ပေပါ တစ်စောင် ယူလိုက်ပြီဆို သူ့အတွက် citation ကိုလဲ အဲဒီမှာပဲ BibTeX style နဲ့ အလွယ်တစ်ကူ ယူလို့ရပါတယ်။ ပြီးရင် အဲဒီရလာတဲ့ BibTeX entry ကို BibTeX database ဖိုင်တစ်ခု ဖန်တီးပြီး သိမ်းထားလို့ရပါတယ်။ BibTeX database ဖိုင်ရဲ့ extension က .bib ပါ။ TeXstudio မှာ ကိုယ့်ဟာကို BibTeX entry တစ်ခုဖန်တီးမယ် ဆိုရင်လဲ လွယ်ပါတယ်။ ဥပမာ Ref1.bib ဆိုပြီး BibTeX database ဖိုင်တစ်ခုကို ဖန်တီးပြီး menu က bibliography ကို ကလစ်နှိပ်ပါ။ နောက် ကိုယ့် ပေပါရဲ့ အမျိုးအစားကို နှိပ်လိုက်ရင် required fields တွေရော၊ optional fields တွေရော အကုန်ထည့်ပေးသွားမှာပါ။ အကယ်၍ optional fields တွေကို ဖယ်ချင်ရင်တော့ clean command ကိုနှိပ်ပြီး ရှင်းလို့ရပါတယ်။ အဲဒီထက်ပို လွယ်တာက တော့ BibTeX insert dialog ... ကို နှိပ်ပြီး ထည့််တာပါ။



New BibTeX entry ဆိုတဲ့ dialog လေးပေါ်လာရင် ကိုယ်လိုတာကို ရွေးထည့်ပြီး OK နှိပ်လိုက်ရုံပါပဲ။ စာရေးသူတွေ ရဲ့ နာမည် ကို ဖြည့်တဲ့ အခါ နာမည် တွေကြားမှာ and ဆိုတဲ့ စာလုံးနဲ့ ခြားပေးရပါမယ်။ အဲဒီ database ဖိုင်ကို ဖန်တီးပြီးရင် သူ့ကို ယူသုံးမယ့် TeX ဖိုင် တစ်ခုကို ဖန်တီးပါမယ်။ ဥပမာ TestBibTex.tex ဆိုပါတော့။ အဲဒီမှာ Ref1.bib ကို \bibliography{Ref1} ဆိုပြီး အောက်ကပုံအတိုင်း သုံးလို့ရပါတယ်။ ဒီနမူနာမှာတော့ အသုံးများတဲ့ ieeetr ဆိုတဲ့ စတိုင်ကို သုံးထားတဲ့ အတွက် အကိုးအကားတွေဟာ သူတို့ကို ကိုးကားထားတဲ့ အစဉ်အတိုင်း နံပါတ်တပ်၊ အစဉ်အတိုင်း ပေါ်လာမှာပါ။





ပုံမှန်အားဖြင့်တော့ မှန်ကန်တဲ့ output ဖိုင်တစ်ဖိုင် ထွက်လာအောင် LaTeX ကို အကြိမ်ကြိမ် run ပေးရပါတယ်။ (LaTeX ကို run ဖို့ MiKTeX ဒါမှမဟုတ် TeX Live ဆော့ဖ်ဝဲ တစ်ခုခုကို ကွန်ပျူတာထဲမှာ ထည့်ပြီးသား ရှိရပါမယ်။) ဥပမာ pdflatex ကိုသုံးပြီး run မယ်ဆိုရင်
အဆင့် ၁။ pdflatex
အဆင့် ၂။ bibtex
အဆင့် ၃။ pdflatex
အဆင့် ၄။ pdflatex
ဆိုပြီး လေးခါ run မှ ရပါတယ်။ TeXstudio မှာတော့ အဆင်ပြေတာ တစ်ခုက Quick Build လုပ်ဖို့ 'F1' တစ်ခါနှိပ် လိုက်ရုံနဲ့ နောက်ဆုံး မှန်ကန်တဲ့ output ဖိုင် ထွက်လာတဲ့ အထိ သူ့ဟာသူ လုပ်သွားတာပါ။ အကယ်၍ စာရေးသူ-ခုနှစ် ဆိုတဲ့ ပုံစံ အကိုးအကား ကို လိုချင်ရင်တော့ \usepackage{natbib} ကို အောက်မှာ ပြထားတဲ့ အတိုင်း အလွယ်တစ်ကူ သုံးနိုင်ပါတယ်။



နမူနာ ပြထားတဲ့ ဖိုင်တွေကို အောက်က လင့်ခ် တွေမှာ ဒေါင်းလုပ် လုပ်ယူနိုင်ပါတယ်။
TestBibTex.tex
TestNatbib.tex
Ref1.bib
အကိုးအကား တွေကို စီမံဖို့ တော့ ဆော့ဖ်ဝဲသုံးတာ ပိုအဆင်ပြေပြီး JabRef Reference Manager ကို သဘောကျပါတယ်။
အကိုးအကား။ http://en.wikibooks.org/wiki/LaTeX/Bibliography_Management

Wednesday, March 7, 2012

Skeleton of Image Region

ပုံရိပ် တစ်ခုရဲ့ တည်ဆောက်ပုံ ပုံသဏ္ဌာန် ကို မျဉ်းကြောင်းများနဲ့ တုတ်ချောင်းပုံ လုပ်ပြီး ကိုယ်စားပြု ဖော်ပြနိုင်ပါတယ်။ အဲဒီလို ဖော်ပြဖို့အတွက် ပုံသဏ္ဌာန် တစ်ခုကို တဖြည်းဖြည်း ပိန်ပါးသွားအောင် လုပ်နည်း တစ်ခုခု ကို သုံးလို့ရပါတယ်။ ရလာတဲ့ မျဉ်းကြောင်းများနဲ့ တုတ်ချောင်းပုံ ကို အဲဒီ ပုံရဲ့ အရိုး (skeleton) လို့ ခေါ်ပါမယ်။ ဒီနည်းဟာ စာလုံးများကို စက်က သိရှိနားလည် မှတ်မိ အောင် လုပ်တဲ့ နေရာ (optical character recognition) တွေမှာ ပဏာမ အဆင့် အနေနဲ့ အသုံးကျကောင်း ကျနိုင်ပါတယ်။ အောက်ကပုံတွေမှာ နမူနာ မူရင်းပုံနဲ့ သူ့ရဲ့ အရိုးကို ဖော်ပြထားပါတယ်.
ပုံရိပ်တစ်ခု ရဲ့ အရိုးကို နည်းအမျိုးမျိုးနဲ့ ရယူနိုင်ပြီး အဲဒီ နည်းတွေထဲက လူသိများတဲ့ နည်းနှစ်နည်းက အလယ်ဝင်ရိုးပြောင်းနည်း Medial Axis Transformation (MAT) နဲ့ နှစ်ဆင့်ပါးနည်း Two Step Thinning တို့ပါ။ MAT မှာ ပုံသဏ္ဌာန် ထဲမှာ ရှိတဲ့ အစက် တစ်စက် ချင်းစီ အတွက် သူတို့ ရဲ့ အနီးဆုံး အနားသတ် ကို လိုက်ရှာပါတယ်။ အဲဒီလို အကွာအဝေးတူ အနီးဆုံး အနားသတ် တစ်ခုမက ရှိတဲ့ အစက်ကို အရိုး လို့သတ်မှတ်ပါတယ်။ MAT ကနားလည်ဖို့ လွယ်ပေမယ့် သူ့ကိုရဖို့ တွက်ချက်မှုတွေ အများကြီး လိုပါတယ်။ သူ့ကို တွက်ဖို့ အကွာအဝေးပုံစံ ပြောင်းခြင်း (distance transform) ကို အရင် လုပ်ပါတယ်။ အကွာအဝေးပုံစံ ပြောင်းတယ်ဆိုတာ ပုံသဏ္ဌာန် ထဲမှာ ရှိတဲ့ အစက် တစ်စက် ချင်းစီ ကို အနီးဆုံး အနားသတ်အထိ အကွာအဝေးနဲ့ အစားထိုးတာပါ။ ရလာတဲ့ ပုံမှာ အနားသတ်နဲ့ နီးတဲ့ အစက်က အကွာအဝေး တန်ဖိုးနည်းတော့ အလင်းအားပျော့ ပြီး၊ အနားသတ်နဲ့ ဝေးတဲ့ အစက်က အကွာအဝေးတန်ဖိုးကြီးတော့ ပိုလင်းပါမယ်။ နောက် အစက်တစ်စက် ခြင်းစီကို ဘေးတိုက် ဒါမှမဟုတ် ဒေါင်လိုက် ကပ်ရပ် အစက်တွေနဲ့ ယှဉ်ကြည့်ပြီး အလယ်မှာ အမြင့်ဆုံး ဖြစ်နေတဲ့ အစက်တွေကို အရိုးလို့ သတ်မှတ်ပါမယ်။ နမူနာ MATLAB ကုဒ် ကို ဒီမှာ (MATeg.m) ကြည့်နိုင်ပါတယ်။ မူရင်း ပုံသဏ္ဌာန်ရယ်၊ အကွာအဝေးပုံစံ ရယ်၊ ရလာတဲ့ အရိုးရယ် ကို အောက်က ပုံတွေမှာ ကြည့်နိုင်ပါတယ်။


နှစ်ဆင့်ပါးနည်း ကတော့ MAT နဲ့ယှဉ်ရင် ပိုမြန်၊ ပိုထိရောက်ပါတယ်။ နှစ်ဆင့်ပါးနည်း က ပုံသဏ္ဌာန် တစ်ခုရဲ့ အနားတွေကို ထပ်တလဲလဲ ဖျက်သွားတာပါ။ အဲဒီလို ဖျက်တဲ့ အခါမှာ အဆုံးမှတ်တွေကို မဖျက်ပါဘူး။ တနေရာနဲ့ တနေရာ ဆက်စပ်နေတဲ့ အမှတ်တွေကို မဖျက်ပါဘူး။ ပုံသဏ္ဌာန် ထဲမှာ ရှိတဲ့ အစက် တွေကို တန်ဖိုး တစ်ရှိတယ်လို့ မှတ်ယူ မှာ ဖြစ်ပြီး နောက်ခံ အစက်တွေကို တော့ တန်ဖိုး သုည ရှိတယ် လို့ မှတ်ယူပါမယ်။ ဒီနည်းမှာ အဆင့် နှစ်ဆင့် ကို ပုံပေါ်မှာ အထပ်ထပ် အဖန်ဖန် နောက်ဆုံး မပြောင်းလဲတဲ့ အရိုး ရတဲ့အထိ သုံးသွားမှာပါ။
အပေါ်ပုံမှာ အလယ် အစက်ရဲ့ ကပ်ရပ် အစက်တွေကို အခေါ်အဝေါ်သတ်မှတ်ပုံကို ပြထားပါတယ်။ ပထမ အဆင့်မှာ အစက် p1 ကို အောက်က အချက်လေးချက်နဲ့ ကိုက်ညီရင် ဖျက်ပစ် ပါမယ်။ (a) 2 ≤ N(p1) ≤ 6 (b) T(p1) = 1 (c) p2.p4.p6 = 0 (d) p4.p6.p8 = 0 အဲဒီမှာ N(p1) ဆိုတာက p1 နဲ့ ကပ်ရပ် အစက်တွေထဲက သုညမဟုတ်တဲ့ အစက် အရေအတွက်ဖြစ်ပြီး၊ T(p1) ဆိုတာက p2, p3, ... , p8, p9, p2 ဆိုတဲ့ အစီအစဉ်အတိုင်း ကြည့်သွားရင် ၀ ကနေ ၁ ကို ပြောင်းသွားတဲ့ အရေ အတွက်ပါ။ ဒုတိယ အဆင့်မှာ (a) နဲ့ (b) ကအတူတူပါပဲ။ ဒါပေမယ့် (c) နဲ့ (d) ကတော့ အောက်မှာ ပြထားတဲ့ အတိုင်း ပြောင်းသွားပါတယ်။ (c') p2.p4.p8= 0 (d') p2.p6.p8= 0 ပထမ အဆင့် ကို ပုံသဏ္ဌာန်တစ်ခုရဲ့ အနားသတ်ပေါ်မှာရှိတဲ့ အစက်တိုင်းအတွက် စဉ်းစားပါမယ်။ အချက် (a) ကနေ (d) ထဲက တစ်ချက်ချက် မကိုက်တာနဲ့ အဲဒီ အစက်ကို မဖျက်တော့ ပါဘူး။ အချက်အားလုံး ကိုက်ညီရင် တော့ ဖျက်ဖို့ အတွက် မှတ်ထားလိုက် ပါမယ်။ ဒါပေမယ့် အဲဒီ အစက် ကို အနားသတ် ပေါ်မှာရှိတဲ့ အစက် အားလုံးကို စဉ်းစားလို့ မပြီးမချင်း တကယ် မဖျက်သေးပါဘူး။ အဲဒီလို နောက်ကျမှ ဖျက်တဲ့ အတွက် တစ်ခြား အစက် တွေကို စဉ်းစား နေတဲ့ အချိန်မှာ ပုံသဏ္ဌာန် ပြောင်းသွားတာကို ကာကွယ်နိုင်ပါတယ်။ ပထမ အဆင့် ကို အနားသတ်ပေါ်မှာရှိတဲ့ အစက် အားလုံးကို စဉ်းစာပြီးပြီဆိုတာနဲ့ ဖျက်ဖို့မှတ်ထားတဲ့ အစက် အားလုံးကို ဖျက်လိုက်ပါမယ်။ (အစက်ရဲ့ တန်ဖိုးကို သုည ပြောင်းလိုက်တာပါ။) ရလာတဲ့ ရလဒ် ပေါ်မှာ ဒုတိယ အဆင့် ကိုလဲ ပထမအဆင့် အတိုင်း ထပ်သုံးပါမယ်။ ဒီ အဆင့်နှစ်ဆင့်ကို အကြိမ်ကြိမ် အဖန်ဖန် ပြန်သုံးမှာ ဖြစ်ပြီး အကြိမ်တစ်ကြိမ်တိုင်းမှာ အောက်က လုပ်ငန်းလေးခုကို လုပ်ပါတယ်။ (၁) ပထမ အဆင့်ကို သုံးပြီး ဖျက်ရမယ့် အစက်တွေကို မှတ်ပါတယ်။ (၂) မှတ်ထားတဲ့ အစက်တွေကို ဖျက်ပါတယ်။ (၃) ဒုတိယ အဆင့်ကို သုံးပြီး ဖျက်ရမယ့် အစက်တွေကို မှတ်ပါတယ်။ (၄) မှတ်ထားတဲ့ အစက်တွေကို ဖျက်ပါတယ်။ ဒီအဆင့်တွေကို သုံးပြီး ပါးပါးသွားရင်း နောက်ဆုံး ဖျက်စရာ အစက် မကျန်တော့ဘူးဆိုရင် ရပ်လိုက်ပါမယ်။ ရလာတဲ့ ပုံက အရိုးဖြစ်ပါတယ်။ အချက် (c) p2.p4.p6 = 0 နဲ့ (d) p4.p6.p8 = 0 ကို တစ်ခါထဲ ပေါင်းပြီး (p4 = 0 or p6= 0) or (p2=0 and p8=0) လို့ တန်းစစ်လို့လဲရပါတယ်။ အဲဒီလိုပဲ (c') နဲ့ (d') ကိုလဲ (p2=0 or p8=0) or (p4=0 and p6=0) လို့ ပေါင်းစစ်လို့ ရပါတယ်။ Two Step Thinning အတွက်နမူနာ MATLAB ကုဒ်ကို ဒီမှာ (TSTeg.m) တွေ့နိုင်ပါတယ်။
ရှေ့မှာ ဖော်ပြခဲ့တဲ့ ကုဒ်တွေက နည်းတွေကိုနားလည်ဖို့ ရယ်၊ တစ်ခြား ပရိုဂရမ် ဘာသာတွေနဲ့ ပြန်ရေးဖို့ရယ် အတွက်တော့ အထောက် အကူ ဖြစ်မယ်ထင်ပါတယ်။ တကယ်တော့ MATLAB မှာ bwmorph ဆိုတဲ့ ဖန်ရှင်ကို သုံးလိုက်တာနဲ့ အရိုးကို တန်းရနိုင်ပါတယ်။ sk=bwmorph(bwImg,'skel',Inf); အဲဒီလိုခိုင်းလိုက်ရင် ထွက်လာတဲ့ ရလဒ် ကို အောက်မှာ ပြထားပါတယ်။
Reference: Rafael C. Gonzalez, Richard E. Woods, Steven L. Eddins, "Digital Image Processing Using MATLAB", Second Edition, Mc Graw Hill (Asia), 2011.