Thanks to visit codestin.com
Credit goes to Github.com

Skip to content

ghlly2010/Filter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

5 Commits
ย 
ย 

Repository files navigation

Filter

1. ํ•„ํ„ฐ๋ž€๋ž€

  • ์‹ ํ˜ธ์—์„œ ์ƒ๊ธฐ๋Š” ๋…ธ์ด์ฆˆ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • ๋Œ€ํ‘œ์  ์˜ˆ์‹œ : MAF IIR ํ•„ํ„ฐ FIR ํ•„ํ„ฐ

2. ํ•„ํ„ฐ์˜ ์ข…๋ฅ˜

1. Low pass Filter



Low pass Filter๋Š” ๋‚ฎ์€ ์ฃผํŒŒ์ˆ˜ ์˜์—ญ์˜ ์‹ ํ˜ธ๋งŒ ํ†ต๊ณผ์‹œํ‚ค๋Š” ํ•„ํ„ฐ์ด๋‹ค.

2. High pass Filter



High pass Filter๋Š” ๋†’์€ ์ฃผํŒŒ์ˆ˜ ์˜์—ญ์˜ ์‹ ํ˜ธ๋งŒ ํ†ต๊ณผ์‹œํ‚ค๋Š” ํ•„ํ„ฐ์ด๋‹ค.

3. band pass Filter



band pass Filter๋Š” ์ผ์ •ํ•œ ๊ตฌ๊ฐ„ ๋‚ด์˜ ์‹ ํ˜ธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ํ•„ํ„ฐ์ด๋‹ค.

4. band stop Filter



band stop Filter๋Š” ์ผ์ •ํ•œ ๊ตฌ๊ฐ„ ์ด์™ธ์˜ ์‹ ํ˜ธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ํ•„ํ„ฐ์ด๋‹ค.

3. Digital Filter

  • ๋””์ง€ํ„ธ ํ•„ํ„ฐ๋Š” ์•„๋‚ ๋กœ๊ทธ ํ•„ํ„ฐ์˜ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ํ•„ํ„ฐ์ด๋‹ค.

1. MAF(Moving Average Filter)

  • Moving Average ํ•„ํ„ฐ (์ด๋™ ํ‰๊ท  ํ•„ํ„ฐ)๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋””์ง€ํ„ธ ํ•„ํ„ฐ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • ์ผ์ • ๊ฐœ์ˆ˜์˜ ์ตœ๊ทผ ์ž…๋ ฅ ์‹ ํ˜ธ ๊ฐ’์„ ํ‰๊ท  ๋‚ด์–ด ์ถœ๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ์™€ ์‹ ํ˜ธ ํ‰ํ™œํ™”(Smoothing) ์— ํšจ๊ณผ์ ์ด๋‹ค.

1. ์ˆ˜์‹ํ‘œํ˜„

์œˆ๋„์šฐ ํฌ๊ธฐ๊ฐ€ N์ผ ๋•Œ, ์‹œ์  n์—์„œ์˜ ์ถœ๋ ฅ y[n]์€:

$$ y[n] = \frac{1}{N} \sum_{k=0}^{N-1} x[n-k] $$

์—ฌ๊ธฐ์„œ,

  • ( $$x[n]$$ ) : ์ž…๋ ฅ ์‹ ํ˜ธ
  • ( $$y[n]$$ ) : ์ถœ๋ ฅ ์‹ ํ˜ธ
  • ( $$N$$ ) : ์œˆ๋„์šฐ ํฌ๊ธฐ

2. ์žฅ์ 

  • ๊ตฌํ˜„์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค.
  • ๊ณ ์ฃผํŒŒ ์žก์Œ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„ ํ˜• ์œ„์ƒ ํŠน์„ฑ์„ ๊ฐ€์ง„๋‹ค (์œ„์ƒ ์™œ๊ณก์ด ์—†์Œ).

3. ๋‹จ์ 

  • ์‹ ํ˜ธ์˜ ๊ธ‰๊ฒฉํ•œ ๋ณ€ํ™”(์—์ง€, ํ”ผํฌ)๋ฅผ ํฌ์„์‹œ์ผœ ์†์‹ค์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋“  ์ฃผํŒŒ์ˆ˜ ์„ฑ๋ถ„์„ ๋™์ผํ•˜๊ฒŒ ํ‰ํ™œํ™”ํ•˜์—ฌ, ์›ํ•˜๋Š” ๋Œ€์—ญ๋งŒ ์„ ํƒ์ ์œผ๋กœ ํ•„ํ„ฐ๋งํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ํฐ ์œˆ๋„์šฐ ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜๋ก ๋ฐ˜์‘ ์†๋„๊ฐ€ ๋А๋ ค์ง„๋‹ค.

