Program Tip

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

programtip 2020. 10. 28. 20:33
반응형

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

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


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

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

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

참고 URL : https://stackoverflow.com/questions/10304532/why-does-fft-produce-complex-numbers-instead-of-real-numbers

반응형