FFT가 실수 대신 복소수를 생성하는 이유는 무엇입니까?


82

우리가 발견 한 모든 FFT 구현은 알고리즘에 대한 입력이 이산 된 실수 집합 (정수)이더라도 복잡한 값 (실수 및 허수 부분 포함)을 생성합니다.

주파수 영역을 실수로만 표현할 수 없습니까?

답변:


87

FFT는 근본적으로 기반의 변화입니다. FFT가 원래 신호를 변경하는 기준은 대신 사인파 세트입니다. 그 기반이 가능한 모든 입력을 설명하기 위해서는 위상과 진폭을 나타낼 수 있어야합니다. 위상은 복소수를 사용하여 표현됩니다.

예를 들어, 단일 사인파 만 포함 된 신호를 FFT한다고 가정합니다. 위상에 따라 완전히 실제 FFT 결과를 얻을 수 있습니다. 그러나 입력의 위상을 몇도 이동하면 FFT 출력이 해당 입력을 어떻게 나타낼 수 있습니까?

편집 : 이것은 다소 느슨한 설명이지만 직관에 동기를 부여하려고 노력하고 있습니다.


3
많은 답변을하는데 도움이됩니다. FFT 결과에 주파수와 위상 만 포함 된 경우 시간 도메인 샘플에서 진폭 정보를 어떻게 캡처합니까? 즉, iFFT에서 정확한 진폭을 어떻게 재현합니까?
steve landiss 2012

7
FFT의 각 값은 서로 다른 주파수 구성 요소에 해당합니다. 이 값의 크기는 구성 요소의 진폭이고 복 소각은 해당 구성 요소의 위상입니다.
zmccord

53

FFT는 진폭 위상을 제공합니다 . 진폭은 복소수의 크기 (sqrt (x ^ 2 + y ^ 2))로 인코딩되고 위상은 각도 (atan2 (y, x))로 인코딩됩니다. FFT에서 엄격하게 실제 결과를 얻으려면 들어오는 신호가 균등 한 대칭을 가져야합니다 (예 : x [n] = conj (x [Nn])).

관심있는 것이 강도뿐이라면 복소수의 크기는 분석에 충분합니다.


41

예, 실수 만 사용하여 엄격한 실수 입력의 FFT 주파수 도메인 결과를 나타낼 수 있습니다.

FFT 결과의 복소수는 단순히 2 개의 실수 일 뿐이며, 둘 다 길이와 방향 각도 (또는 크기와 위상)를 모두 갖는 결과 벡터의 2D 좌표를 제공하는 데 필요합니다. 그리고 FFT 결과의 모든 주파수 구성 요소는 고유 한 진폭과 고유 한 위상을 가질 수 있습니다 (FFT 조리개의 특정 지점에 비해).

하나의 실수만으로는 크기와 위상을 모두 나타낼 수 없습니다. 위상 정보를 버리면 iFFT를 사용하여 다시 생성하려고하면 신호가 쉽게 크게 왜곡 될 수 있습니다 (신호가 대칭이 아닙니다). 따라서 완전한 FFT 결과에는 FFT 빈당 2 개의 실수가 필요합니다. 이 2 개의 실수는 일반적인 관례에 따라 복잡한 데이터 유형의 일부 FFT에서 함께 번들링되지만 FFT 결과는 쉽게 2 개의 실수 벡터 (코사인 좌표 용 하나와 사인 좌표 용 하나)를 생성 할 수 있습니다.

크기와 위상을 직접 생성하는 FFT 루틴도 있지만 복잡한 (또는 두 개의 실제) 벡터 결과를 생성하는 FFT보다 느리게 실행됩니다. 크기 만 계산하고 위상 정보 만 버리는 FFT 루틴도 있지만 일반적으로 더 일반적인 FFT 후에 직접 수행하도록하는 것보다 더 빨리 실행되지 않습니다. 아마도 그들은 뒤집을 수없는 대가로 코더에게 몇 줄의 코드를 절약 할 수 있습니다. 그러나 많은 라이브러리는 이러한 느리고 덜 일반적인 형태의 FFT를 포함하는 것을 귀찮게하지 않고 코더가 필요하거나 필요하지 않은 것을 변환하거나 무시하도록합니다.

또한 많은 사람들은 복잡한 산술을 사용하여 관련된 수학이 훨씬 더 우아 하다고 생각합니다 . FFT 결과는 복소수의 허수 성분에 포함됩니다.)

(추가됨 :) 그리고 또 다른 옵션으로 실제 및 허수 구성 요소 대신 각 FFT 결과 빈의 두 구성 요소를 짝수 및 홀수 구성 요소로 모두 실제로 간주 할 수 있습니다.


19

주어진 주파수에 대한 FFT 계수 fx + i y이면 x해당 주파수에서 코사인 계수로 볼 수 있지만 y은 사인 계수입니다. 특정 주파수에 대해이 두 파동을 추가하면 해당 주파수에서 위상 편이 된 파동을 얻게됩니다. 이 파동 sqrt(x*x + y*y)의 크기는 복소 계수의 크기와 같습니다.

이산 코사인 변환 (DCT)은 푸리에 상대가 모두 계수를 산출하는 변환이다. 2 차원 DCT는 많은 이미지 / 비디오 압축 알고리즘에서 사용됩니다.


9
  1. 이산 푸리에 변환은 기본적으로 "시간 도메인"의 복소수 벡터에서 "주파수 도메인"의 복소수 벡터로 변환하는 것입니다 (올바른 스케일링 계수를 적용하면 DFT가 고유하므로 따옴표를 사용합니다. 역). 입력이 실수이면 한 번에 두 개의 DFT를 수행 할 수 있습니다. 입력 벡터 xy 를 가져와 F ( x  +  i  y )를 계산 합니다. 나중에 DFT를 분리하는 방법을 잊어 버렸습니다.하지만 대칭과 복잡한 켤레에 관한 것 같습니다.

  2. 이산 코사인 변환 정렬 당신이 실수로 "주파수 영역"을 대표 할 수 있으며 손실 압축 알고리즘 (JPEG, MP3)에서 일반적입니다. 놀랍게도 (나에게) 위상 정보를 버리는 것처럼 보이지만 이것은 대부분의 신호 처리 목적에서 유용하지 않은 것 같습니다 (컨볼 루션 / 상관을 수행하는 쉬운 방법을 알지 못합니다. DCT).

나는 아마 몇 가지 세부 사항을 잘못 얻었습니다.)


1
변환 F (x + iy)의 경우에 대해 나중에 DFT를 분리하여 추가 정보를 찾고 싶습니다.
CatsLoveJazz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.