4. ์ฝ”๋“œ ์˜ˆ์‹œ

ํŒŒ์ด์ฌ ์ฝ”๋“œ
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.]
C์–ธ์–ด ์ฝ”๋“œ
#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;
}

2. IIR Filter(Infinite Impulse Response Filter)

  • IIR ํ•„ํ„ฐ๋Š” "๋ฌดํ•œ ์ž„ํŽ„์Šค ์‘๋‹ต ํ•„ํ„ฐ"๋ผ๋Š” ๋œป์œผ๋กœ, ์ถœ๋ ฅ์ด ๊ณผ๊ฑฐ์˜ ์ž…๋ ฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ณผ๊ฑฐ์˜ ์ถœ๋ ฅ ๊ฐ’์—๋„ ์˜์กดํ•˜๋Š” ๋””์ง€ํ„ธ ํ•„ํ„ฐ์ด๋‹ค. ์ด๋กœ ์ธํ•ด ํ•„ํ„ฐ์˜ ์ž„ํŽ„์Šค ์‘๋‹ต์ด ์ด๋ก ์ ์œผ๋กœ ๋ฌดํ•œํžˆ ์ง€์†๋˜๋Š” ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.
  • ์ถœ๋ ฅ์ด ๊ณผ๊ฑฐ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๋ชจ๋‘์— ์˜์กดํ•˜๊ธฐ์— ์ž„ํŽ„์Šค ์‘๋‹ต์ด ๋ฌดํ•œ๋Œ€์ด๋‹ค.

1. ์ˆ˜์‹ํ‘œํ˜„

์ผ๋ฐ˜์ ์ธ IIR ํ•„ํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ **์ฐจ๋ถ„๋ฐฉ์ •์‹(difference equation)**์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

$$ y[n] = \sum_{k=0}^{M} b_k \cdot x[n-k] - \sum_{k=1}^{N} a_k \cdot y[n-k] $$

์—ฌ๊ธฐ์„œ,

  • ( $$x[n]$$ ): ์ž…๋ ฅ ์‹ ํ˜ธ
  • ( $$y[n]$$ ): ์ถœ๋ ฅ ์‹ ํ˜ธ
  • ( $$b_k$$ ): ๋ถ„์ž ๊ณ„์ˆ˜ (Feedforward ๊ณ„์ˆ˜)
  • ( $$a_k$$ ): ๋ถ„๋ชจ ๊ณ„์ˆ˜ (Feedback ๊ณ„์ˆ˜)
  • ( $$M$$ ): FIR ๋ถ€๋ถ„์˜ ์ฐจ์ˆ˜
  • ( $$N$$ ): IIR ๋ถ€๋ถ„์˜ ์ฐจ์ˆ˜

2. ์žฅ์ 

  • ํšจ์œจ์ : ๊ฐ™์€ ์ฃผํŒŒ์ˆ˜ ์‘๋‹ต์„ ์–ป์„ ๋•Œ FIR๋ณด๋‹ค ์ฐจ์ˆ˜๊ฐ€ ๋‚ฎ์•„ ์—ฐ์‚ฐ๋Ÿ‰์ด ์ ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ: ์ ์€ ๊ณ„์ˆ˜๋กœ ์›ํ•˜๋Š” ํ•„ํ„ฐ ํŠน์„ฑ์„ ๊ตฌํ˜„ ๊ฐ€๋Šฅ.
  • ์•„๋‚ ๋กœ๊ทธ ํ•„ํ„ฐ์™€ ์œ ์‚ฌ: Butterworth, Chebyshev, Elliptic ๋“ฑ์˜ ์•„๋‚ ๋กœ๊ทธ ํ•„ํ„ฐ๋ฅผ ๋””์ง€ํ„ธ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ.

3. ๋‹จ์ 

  • ์œ„์ƒ ์™œ๊ณก ๋ฐœ์ƒ ๊ฐ€๋Šฅ (์„ ํ˜• ์œ„์ƒ์ด ์•„๋‹˜).
  • ์‹œ์Šคํ…œ์ด ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ์Œ (ํด์ด ๋‹จ์œ„์›(Unit circle) ๋ฐ–์— ์กด์žฌํ•˜๋ฉด ๋ถˆ์•ˆ์ •).
  • ๊ตฌํ˜„ ๋ฐ ์„ค๊ณ„๊ฐ€ FIR๋ณด๋‹ค ๋ณต์žก.

4. ์ฃผํŒŒ์ˆ˜ ์‘๋‹ต

IIR ํ•„ํ„ฐ๋Š” ์ „๋‹ฌ ํ•จ์ˆ˜(Transfer Function)๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

