본문 바로가기
Audio Processing

오디오 필터(20)-콘보루션을 이용한 FIR 필터의 실행

by gigasound 2021. 10. 29.

 

 

 


콘보루션과 FIR 필터 

FIR 필터의 계수를 구하는 방법으로 윈도우 방식과 주파수 샘플링 방식에 대해 설명한 적이 있습니다. IIR 필터를 실행한 것과 같이 이번에도 오디오 신호를 입력하고 FIR 필터를 통과해서 출력하는 방법을 알아보겠습니다. 

먼저 FIR 필터 실행에 기반이 되는 콘보루션에 대해서도 알아보겠습니다.


콘보루션

콘보루션(convolution) 또는 합성곱은 하나의 신호 함수에 가중 함수를 곱해서 그 결과는 얻는 방법입니다. 기본적인 방법은 하나의 함수를 시간 반전하고 $\tau$ 만큼 시간 이동해서 이를 적분하는 것입니다. 이때 함수의 순서는 중요하지 않습니다. 어느 함수를 반전하던지 관계없습니다.

$$(f\ast g)(t)=\int_{\tau = -\infty}^{\infty}f(\tau)g(t-\tau)d\tau$$

이산 신호에 대해서는 다음과 같이 정리됩니다. 여기서 $k=0,\cdots ,N-1$입니다. 

$$(f\ast g)(n)=\sum_{k=0}^{N-1}f(k)g(n-k)$$

FIR 필터는 입력 신호를 필터 계수를 가중치로해서 출력하는 방식입니다. 콘보루션에서 가충치에 해당하는 함수를 특히 커널(kernal)이라고 입니다. 

 


FIR 저역 통과 필터의 실행

저번 글에서 구한 LPF를 GNU Octave의 스크립트로 실행해 보겠습니다. 물론 Octave에 FIR 필터를 구하고, 콘보루션 해주는 모든 함수들이 있지만, 이를 실제 DSP에서 활용할 수는 없기 때문에 C언어로도 변환이 가능한 수준의 스크립을 만들겠습니다. 이 스크립트는 다음과 같이 동작합니다.

  • 오디오 파일에서 데이터를 추출합니다.
  • 주파수 샘플링 방법으로 1000Hz의 LPF를 만듭니다.
  • LPF와 오디오 데이터를 콘보루션해서 출력 데이터를 만듭니다.
  • 비교 검토를 위해 원래 오디오 데이터와 출력 데이터를 오디오로 연속 출력합니다. 
clear all;
pkg load signal;

N=101;
if(mod(N,2)==0)
  N =N+1;
endif
fs=44100;
fc=1000;

function [h,w]=LPF(fs,fc,N)
  H = zeros(N,1);
  h = zeros(N,1);
  w = zeros(N,1);
  dw = 2*pi/(N-1);
  w(1,1)=0;
  for k=2:N
    w(k,1)=w(k-1,1)+dw; 
  endfor
  M=(N-1)/2;
  wc = 2*pi*fc/fs;
  for k=0:M
    if(w(k+1,1)<=wc)
      H(k+1,1) = 1;
      kk = (2*M)+k;
      H(kk+1,1) = 1;
    endif
  endfor
  for n =0:N-1
    tmp = 0;
    for k=1:(N-1)/2
      tmp = tmp+(H(k+1,1)*cos(2*pi*k*(M-n)/N));
    endfor
    h(n+1)=(H(0+1,1) + (2*tmp))/N;
  endfor
endfunction

function output=Convolution(input,h)
  h_size = size(h,1);
  input_size = size(input,1);
  output = zeros(input_size,1);
  for k = 0:(input_size-1)
    tmp =0;
    for i=0: (h_size-1)
      j= k-i;
      if(j>=0)
        tmp = tmp + (h((i+1),1)*input((j+1),1));
      endif
    endfor
    output(k+1,1)= tmp;
  endfor
endfunction

[input,fs]=audioread('test.wav');
[h,w]=LPF(fs,fc,N);
output=Convolution(input,h);
sound(input,fs);
sound(output,fs);

  

이 스크립트는 Octave로 모든 파일을 콘보루션한 후에 동작하기 때문에 DSP와 같이 실시간으로 결과가 나오지 않습니다. 시간이 좀 걸립니다. 


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


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

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