Audio Processing

오디오 필터(10)-IIR 대역통과 필터(Band Pass Filter, BPF)

gigasound 2021. 10. 29. 16:47


대역 통과 필터

대역통과 필터(band pass filter, BPF)는 특정 주파수 사이의 신호만 통과하는 필터입니다.

대역통과 필터는 오디오 신호의 대역을 조정해서 불필요한 잡음의 영향을 줄이거나, 음향적인 효과를주기 위해 사용합니다. 특히 스피커를 위한 크로스오버에서도 활용됩니다. 이부분은 다시 다루기로 하겠습니다. 

대역 통과 필터의 특성


필터 합성

이 필터를 만드는 방법도 여러 가지가 있지만, 다음과 같이 저역통과 필터와 고역통과 필터를 조합해서 구현하기도 합니다. 그러니 두 필터를 형성하는 필터 계수를 각각 구하고 조합하는 방법을 사용합니다. 이때 필터의 순서는 대역 통과 필터를 구현하는데 아무런 관계가 없습니다. 

LPF와 HPF를 이용향 대역 통과 필터의 구현 

두 필터를 합성하는 방법은 두필터의 전달 함수를 곱하면됩니다. 그런데 다른 글에서 전달함수의 결과로 필터 계수를 얻는 GNU Octave의 스크립트 파일을 작성해 사용했습니다. 이부분에 대햔 내용은 아래를 참조해 주세요

https://medialink.tistory.com/73?category=958130

https://medialink.tistory.com/77?category=958130 

https://medialink.tistory.com/74?category=958130 

https://medialink.tistory.com/75?category=958130 

 

위의 스크립트로 구한 핕터 계수를 GNU Octave의 내부 함수를 이용해서 합성해 보겠습니다. poly2sym()함수로 전달함수의 수식을 생성합니다. 그리고 각 필터의 분모와 분자 부분을 각자 곱합니다. 최종적으로 분모 분자 부분을 sym2poly()를 이용해서 계수만 추출합니다. 그러면 다음과 같이 LPF와 HPF를 합성한 계수를 구할 수있습니다. 

function [coef_b, coef_a] = BPF(f0,f1,fs,Q)
  z = sym('z');
  coef_a = zeros(1,3);
  coef_b = zeros(1,3);
  n = 1;
  d = 1;
  [b,a] = HPF(f0,fs,Q);
  n *= poly2sym(b,z);
  d *= poly2sym(a,z);
  [b,a] = LPF(f1,fs,Q);
  n *= poly2sym(b,z);
  d *= poly2sym(a,z);
  coef_b = sym2poly(n);
  coef_a = sym2poly(d);
endfunction

GNU Octave로 필터 검토

다음과 같이 bpf.m을 만들고 GNU Octave에서 실행해서 필터의 특성을 검토합니다. 이때 저역통과 필터와 고역 통과 필터의 검토에서 사용했던 내용을 포함해서 만듭니다.

clear all;
pkg load signal;
pkg load symbolic;

fs = 44100.0;
f0 = 200.0;
f1 = 3000.0;
NFFT = 1024;
Q=0.71; # butterworth, 2 order 

function  [coef_b, coef_a] = LPF(f0,fs,Q)
  coef_b = zeros(1,3);
  coef_a = zeros(1,3);
  w0 = 2 * pi * f0 / fs;
  c0 = cos(w0);
  s0 = sin(w0);
  h = s0 /(2 * Q);
  b0 = (1 - c0)/2;
  b1 = 1 - c0;
  b2 = b0;
  a0 = 1 + h;
  a1 = -2 * c0;
  a2 = 1 - h;
  coef_b(1) = b0 / a0;
  coef_b(2) = b1 / a0;
  coef_b(3) = b0 / a0;
  coef_a(1) = 1;
  coef_a(2) = a1 / a0;
  coef_a(3) = a2 / a0;
endfunction

function  [coef_b, coef_a] = HPF(f0,fs,Q)
  coef_b = zeros(1,3)
  coef_a = zeros(1,3)
  w0 = 2 * pi * f0 / fs;
  c0 = cos(w0);
  s0 = sin(w0);
  h = s0 /(2 * Q);
  b0 = (1 + c0)/2;
  b1 = -(1 + c0);
  b2 = b0;
  a0 = 1 + h;
  a1 = -2 * c0;
  a2 = 1 - h;
  coef_b(1) = b0 / a0;
  coef_b(2) = b1 / a0;
  coef_b(3) = b0 / a0;
  coef_a(1) = 1.0;
  coef_a(2) = a1 / a0;
  coef_a(3) = a2 / a0;
endfunction

function [coef_b, coef_a] = BPF(f0,f1,fs,Q)
  z = sym('z');
  coef_a = zeros(1,3);
  coef_b = zeros(1,3);
  n = 1;
  d = 1;
  [b,a] = HPF(f0,fs,Q);
  n *= poly2sym(b,z);
  d *= poly2sym(a,z);
  [b,a] = LPF(f1,fs,Q);
  n *= poly2sym(b,z);
  d *= poly2sym(a,z);
  coef_b = sym2poly(n);
  coef_a = sym2poly(d);
endfunction

[b,a]=BPF(f0,f1,fs,Q);
[h,w]=freqz(b,a,NFFT,fs);
m = 20.0*log10(abs(h));

figure(1);
clf;
zplane(b,a);
figure(2);
clf;
subplot(2,1,1)
semilogx(w,m)
xlim([20 44100/2])
ylim([-40 10])
xlabel("frequency(Hz)")
ylabel("magitude(dB)")
grid()
subplot(2,1,2)
semilogx(w,arg(h)*180/pi)
xlim([20 44100/2])
ylim([-200 200])
xlabel("frequency(Hz)")
ylabel("phase(deg)")
grid()

bpf.m
0.00MB


필터 특성 검토 

z영역에서 극점 위치를 검토해서 안전성을 확인할 수 있습니다.

z역역에서 BPF의 극점과 영점

주파수 특성은 다음과 같이 보입니다.

BPF의 주파수 특성


광고좀 꾹 눌러주시면 고맙겠습니다. 


위의 내용을 참조용으로만 사용해주세요. 무단 도용이나 무단 복제는 불허합니다.

기타 문의 사항은 gigasound@naver.com에 남겨 주시면 고맙겠습니다.