FFT가 실수 대신 복소수를 생성하는 이유는 무엇입니까?
우리가 발견 한 모든 FFT 구현은 알고리즘에 대한 입력이 이산 된 실수 (정수) 집합이더라도 복잡한 값 (실수 및 허수 부분 포함)을 생성합니다.
주파수 영역을 실수로만 표현할 수 없습니까?
FFT는 근본적으로 기반의 변화입니다. FFT가 원래 신호를 변경하는 기준은 대신 사인파 세트입니다. 그 기초가 가능한 모든 입력을 설명하기 위해서는 위상과 진폭을 나타낼 수 있어야합니다. 위상은 복소수를 사용하여 표현됩니다.
예를 들어, 단일 사인파 만 포함 된 신호를 FFT한다고 가정합니다. 위상에 따라 완전히 실제 FFT 결과를 얻을 수 있습니다. 그러나 입력의 위상을 몇도 이동하면 FFT 출력이 해당 입력을 어떻게 나타낼 수 있습니까?
편집 : 이것은 다소 느슨한 설명이지만 직감에 동기를 부여하려고 노력하고 있습니다.
FFT는 진폭 과 위상을 제공합니다 . 진폭은 복소수의 크기 (sqrt (x ^ 2 + y ^ 2))로 인코딩되고 위상은 각도 (atan2 (y, x))로 인코딩됩니다. FFT에서 엄격하게 실제 결과를 얻으려면 들어오는 신호가 균등 한 대칭을 가져야합니다 (예 : x [n] = conj (x [Nn])).
관심있는 것이 강도뿐이라면 복소수의 크기는 분석에 충분합니다.
예, 실수 만 사용하여 엄격한 실수 입력의 FFT 주파수 영역 결과를 나타낼 수 있습니다.
FFT 결과의 복소수는 단순히 2 개의 실수 일 뿐이며, 둘 다 길이와 방향 각도 (또는 크기와 위상)를 모두 갖는 결과 벡터의 2D 좌표를 제공하는 데 필요합니다. 그리고 FFT 결과의 모든 주파수 구성 요소는 고유 한 진폭과 고유 한 위상을 가질 수 있습니다 (FFT 조리개의 특정 지점에 비해).
하나의 실수만으로는 크기와 위상을 모두 나타낼 수 없습니다. 위상 정보를 버리면 iFFT를 사용하여 다시 생성하려고 시도하면 신호가 크게 왜곡 될 수 있습니다 (신호가 대칭이 아닙니다). 따라서 완전한 FFT 결과에는 FFT 빈당 2 개의 실수가 필요합니다. 이 2 개의 실수는 일반적인 관례에 따라 복잡한 데이터 유형의 일부 FFT에서 함께 번들링되지만 FFT 결과는 쉽게 2 개의 실수 벡터 (코사인 좌표 용 하나와 사인 좌표 용 하나)를 생성 할 수 있습니다.
크기와 위상을 직접 생성하는 FFT 루틴도 있지만 복잡한 (또는 두 개의 실제) 벡터 결과를 생성하는 FFT보다 느리게 실행됩니다. 크기 만 계산하고 위상 정보 만 버리는 FFT 루틴도 있지만 일반적으로 더 일반적인 FFT 후에 직접 수행하도록하는 것보다 더 빨리 실행되지 않습니다. 아마도 그들은 뒤집을 수없는 대가로 코더에게 몇 줄의 코드를 절약 할 수 있습니다. 그러나 많은 라이브러리는 이러한 느리고 덜 일반적인 형태의 FFT를 포함하는 것을 귀찮게하지 않고 코더가 필요하거나 필요하지 않은 것을 변환하거나 무시하도록합니다.
또한 많은 사람들은 복잡한 산술을 사용하여 관련된 수학이 훨씬 더 우아 하다고 생각합니다 .
(추가됨 :) 그리고 또 다른 옵션으로 실제 및 허수 구성 요소 대신 각 FFT 결과 빈의 두 구성 요소를 짝수 및 홀수 구성 요소로 모두 실제로 간주 할 수 있습니다.
주어진 주파수에 대한 FFT 계수 f
가 x + i y
이면 x
해당 주파수에서 코사인 계수로 볼 수 있지만 y
은 사인 계수입니다. 특정 주파수에 대해이 두 파동을 추가하면 해당 주파수에서 위상 편이 된 파동을 얻게됩니다. 이 파동 sqrt(x*x + y*y)
의 크기는 복소 계수의 크기와 같습니다.
이산 코사인 변환 (DCT)은 푸리에 상대가 모두 계수를 산출하는 변환이다. 2 차원 DCT는 많은 이미지 / 비디오 압축 알고리즘에서 사용됩니다.
이산 푸리에 변환은 기본적으로 "시간 도메인"의 복소수 벡터에서 "주파수 도메인"의 복소수 벡터로 변환하는 것입니다 (올바른 스케일링 계수를 적용하면 DFT가 고유하므로 따옴표를 사용합니다. 역). 입력 값이 실수이면 한 번에 두 개의 DFT를 수행 할 수 있습니다. 입력 벡터 x 와 y 를 가져와 F ( x + i y )를 계산 합니다. 나중에 DFT를 분리하는 방법을 잊었지만 대칭과 복잡한 켤레에 관한 것 같습니다.
이산 코사인 변환 정렬 당신이 실수로 "주파수 영역"을 대표 할 수 있으며 손실 압축 알고리즘 (JPEG, MP3)에서 일반적입니다. 놀랍게도 (나에게) 위상 정보를 버리는 것처럼 보이지만 이것은 대부분의 신호 처리 목적에서 유용하지 않은 것 같습니다 (컨볼 루션 / 상관을 수행하는 쉬운 방법을 알지 못합니다. DCT).
나는 아마 몇 가지 세부 사항을 잘못 얻었습니다.)
'Program Tip' 카테고리의 다른 글
React- 라우터와 nginx (0) | 2020.10.28 |
---|---|
JQuery.ajax 성공 데이터에서 JSON 구문 분석 (0) | 2020.10.28 |
sed를 사용하여 패턴 위 또는 아래에 선을 삽입 하시겠습니까? (0) | 2020.10.28 |
C ++에서 cin에서 EOF까지 읽는 방법 (0) | 2020.10.28 |
Android 애플리케이션에 외부 글꼴을 추가하는 방법 (0) | 2020.10.28 |