- 음악과 나 -/『 짬 통 』

FFT

noon2dy 2006. 5. 6. 01:13

 

 

  2005-08-17 오후 5:19:33   /  번호: 537829  / 평점:  (-) category: Sound  /  조회: 1,068 
 [급질] FFT(고속퓨리에변환)구현에 관련된 질문입니다. 블루피터 / bluekixx  
블루피터님께 메시지 보내기  블루피터님을 내 주소록에 추가합니다.  블루피터님의 블로그가 없습니다  

 안녕하세요

MP3를 WAV로 압축풀어서 플레이나 자르고 붙이기 등의 편집프로그램을 만들었습니다.

여기에... FFT를 이용해서 이퀄라이즈를 만들려고 합니다.

 

일주일가까이 DFT, FFT에 대해서 공부를 좀 해서... FFT에 대한 이론적인 부분이나 개념은 좀 알고있습니다.

여기 게시판과 자료실도 다 뒤졌구요

 

 

그런데. 구현을 막상 하려고 하니 의문가는 점이 있어서 질문드립니다.

 

실시간 FFT를 통해 주파수분석을 할때요

FFT 되는 샘플링의 갯수가 2의 제곱승으로 되어야한다고 알고있습니다.

256,512,1024,2048... 등등 으로요

 

그런데 만약 WAV 파일의 경우 샘플링레이트는 44100이고 비트전송률이 1141이라고 하고.

그리고 전체 샘플의 갯수가 1,000,000 개라고 가정한다면....

 

2048개씩 데이터를 가져와서 실시간으로 FFT를 처리해야한다는 부분에서 잘 이해가 안갑니다.

 

실시간으로 하기 위해서는 물론 타이머를 돌려야겠지요? 지금 멀티미디어 타이머는 구현해서 사용하고있는데요-

10ms 로 잡고있습니다.

 

FFT도 10ms 로 잡고 FFT샘플갯수를 2048로 잡게된다면,.. 멀티미디어 타이머에서 어떤식으로 FFT변환함수를 호출해야할지가 의문입니다.

2048개를 잡을때 만약 PCM데이터가 [0~1000000]까지 있다고 한다면..

처음에 는 0~2047을 잡고 두번째에는 2048~4095.. 이런식으로 잡는지,

아니면 0~2047개를 잡고 두번째에는 뭐.. 대략 1000~3047 이런식으로 잡는지..

 

 

퓨리에변환에 대한 개념은 서 있는데 실질적으로 실시간구현을 하기위해서는 어떻게 해야하는지 좀 막막합니다.

방금위에서 말씀드린것중에서 첫번째 방법을 사용하는거라면 샘플의 갯수가 2048의 배수가 아닌경우가 대부분일텐데-

그런 경우에 맨 마지막에 남는.. 1000000 % 2048 개의 데이터는 또 어떻게 처리를 해야하는지요;;

 

 

 

너무 전반적인 것에 대해서 질문하는거 같아서 죄송합니다만;

작은 답변이라도 감사하게 받아들이겠습니다.

 

이 글에 평점 주기:  
  2005-08-17 오후 6:37:02   /  번호: 537845  / 평점:  (9.0)  
 Re: 실시간으로 작동하는 디지털 필터를 만드신다면... 투더리 / tudul  
투더리님께 메시지 보내기  투더리님을 내 주소록에 추가합니다.  투더리님의 블로그가 없습니다  

FFT를 사용하는 것은 실시간이란 개념과 맞지 않는다고 생각합니다.

 

FFT는 기본적인 가정이 "입력이 주기함수다"라는 가정을 안고 들어갑니다.

 

예를 들어 1024개의 샘플을 뽑았다고 생각한다면... 1024를 주기로 그 신호가

 

무한대로 반복한다고 보고 주파수도메인으로 변환하는 것입니다.

 

따라서 FFT를 통해 주파수 영역에서의 처리를 하려 한다면 전체 데이터를

 

가지고 한꺼번에 변환해야 합니다.

 

주파수의 개념은 특정 시간에서 존재하는 것이 아닙니다. PCM데이터 한개에는

 

어떤 주파수가 있다고 말 할 수가 없습니다. 전체 WAV파일을 통털어야 주파수

 

성분이 나오며 거기서 주파수 성분을 제거하거나 강조하거나 처리한 후 다시 타임

 

도메인으로 옮겼을 때 새로운 주파수 성분을 가진 PCM데이터가 같은 위치에

 

나오는 것입니다.

 

FFT가 컨볼루션 필터링보다 빠르다고 하는 것은 전체 데이터를 변환할 때

 

컨볼루션 필터로 전체 데이터를 필터링 하는 시간보다 빠르다는 개념일 뿐 실시간

 

필터링을 구현하신다면 컨볼루션 필터를 구현하시는 것이 맞다고 봅니다.

 

이퀄라이저 값에 따라 컨볼루션 마스크를 생성해서 혹은 미리 생성해서 룩업테이블로

 

가지고 있다가 실시간으로 작동시키는 것이 맞다고 생각합니다.

 

이 글에 평점 주기:  
  2005-08-17 오후 7:49:44   /  번호: 537856  / 평점:  (-)  
 Re: 답변감사합니다. 그렇다면.... 블루피터 / bluekixx  
블루피터님께 메시지 보내기  블루피터님을 내 주소록에 추가합니다.  블루피터님의 블로그가 없습니다  

감사합니다.

