반응형

가끔 필요한데 기억이 안날 때가 있다.

이를 위해서 연속 시간에서 이산 시간으로의 유도와 구현을 기록한다.

 

목차

1. 1차 저주파 필터

2. 1차 고주파 필터

3. 필터의 구현

 

 

1차 저주파 필터 (1st Order Low-Pass Filter)

1차 저주파 필터는 고주파 잡음이 있는 신호에 대해서 저주파 신호를 식별해낼 때 꽤 괜찮게 쓸 만 하다.

필터의 시상수가 걸러내고자 하는 고주파 잡음의 주파수보다는 높게,

원하는 저주파 신호 보다는 낮게 차단주파수를 가져가면 되기 때문이다.

 

시상수 $\tau$인 1차 저주파 필터를 연속 시간에서 표현하면 다음과 같다.

$$G_c (s) = \frac{Y(s)}{U(s)} = \frac{1}{\tau s + 1} $$

 

디지털 시스템에서 사용하기 위해 이를 시간 간격 $\Delta t$인 차분 방정식으로 옮기면 다음과 같다.

$Y(s) \left( \tau s + 1 \right) = U(s)$

$\left( y_{t+1} - y_{t} \right) \frac{\tau}{\Delta t} + y_t = u_t $

$\left( y_{t+1} - y_{t} \right) + \alpha y_t = \alpha u_t \hspace{10mm} \alpha=\frac{\Delta t }{\tau}$

$\therefore) y_{t+1} = \left(1-\alpha \right) y_t + \alpha u_t \hspace{10mm} \alpha=\frac{\Delta t}{\tau}$

 

라플라스 변환 표나 이산 상태 방정식으로의 변환을 통해서 구하면 다음과 같다.

$y_{t+1} = \left(1-\gamma \right) y_t + \gamma u_t \hspace{10mm} \gamma = \text{exp}\left(-\Delta t /\tau \right) $

 

 

1차 고주파 필터 (1st Order High-Pass Filter)

고주파 필터는 계측되는 신호에 Bias나 Drift가 존재할 때 쓸만 하다.

예를 들면 각속도계에서 계측되는 각속도 신호는 가만히 두어도 정확히 0값이 나오지 않고 어떤 값을 가지고 있는데, 괭장히 느리게 움직이는 기준점을 가진다. 시불변한 Bias를 가진다면 그만큼 빼주면 되겠지만, 아니라면 저주파 특성을 가진 Bias 혹은 Drift 신호를 걸러내면 될 것이다.

이때 고주파 필터를 사용하는 것이 효과적일 것이다.

 

시상수 $\tau$인 1차 고주파 필터를 연속 시간에서 표현하면 다음과 같다.

$$G_c (s) = \frac{Y(s)}{U(s)} = \frac{\tau s}{\tau s + 1} $$

유도를 용이하게 하기 위해서 다음과 같이 바꾸자.

$$G_c (s) = \frac{Y(s)}{U(s)} = \frac{ s}{ s + 1/\tau} $$

 

디지털 시스템에서 사용하기 위해 이를 시간 간격 $\Delta t$인 차분 방정식으로 옮기면 다음과 같다.

$Y(s) \left( s + 1/\tau \right) = U(s) s$

$\left( y_{t+1} - y_{t} \right) \frac{1}{\Delta t} + y_t \frac{1}{\tau} = \left( u_{t+1} - u_{t} \right) \frac{1}{\Delta t}$

$\left( y_{t+1} - y_{t} \right) + y_t \frac{\Delta t}{\tau} = \left( u_{t+1} - u_{t} \right) $

$\therefore) y_{t+1} = \left(1-\alpha \right) y_t + \left(u_{t+1} - u_t \right) \hspace{10mm} \alpha=\frac{\Delta t}{\tau}$

 

라플라스 변환 표나 이산 상태 방정식으로의 변환을 통해서 구하면 다음과 같다.

$y_{t+1} = \left(1-\gamma \right) y_t + \left(u_{t+1} - u_t \right) \hspace{10mm} \gamma = \text{exp}\left(-\Delta t /\tau \right) $

 

 

필터의 구현

위의 유도를 바탕으로 구현한 필터에 대한 MATLAB 스크립트이다.

수치해법 해는 시간 간격 dt 가 커지면(주기가 작아지면) 오차가 점점 커진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
%% Low-Pass Filter
 
clc;clear;
tau = 5.0;
dt = 0.1;
endtime = 10;
 
lpf = tf([1],[tau 1]);
 
alpha = dt/tau;
beta = dt/(tau+dt);
gamma = exp(-dt/tau);
 
= 1;
 
% Discrete Model
time = 0:dt:endtime;
yd = zeros(1,length(time));
ud = zeros(1,length(time))+1;
for i = 2 : length(time)
%     yd(i) = yd(i-1* (gamma) + ud(i) * (1-gamma); % 
%     yd(i) = yd(i-1* (1-alpha) + ud(i) * alpha; % Forward
    yd(i) = yd(i-1* (1-beta) + ud(i) * beta; % Backward
end
% Continuous Model
[y t x] = step(lpf, endtime);
figure(1);
plot(t,y); grid on; hold on;
plot(time, yd); hold off;
legend('Continuous','Discrete');
title('LPF');
 
 
 
 
%% High Pass Filter
clc;clear;
tau = 3.0;
dt = 0.1;
endtime = 10;
 
hpf = tf([tau 0],[tau 1]);
 
alpha = dt/tau;
beta = dt/(tau+dt);
gamma = exp(-dt/tau);
 
= 1;
 
% Discrete Model
time = 0:dt:endtime;
yd = zeros(1,length(time));
ud = zeros(1,length(time))+1;
ud(1= 0;
for i = 2 : length(time)
    yd(i) = yd(i-1* (gamma) + (ud(i) - ud(i-1)); % 
%     yd(i) = yd(i-1* (1-alpha) + (ud(i) - ud(i-1)); % Forward
%     yd(i) = yd(i-1* (1-beta) + (ud(i) - ud(i-1)); % Backward
end
% Continuous Model
[y t x] = step(hpf, endtime);
figure(1);
plot(t,y); grid on; hold on;
plot(time, yd); hold off;
legend('Continuous','Discrete');
xlabel('Time [sec]'); ylabel('Value');
title('HPF');
cs

 

 

728x90

+ Recent posts