$$ H(z) = \frac{\sum_{k=0}^{M} b_k z^{-k}}{1 + \sum_{k=1}^{N} a_k z^{-k}} $$

  • ๋ถ„๋ชจ(denominator)๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌดํ•œ ์‘๋‹ต์ด ๋ฐœ์ƒ.
  • ํด(pole)๊ณผ ์ œ๋กœ(zero)์˜ ์œ„์น˜์— ๋”ฐ๋ผ ์ฃผํŒŒ์ˆ˜ ํŠน์„ฑ์ด ๊ฒฐ์ •๋จ.

5. ์ฝ”๋“œ ์˜ˆ์‹œ

ํŒŒ์ด์ฌ ์ฝ”๋“œ
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()
C์–ธ์–ด ์ฝ”๋“œ
#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;
}

3. FIR Filter(Finite Impulse Response Filter)

  • FIR ํ•„ํ„ฐ๋Š” "์œ ํ•œ ์ž„ํŽ„์Šค ์‘๋‹ต ํ•„ํ„ฐ"๋ผ๋Š” ๋œป์œผ๋กœ, ์ถœ๋ ฅ์ด ๊ณผ๊ฑฐ์˜ ์ž…๋ ฅ ๊ฐ’๋“ค์—๋งŒ ์˜์กดํ•˜๋Š” ๋””์ง€ํ„ธ ํ•„ํ„ฐ์ด๋‹ค.
    ์ž„ํŽ„์Šค ์‘๋‹ต์ด ์ผ์ • ๊ธธ์ด ์ดํ›„์— 0์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— "์œ ํ•œ"์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ์ถœ๋ ฅ์ด ๊ณผ๊ฑฐ์˜ ์ž…๋ ฅ ๊ฐ’์—๋งŒ ์˜์กดํ•˜๊ธฐ์— ์ž„ํŽ„์Šค ์‘๋‹ต์ด ์œ ํ•œํ•˜๋‹ค.

1. ์ˆ˜์‹ํ‘œํ˜„ํ˜„

FIR ํ•„ํ„ฐ์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ๋ถ„๋ฐฉ์ •์‹์œผ๋กœ ์ •์˜๋œ๋‹ค:

$$ y[n] = \sum_{k=0}^{M} b_k \cdot x[n-k] $$

์—ฌ๊ธฐ์„œ,

  • ( $$x[n]$$ ): ์ž…๋ ฅ ์‹ ํ˜ธ
  • ( $$y[n]$$ ): ์ถœ๋ ฅ ์‹ ํ˜ธ
  • ( $$b_k$$ ): ํ•„ํ„ฐ ๊ณ„์ˆ˜ (์ž„ํŽ„์Šค ์‘๋‹ต)
  • ( $$M$$ ): ํ•„ํ„ฐ ์ฐจ์ˆ˜ (๊ณ„์ˆ˜ ๊ฐœ์ˆ˜ - 1)

์ฆ‰, ์ถœ๋ ฅ์€ ์ž…๋ ฅ ์ƒ˜ํ”Œ๋“ค์˜ ๊ฐ€์ค‘ํ•ฉ(Weighted Sum) ์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

2. ์žฅ์ 

  • ํ•ญ์ƒ ์•ˆ์ •์ ์ด๋‹ค (ํ”ผ๋“œ๋ฐฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ).
  • ์„ ํ˜• ์œ„์ƒ(Linear Phase) ์„ค๊ณ„ ๊ฐ€๋Šฅ โ†’ ์‹ ํ˜ธ์˜ ํŒŒํ˜• ์™œ๊ณก์ด ์ ๋‹ค.
  • ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ด๋‹ค.

3. ๋‹จ์ 

  • ๋™์ผํ•œ ์„ฑ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” IIR๋ณด๋‹ค ๋†’์€ ์ฐจ์ˆ˜๊ฐ€ ํ•„์š” โ†’ ์—ฐ์‚ฐ๋Ÿ‰ ์ฆ๊ฐ€.
  • ์‹ค์‹œ๊ฐ„ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ณ„์‚ฐ๋Ÿ‰์ด ๋ถ€๋‹ด๋  ์ˆ˜ ์žˆ๋‹ค.

4. ์ฃผํŒŒ์ˆ˜ ์‘๋‹ต

FIR ํ•„ํ„ฐ์˜ ์ „๋‹ฌ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„๋œ๋‹ค:

$$ H(z) = \sum_{k=0}^{M} b_k z^{-k} $$

์ฆ‰, ๋ถ„๋ชจ(denominator)๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์œ ํ•œ ์ž„ํŽ„์Šค ์‘๋‹ต์ด ๋œ๋‹ค.

5. ์ฝ”๋“œ ์˜ˆ์‹œ

ํŒŒ์ด์ฌ ์ฝ”๋“œ
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()
C์–ธ์–ด ์ฝ”๋“œ
#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;
}

About

introduce Filter

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published