MATLAB 을 사용하여 신호 처리를 하다 보면 필터를 설계하는 경우가 있고 필터의 게인을 조절해야 되는 경우가 있습니다. 보통 디지털 필터 설계를 할 때는 pass band 의 게인을 1 (0 dB) 로 맞춰 주게 되는데 오늘은 이 방법에 대해서 소개를 하려 합니다.

MATLAB 을 사용하여 필터 설계하고 코드를 생성하거나 모델을 만들때는 fdatool (Filter Design & Analysis Tool) 을 주로 사용하게 되고 필터를 확인하고 싶을때는 fvtool(Filter Visualization Tool) 을 주로 사용합니다.

FIR 필터 계수가 CoeffV 인 경우 MATLAB 명령창에 fvtool(CoeffV,1) 라고 명령하면 아래와 같은 Filter Visualization Tool 이 실행되고 해당 필터 계수에 대한 정보들을 확인 할 수 있습니다.

또한 Analysis -> Analysis Parameters 를 선택하면

아래와 같이 Analysis Parameters 창이 나타나고 “Normalize Magnitude to 1 (0 dB)” 를 체크하고 적용하면

아래와 같이 pass band 의 게인이 1 로 설정이 되는 것을 확인 할 수 있습니다.

그런데 이러한 설정은 실제 값이 바뀌는 것이 아닌 그래프의 형태만 바뀌는 것입니다. 따라서 실제 필터의 게인을 1 (0 dB) 로 설정하기 위해서는 필터의 게인을 알아낸 후 scaling factor 값을 구해서 해당 값으로 필터 Coefficient 를 scaling 해 줘야 합니다. 이러한 작업을 하는 코드는 아래와 같습니다.

[h, w] = freqz(num, den); % frequency response of (num, den)

scale = 1/max(abs(h)); % scaling factor

numScaled = num*scale;

fvtool(numScaled, den) 명령을 통해 해당 필터의 magnitude response 를 확인해 보면 pass band 의 게인이 1 (0 dB) 로 맞춰진 것을 확인 할 수 있습니다.



신호 처리 업무를 하면서 가끔씩은 디지털 필터가 필요한 경우가 있습니다. 저도 최근에 DC 성분을 제거하는 DC 제거 필터가 필요해서 검색을 해보니 아래 주소에서 굉장히 좋은 글을 발견할 수 있었습니다.

DC 제거 필터 관련 읽어볼만한 글

https://www.embedded.com/design/configurable-systems/4007653/DSP-Tricks-DC-Removal

위 링크의 글에서 확인할 수 있는 바와 같이 가장 기본적인 DC 제거 필터의 시간 도메인 수식은 아래와 같습니다.

DC 제거 필터 수식

x[n] - x[n-1] = y[n] – a* y[n-1], a < 0

DC 제거 필터의 zero 가 1 이 됨으로서 DC 에 무한대의 attenuation 을 주게 되고 a 값이 1 에 가까워 질수록 notch 의 기울기가 증가하게 됩니다.

numerator [1 -1], denominator [1 -0.95] 인 경우의 DC 필터에 대해 MATLAB을 사용하여 알아보면~

freqz 명령어를 통해 Frequency response 를 확인할 수 있고 명령어는 아래와 같습니다.

freqz([1 -1], [1 -0.95],512,1000)

zero-pole plot 을 확인하기 위해스는 zplane 명령어를 사용하고 아래와 같이 확인 할 수 있습니다.

zplane([1 -1], [1 -0.95])

Impulse response 에 대해 확인하기 위해서는 impz 함수를 사용하고 아래 예와 같이 사용합니다.

impz([1 -1], [1 -0.95])

디지털 필터 관련 참고 자료들

IIR Filter 관련 읽어볼만한 글

http://www.eas.uccs.edu/~mwickert/ece2610/lecture_notes/ece2610_chap8.pdf

Lecture Notes

http://www.eas.uccs.edu/~mwickert/ece2610/lecture_notes/

DC 필터 이외의 다양한 필터들에 대한 수식들

저주파 통과 필터

y[k] = a*y[k-1]+(1-a)*x[k],  a < 0

고주파 통과 필터

y[k] = -a*y[k-1]+(1-a)*x[k], a < 0

평균 필터

y[k] = [(k-1)/k]*y[k-1]+(1/k)*x[k]

N 이동평균 필터

y[k] = y[k-1] + (x[k]-x[k-N])/N



+ Recent posts