저는 주로 하는 일이 영상처리 쪽이거든요
그래서 FFT를 구현도 해봤고... 가끔 쓰기도 했는데 껌이란 생각은 안드는군요... ^^
일단 FFT를 이용해서 신호처리를 하려면 DSP, 디지털 신호처리라는 개념이 필요하다고 생각합니다.
영상의 경우 FFT나 DCT가 실시간처리에 종종 쓰입니다... 예를 들어 320x240영상이 1초에 15장씩 들어온다...
면 그 각각의 영상을 FFT해서 주파수도메인에서 처리를 한다음 역FFT를 해서 다시 화면에 보여준다...
머 이런 정도의 처리를 하고 분명 실시간 프로그램입니다.
하지만 wave의 경우는 좀 다른게... 동영상은 1초에 들어오는 15장이 모두 독립적인 영상(MPEG같은
압축코덱의 경우는 다릅니다만, 처리할 때는 전부 영상으로 바꿔서 합니다.) 이지만 소리는
음악파일 1개가 전체 데이터고 지금 재생되는 부분이 그 일부라는 거죠...
웨이브의 일부 구간을 잡아서 그 부분의 주파수 영역을 보여주고... 하는 처리는 FFT를 사용해도 무방하다고
생각됩니다. 이건 실시간 처리가 아니죠? 처리가 끝난후 보여주는 거니까...
실시간 처리라 함은 웨이브를 재생함과 동시에 데이터가 처리되어 재생되어야 하는거죠..
실시간으로 FFT를 해서 이퀄라이저 구현도 가능하겠지만... 버퍼만큼 돌리고 또 돌리고... 하면 그 경계에서
연속성이 깨져서 문제가 될 것입니다.
아까 말씀드렸듯, 이미지는 경계에서 연속성이 깨져도 상관없습니다. 원래 크기만큼 크롭하면 되니까...
하지만 소리는... 안되죠...
이를테면 2048개씩 데이터를 끊어서 FFT한다고 해 봅시다. 그럼 0부터 2047만큼의 데이터가 버퍼에 차서 그걸 FFT
해서 주파수 처리하고 역 FFT해서 다시 2048개의 PCM데이터를 만듭니다...
다시 2048부터 4095까지의 2028개의 데이터를 버퍼에 채워서 FFT하고 처리하고 역FFT해서 2048개의 PCM데이터를
만든다...
이렇게 하면 처음 2048개의 데이터는 그 구간이 무한대로 반복한다는 가정으로 처리된 것이고 뒤의 2048개의 데이터는
두번째 구간이 무한대 처리된다고 보고 처리한 것이겠죠?
어머나~ 어머나~ 에서 '어'가 반복된다고 보고 주파수 처리한 것과 '머'가 반복된다고 보고 주파수 처리한게 겹치면...
그 경계에서 잡음 등의 형태로 나타날 겁니다.
물론, 버퍼의 중심쪽 데이터는 그 영향이 거의 없죠... 그러니까 FFT 이퀄라이저를 실시간으로(즉 웨이브를 재생하면서
동시에 계산되어 나오도록)구현하려면, 현재 재생되는 PCM데이터를 기준으로 앞쪽으로 1023개, 뒤쪽으로 1024개를
잘라서 2048개를 버퍼에 채워서 FFT하고 처리하고 역FFT해서 현재 PCM데이터 내보내고... 다시 다음 PCM데이터 중심으로
앞 뒤 2048개를 버퍼에 채워서 FFT 하고... 이런 처리를 해주어야 합니다.
이렇게 하면 FFT의 의미가 없죠... 실시간 처리라면 차라리 컨볼루션 필터를 쓰는게 낫습니다.
모든 주파수 도메인 처리는 컨볼루션 필터로 대체 가능합니다. 컨볼루션 필터는 구현도 간단하고 wave파일의 경우 실시간
처리도 충분히 가능합니다. (data가 1차원이기 때문에. 영상은 2차원 이기 때문에 실시간 처리에 컨벌루션 필터를 잘 쓰지
않습니다.)
예를 들어서 님께서 로우패스필터를 구현하신다고 생각하고.... 그러니까 고주파 부분을 죽여서 노래를 재생하고 싶다고 가정하고
PCM데이터를 재생할 때 현재 재생될 PCM데이터 앞 뒤 1샘플씩을 취해서(토탈 3개입니다. 현재 위치가 i이라면 i-1하고
i+1)
3개를 평균해서 재생한다고 가정해봅시다. (1/3*pData[i-1]+1/3*pData[i]+1/3*pData[i+1])
이렇게 재생해 보시면 고주파 성분이 줄어든 것을 직접 들어서 확인하실 수 있습니다. 앞뒤 몇개의 샘플을 취하느냐, 가중치를 얼마를
주느냐에 따라 통과시키는 주파수 영역이 변합니다. 이것이 컨볼루션 필터입니다.
실제로 컨볼루션 필터를 설계하기 위해서는 FFT가 필요합니다. 자세한 내용은 DSP관련 서적이나 인터넷을 참고하시면 되겠습니다...
어줍잖은 지식으로 너무 많이 늘어놓은 것 같네요... 고백하자면, 저는 오디오 데이터 처리는 두번밖에 해본 적 없습니다. 별로
도움은
되지 못한 것 같지만 좋은 프로그램 만드시기를 바랍니다.^^ |