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