FFT 를 하실때 Zoom 하고 싶다는 생각 많이 해 보셨을 겁니다.
256 Hz 샘플링을 해서 1024 fft 를 돌렸을때 fft 빈 한개는 1hz 를 나타내는데
만약 0.5hz 나 0.25hz 단위로 보고 싶다면 방법이 있을까요?
그나마 DC 근처의 주파수 들은 샘플들을 LPF 한 뒤에 그 간격을 늘리면
마치 주파수 해상도가 늘어 난 것 처럼 보이지요.
그런데, 안타깝게도 고주파 대역에서는 그걸 확대 해서 볼 수 있는 방법이
없는 것 처럼 보입니다.
해상도를 올리기 위해서는 샘플링 개수를 늘려야만 하는가....
사실 제한적이긴 하지만 방법이 있습니다.
그 방법이 Zoom FFT 인데요
http://www.arc.id.au/ZoomFFT.html
여기에 들어가면 자세한 설명이 있습니다.
원래의 신호는 1a 처럼 생겼습니다.
1b 그 신호를 왼쪽으로 전체 쉬프트 시킵니다.
1c 그리고 필요 없는 주파수 성분을 잘라 냅니다.
1d 그리고 확대 하면 원하는 주파수만 볼수 있습니다.
재밌는 사실은
시간도메인의 신호를 조작하면 주파수 도메인의 신호의 위치를 shift 시킬수 있다는 겁니다.
마치 주파수 도메인 에서 pitch 쉬프트를 하고 싶을때 전체적으로 주파수를 옮기고 필요 없는 주파수를
잘라 낸뒤 Revers FFT 하면 원래의 신호가 복원 되는 것에 완전히 반대 되는 개념 입니다.
우리들이 보통 센서에서 받은 값 들은 전부 real 값인데, FFT 는 허수 입력도 필요 합니다.
그래서 보통 0 으로 허수를 체워 놓지요.
그래서 도대체 허수 부분은 뭐 하는 녀석인지 참 궁금 했습니다.
그런데, Zoom FFT 를 해 보니 허수 입력이 결코 쓸모 없는 것이 아니더군요.
입력된 샘플에 COS(2PI * i * Fshift / Fsample) 을 곱해서 실수 부에
-Sin(2PI * i * Fshift / Fsample) 을 곱해서 허수부에 넣어 보시고 Fshift ( 쉬프트를 원하는 만큼의 주파수)
를 바꾸면서 테스트 해 보세요. 재밌는 현상이 일어 나더군요^^
FFT 그래프 전체가 쉬프트 되는 현상이 발생 합니다.
FFT 는 원래 가운데를 중심으로 대칭인 모양으로 나타는데,
저 방법을 쓰면 그래프가 점점 왼쪽으로 쉬프트 합니다.
원하는 만큼 쉬프트 시킨뒤에 그 부분만 확대 하면 OK 입니다.
정말 간단한 방법인데... 이런 좋은 방법이 있었다니...!
그래도 해결해야 할 문제가 몇가지 더 있습니다.
그중에 가장 큰 문제는.... 대부분의 자료들에서도 다뤄 지지 않았습니다만,
저렇게 쉬프트 하여도 원래의 주파수 빈은 그대로 남아 있습니다.
그럼, 그 원래의 주파수 빈들은 어떻게 지워 줘야 할까...?
생각보다 방법은 간단 하더군요.^^
혹시 관심있으신 분들은 고민을 한번 해 보는 것도 재밌을 것 같습니다.
이미 알고 계신 분들이 더 많겠지만요^^
참고로, FFT zoom 은 fft_size / sample freauency 만큼 가능합니다.
예를 들어 1024 에 256 hz 샘플링 이라면 4배 까지 줌이 가능 합니다.
이 제약 때문에 사실 그다지 효용성은 없어 보이긴 합니다만
적절히 잘 이용하면 꽤 쓸만 한 알고리즘 인 것 같습니다.
그리고 FFT 의 허수부가 어떤 일을 하는지에 대해서도 이해 할수 있구요^^
댓글 없음:
댓글 쓰기