- ์ ํธ์์ ์๊ธฐ๋ ๋ ธ์ด์ฆ๋ฅผ ์ ๊ฑฐํ๋ ์ญํ ์ ํ๋ค.
- ๋ํ์ ์์ : MAF IIR ํํฐ FIR ํํฐ
Low pass Filter๋ ๋ฎ์ ์ฃผํ์ ์์ญ์ ์ ํธ๋ง ํต๊ณผ์ํค๋ ํํฐ์ด๋ค.
High pass Filter๋ ๋์ ์ฃผํ์ ์์ญ์ ์ ํธ๋ง ํต๊ณผ์ํค๋ ํํฐ์ด๋ค.
band pass Filter๋ ์ผ์ ํ ๊ตฌ๊ฐ ๋ด์ ์ ํธ๋ฅผ ํต๊ณผ์ํค๋ ํํฐ์ด๋ค.
band stop Filter๋ ์ผ์ ํ ๊ตฌ๊ฐ ์ด์ธ์ ์ ํธ๋ฅผ ํต๊ณผ์ํค๋ ํํฐ์ด๋ค.
- ๋์งํธ ํํฐ๋ ์๋ ๋ก๊ทธ ํํฐ์ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ๊ณ ์๋ ํํฐ์ด๋ค.
- Moving Average ํํฐ (์ด๋ ํ๊ท ํํฐ)๋ ๊ฐ์ฅ ๊ฐ๋จํ๋ฉด์๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋์งํธ ํํฐ ์ค ํ๋์ด๋ค.
- ์ผ์ ๊ฐ์์ ์ต๊ทผ ์ ๋ ฅ ์ ํธ ๊ฐ์ ํ๊ท ๋ด์ด ์ถ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก, ๋ ธ์ด์ฆ ์ ๊ฑฐ์ ์ ํธ ํํํ(Smoothing) ์ ํจ๊ณผ์ ์ด๋ค.
์๋์ฐ ํฌ๊ธฐ๊ฐ N์ผ ๋, ์์ n์์์ ์ถ๋ ฅ y[n]์:
์ฌ๊ธฐ์,
- (
$$x[n]$$ ) : ์ ๋ ฅ ์ ํธ - (
$$y[n]$$ ) : ์ถ๋ ฅ ์ ํธ - (
$$N$$ ) : ์๋์ฐ ํฌ๊ธฐ
- ๊ตฌํ์ด ๋งค์ฐ ๊ฐ๋จํ๋ค.
- ๊ณ ์ฃผํ ์ก์์ ํจ๊ณผ์ ์ผ๋ก ์ ๊ฑฐํ ์ ์๋ค.
- ์ ํ ์์ ํน์ฑ์ ๊ฐ์ง๋ค (์์ ์๊ณก์ด ์์).
- ์ ํธ์ ๊ธ๊ฒฉํ ๋ณํ(์์ง, ํผํฌ)๋ฅผ ํฌ์์์ผ ์์ค์ ์ ๋ฐํ ์ ์๋ค.
- ๋ชจ๋ ์ฃผํ์ ์ฑ๋ถ์ ๋์ผํ๊ฒ ํํํํ์ฌ, ์ํ๋ ๋์ญ๋ง ์ ํ์ ์ผ๋ก ํํฐ๋งํ๊ธฐ ์ด๋ ต๋ค.
- ํฐ ์๋์ฐ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ ์๋ก ๋ฐ์ ์๋๊ฐ ๋๋ ค์ง๋ค.
import numpy as np
def moving_average(x, N):
return np.convolve(x, np.ones(N)/N, mode='valid')
# ์์ ๋ฐ์ดํฐ
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# ์๋์ฐ ํฌ๊ธฐ 3์ผ๋ก ์ด๋ ํ๊ท ์ ์ฉ
filtered = moving_average(data, 3)
print(filtered) # [2. 3. 4. 5. 6. 7. 8.]#include<stdio.h>
int main()
{
int arr[10]={0}; //๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
for(int i=0;i<10;i++)
{
int sum=0; // ํฉ์ ์ ์ฅํ ๋ณ์
arr[i]=input_data; //์
๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ด์ ์ ์ฅ
for(int j=0;j<10;j++)
{
sum+=arr[j]; // ๋ฐฐ์ด์ ์์๋ฅผ ํ๋์ฉ ๋ํจ
}
int Filter=sum/10; // ํํฐ๋ง ๊ฒฐ๊ณผ
}
return 0;
}- IIR ํํฐ๋ "๋ฌดํ ์ํ์ค ์๋ต ํํฐ"๋ผ๋ ๋ป์ผ๋ก, ์ถ๋ ฅ์ด ๊ณผ๊ฑฐ์ ์ ๋ ฅ๋ฟ๋ง ์๋๋ผ ๊ณผ๊ฑฐ์ ์ถ๋ ฅ ๊ฐ์๋ ์์กดํ๋ ๋์งํธ ํํฐ์ด๋ค. ์ด๋ก ์ธํด ํํฐ์ ์ํ์ค ์๋ต์ด ์ด๋ก ์ ์ผ๋ก ๋ฌดํํ ์ง์๋๋ ํน์ง์ ๊ฐ์ง๋ค.
- ์ถ๋ ฅ์ด ๊ณผ๊ฑฐ์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ ๋ชจ๋์ ์์กดํ๊ธฐ์ ์ํ์ค ์๋ต์ด ๋ฌดํ๋์ด๋ค.
์ผ๋ฐ์ ์ธ IIR ํํฐ๋ ๋ค์๊ณผ ๊ฐ์ **์ฐจ๋ถ๋ฐฉ์ ์(difference equation)**์ผ๋ก ํํ๋๋ค.
์ฌ๊ธฐ์,
- (
$$x[n]$$ ): ์ ๋ ฅ ์ ํธ - (
$$y[n]$$ ): ์ถ๋ ฅ ์ ํธ - (
$$b_k$$ ): ๋ถ์ ๊ณ์ (Feedforward ๊ณ์) - (
$$a_k$$ ): ๋ถ๋ชจ ๊ณ์ (Feedback ๊ณ์) - (
$$M$$ ): FIR ๋ถ๋ถ์ ์ฐจ์ - (
$$N$$ ): IIR ๋ถ๋ถ์ ์ฐจ์
- ํจ์จ์ : ๊ฐ์ ์ฃผํ์ ์๋ต์ ์ป์ ๋ FIR๋ณด๋ค ์ฐจ์๊ฐ ๋ฎ์ ์ฐ์ฐ๋์ด ์ ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ: ์ ์ ๊ณ์๋ก ์ํ๋ ํํฐ ํน์ฑ์ ๊ตฌํ ๊ฐ๋ฅ.
- ์๋ ๋ก๊ทธ ํํฐ์ ์ ์ฌ: Butterworth, Chebyshev, Elliptic ๋ฑ์ ์๋ ๋ก๊ทธ ํํฐ๋ฅผ ๋์งํธ๋ก ๊ตฌํ ๊ฐ๋ฅ.
- ์์ ์๊ณก ๋ฐ์ ๊ฐ๋ฅ (์ ํ ์์์ด ์๋).
- ์์คํ ์ด ๋ถ์์ ํด์ง ์ ์์ (ํด์ด ๋จ์์(Unit circle) ๋ฐ์ ์กด์ฌํ๋ฉด ๋ถ์์ ).
- ๊ตฌํ ๋ฐ ์ค๊ณ๊ฐ FIR๋ณด๋ค ๋ณต์ก.
IIR ํํฐ๋ ์ ๋ฌ ํจ์(Transfer Function)๋ก ํํํ ์ ์๋ค.
- ๋ถ๋ชจ(denominator)๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ฌดํ ์๋ต์ด ๋ฐ์.
- ํด(pole)๊ณผ ์ ๋ก(zero)์ ์์น์ ๋ฐ๋ผ ์ฃผํ์ ํน์ฑ์ด ๊ฒฐ์ ๋จ.
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# Butterworth ์ ์ญํต๊ณผ IIR ํํฐ ์ค๊ณ
b, a = signal.butter(N=4, Wn=0.2) # ์ฐจ์ 4, ์ฐจ๋จ ์ฃผํ์ 0.2 (์ ๊ทํ)
# ์ฃผํ์ ์๋ต
w, h = signal.freqz(b, a)
plt.plot(w/np.pi, 20*np.log10(abs(h)))
plt.title("IIR Filter (Butterworth) Frequency Response")
plt.xlabel("Normalized Frequency")
plt.ylabel("Magnitude (dB)")
plt.grid()
plt.show()#include<stdio.h>
int main()
{
double a=0.2; // ํํฐ๊ณ์
double x[10]; //์
๋ ฅ์ ํธ
double y[10]; //์ถ๋ ฅ์ ํธ
y[0]=a*x[0];
for (int n = 1; n < 10; n++) {
y[n] = a * x[n] + (1.0 - a) * y[n - 1];
}
return 0;
}- FIR ํํฐ๋ "์ ํ ์ํ์ค ์๋ต ํํฐ"๋ผ๋ ๋ป์ผ๋ก, ์ถ๋ ฅ์ด ๊ณผ๊ฑฐ์ ์
๋ ฅ ๊ฐ๋ค์๋ง ์์กดํ๋ ๋์งํธ ํํฐ์ด๋ค.
์ํ์ค ์๋ต์ด ์ผ์ ๊ธธ์ด ์ดํ์ 0์ด ๋๊ธฐ ๋๋ฌธ์ "์ ํ"์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. - ์ถ๋ ฅ์ด ๊ณผ๊ฑฐ์ ์ ๋ ฅ ๊ฐ์๋ง ์์กดํ๊ธฐ์ ์ํ์ค ์๋ต์ด ์ ํํ๋ค.
FIR ํํฐ์ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ ์ฐจ๋ถ๋ฐฉ์ ์์ผ๋ก ์ ์๋๋ค:
์ฌ๊ธฐ์,
- (
$$x[n]$$ ): ์ ๋ ฅ ์ ํธ - (
$$y[n]$$ ): ์ถ๋ ฅ ์ ํธ - (
$$b_k$$ ): ํํฐ ๊ณ์ (์ํ์ค ์๋ต) - (
$$M$$ ): ํํฐ ์ฐจ์ (๊ณ์ ๊ฐ์ - 1)
์ฆ, ์ถ๋ ฅ์ ์ ๋ ฅ ์ํ๋ค์ ๊ฐ์คํฉ(Weighted Sum) ์ผ๋ก ํํ๋๋ค.
- ํญ์ ์์ ์ ์ด๋ค (ํผ๋๋ฐฑ์ด ์๊ธฐ ๋๋ฌธ).
- ์ ํ ์์(Linear Phase) ์ค๊ณ ๊ฐ๋ฅ โ ์ ํธ์ ํํ ์๊ณก์ด ์ ๋ค.
- ๊ตฌํ์ด ๋จ์ํ๊ณ ์ง๊ด์ ์ด๋ค.
- ๋์ผํ ์ฑ๋ฅ์ ์ป๊ธฐ ์ํด์๋ IIR๋ณด๋ค ๋์ ์ฐจ์๊ฐ ํ์ โ ์ฐ์ฐ๋ ์ฆ๊ฐ.
- ์ค์๊ฐ ์์คํ ์์๋ ๊ณ์ฐ๋์ด ๋ถ๋ด๋ ์ ์๋ค.
FIR ํํฐ์ ์ ๋ฌ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ํํ๋๋ค:
์ฆ, ๋ถ๋ชจ(denominator)๊ฐ ์์ผ๋ฏ๋ก ์ ํ ์ํ์ค ์๋ต์ด ๋๋ค.
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# FIR ์ ์ญํต๊ณผ ํํฐ ์ค๊ณ (์๋์ฐ๋ฒ, Hamming)
numtaps = 21 # ํํฐ ๊ณ์ ๊ฐ์
cutoff = 0.3 # ์ ๊ทํ ์ฐจ๋จ ์ฃผํ์
b = signal.firwin(numtaps, cutoff, window="hamming")
# ์ฃผํ์ ์๋ต
w, h = signal.freqz(b)
plt.plot(w/np.pi, 20*np.log10(abs(h)))
plt.title("FIR Filter (Low-pass, Hamming Window)")
plt.xlabel("Normalized Frequency")
plt.ylabel("Magnitude (dB)")
plt.grid()
plt.show()#include<stdio.h>
int main()
{
double b[5]={0.3,0.3,0.3,0.3,0.3}; // ํํฐ๊ณ์ 5
double x[10]; //์
๋ ฅ์ ํธ
double y[10]; //์ถ๋ ฅ์ ํธ
y[0]=a*x[0];
for (int n = 0; n < 10; n++) {
for (int k = 0; k < 5; k++) {
if (n - k >= 0) {
y[n] += b[k] * x[n - k];
}
}
}
return 0;
}