듣고보니 투더리님의 말씀이 맞는것 같습니다. 이퀄라이저라고 한다면... 전체 데이터에 대해서 주파수 영역을 변경하는것이기 때문에

전체 데이터를 가지고 하는것이 맞는것 같습니다 ^^

 

 

그렇다면.. 두가지 의문점이 생깁니다.

 

 

====================================================================

예를 들어 1024개의 샘플을 뽑았다고 생각한다면... 1024를 주기로 그 신호가

 

무한대로 반복한다고 보고 주파수도메인으로 변환하는 것입니다.

 

따라서 FFT를 통해 주파수 영역에서의 처리를 하려 한다면 전체 데이터를

 

가지고 한꺼번에 변환해야 합니다.

====================================================================

 

 

라고 하셨는데요 좀 헷갈리는게..

전체샘플데이터의 갯수가 만개. 라고 한다면

그 만개를 하나의 주기함수로 봐야한다는 거잖아요.

그렇다면 샘플뽑는다는 것도 만개의 샘플을 뽑아야한다는 소리인지 헷갈립니다.

이건 제 지식이 짧아서 그런질문이 나오는것 같네요 ㅠㅠ

학교에서 코딩하다가 잠깐 집에 밥먹으러 온사이에 글을 쓰는거라 책을볼수 없어 아쉽네요..;;

 

 

 

두번째 의문점은요

윈엠프나 기타 프로그램들보면... 원래의 시그널들을 일정구간 잡아서 실시간으로 막 보여주고

주파수 대역도 보여주고 그러잖아요-

그런것들은.. 그렇다면 일단 한꺼번에 전부 FFT를 해놓고 해당시간에 맞게 그중의 일부분만을 보여주는 것인지

아니면 말씀하신 컨볼루션필터를 쓴것인지 궁금합니다.

 

사실 컨볼루션필터라는것을 이번에 처음 들었거든요.

 

 

상세한 답변에 다시한번 감사 드리면서...

혹시 이글 다시 보시게 된다면 수고부탁드리겠습니다.

감사합니다.

이 글에 평점 주기:  
  2005-08-17 오후 8:35:56   /  번호: 537861  / 평점:  (-)  
 Re: -_-; 나코루루♡ / codeΜaster  
나코루루♡님께 메시지 보내기  나코루루♡님을 내 주소록에 추가합니다.  나코루루♡님의 블로그가 없습니다  

간단히 답하께여

 

윈앰프나 다른 플로그인 살펴보는게 좋겟군여

 

FFT가 실시간에 부적합한건 아니구여

 

FFT를 수행하기위한 충분한 데이타가 있어야 한다는 조건이 붙는거죠

 

FFT버퍼를 4k로 한다면 4k 버퍼가 찰때까지 버퍼링하고 수행하면 되는거죠

 

질문을 대충 읽어서 맞는 대답인지 모르겟군여

 

별로 어려운거 아니랍니다. 사실 껌이에여

 

이 글에 평점 주기:  
  2005-08-17 오후 10:20:19   /  번호: 537874  / 평점:  (9.0)  
 Re: 헉... 위에 엄청난 고수가... ^^ 투더리 / tudul  
투더리님께 메시지 보내기  투더리님을 내 주소록에 추가합니다.  투더리님의 블로그가 없습니다  

저는 주로 하는 일이 영상처리 쪽이거든요

 

그래서 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관련 서적이나 인터넷을 참고하시면 되겠습니다...

 

어줍잖은 지식으로 너무 많이 늘어놓은 것 같네요... 고백하자면, 저는 오디오 데이터 처리는 두번밖에 해본 적 없습니다. 별로 도움은

 

되지 못한 것 같지만 좋은 프로그램 만드시기를 바랍니다.^^

이 글에 평점 주기:  
  2005-08-17 오후 11:21:19   /  번호: 537886  / 평점:  (-)  
 Re: 이렇게 긴 답변은 처음 봅니다 ㅠㅠ 블루피터 / bluekixx  
블루피터님께 메시지 보내기  블루피터님을 내 주소록에 추가합니다.  블루피터님의 블로그가 없습니다  

 너무 감사합니다.

한 서너번 정독해봤습니다.

 

무슨말씀을 하시려는지는 이해가 갈듯하네요.

그 컨볼루션필터라는거... 일종의 필터링이란 느낌이 듭니다 앞뒤몇개의 샘플 취해서 평균내거나 어떤 작업을 해주거나,...

필터의 일종이니 컨볼루션 필터 라고 하겠지요?

 

 

여튼..

제가 갈 방향이 잡히는것 같습니다.

 

사실 그냥 확 라이브러리를 써버릴까... 하는 그런 유혹도 드는데요

이 프로그램이 후에 확장성을 띄게 될것이기 때문에 .. 라이브러리는 제가 수정하기가 힘들잖아요

그래서 어렵더라도 꼭 제손으로 만들고 싶습니다.

 

 

님의 답변 너무 감사드리구요 ㅠㅠ

 

혹시라도 프로그램완성되면....

자료실에 함 올려보겠습니다.

 

 

FFT적용에 대해서는 더 공부를 해봐야할것 같습니다 ^^

즐플하세요!!!

 

이 글에 평점 주기:  

 

'- 음악과 나 - > 『 짬 통 』' 카테고리의 다른 글

저수준 제어를 이용한 WAVE 재생  (0) 2006.05.06
음성채팅  (0) 2006.05.06
wave 변환  (0) 2006.05.06
음악파일 주파수 추출  (0) 2006.05.06
이퀄라이저..  (0) 2006.05.06