FFT를 빠르게 만드는 DFT와 FFT의 차이점은 무엇입니까?


16

FFT를 이해하려고 노력 중입니다. 여기까지 내가 가진 내용은 다음과 같습니다.

파형에서 주파수의 크기를 찾으려면 두 개의 서로 다른 위상 (sin 및 cos)에서 파형에 검색중인 주파수를 곱하고 각각을 평균화하여 주파수를 조사해야합니다. 단계는 둘과의 관계에 의해 발견되며 그 코드는 다음과 같습니다.

//simple pseudocode
var wave = [...];                //an array of floats representing amplitude of wave
var numSamples = wave.length;
var spectrum = [1,2,3,4,5,6...]  //all frequencies being tested for.  

function getMagnitudesOfSpectrum() {
   var magnitudesOut = [];
   var phasesOut = [];

   for(freq in spectrum) {
       var magnitudeSin = 0;
       var magnitudeCos = 0;

       for(sample in numSamples) {
          magnitudeSin += amplitudeSinAt(sample, freq) * wave[sample];
          magnitudeCos += amplitudeCosAt(sample, freq) * wave[sample];
       }

       magnitudesOut[freq] = (magnitudeSin + magnitudeCos)/numSamples;
       phasesOut[freq] = //based off magnitudeSin and magnitudeCos
   }

   return magnitudesOut and phasesOut;
}

매우 많은 주파수에서이 작업을 매우 빠르게 수행하기 위해 FFT는 많은 트릭을 사용합니다.

FFT를 DFT보다 훨씬 빠르게 만드는 데 사용되는 트릭은 무엇입니까?

추신 : 웹에서 완성 된 FFT 알고리즘을 살펴 보았지만 모든 트릭은 많은 설명없이 하나의 아름다운 코드로 압축되는 경향이 있습니다. 전체 내용을 이해하기 전에 먼저 필요한 것은 이러한 효율적인 변경 사항을 개념으로 소개하는 것입니다.

감사합니다.


7
"DFT"는 알고리즘을 나타내는 것이 아니라 수학 연산을 나타냅니다. "FFT"는 그 연산을 계산하기위한 일련의 방법을 말한다.

1
sudo컴퓨터 세계에서 잘 알려진 명령이기 때문에 코드 예제에서 의 사용 이 혼란 스러울 수 있다고 지적하고 싶었 습니다. 아마도 psuedocode를 의미했을 것입니다.
rwfeather

1
@nwfeather 그는 아마도 '의사 코드'를 의미했을 것입니다.
user207421

답변:


20

포인트 DFT 의 순진한 구현 은 기본적으로 N × N 행렬에 의한 곱셈 입니다. 의 복잡성이 결과 O ( N 2 ) .NN×NO(N2)

가장 일반적인 FFT (Fast Fourier Transform) 알고리즘 중 하나는 기수 -2 Cooley-Tukey Decimation-in-Time FFT 알고리즘입니다. 이것은 기본적인 분할 및 정복 접근법입니다.

먼저 " 트위스트 팩터" 를 다음과 같이 정의하십시오 . 여기서j

WNej2πN
은 허수 단위이며,x[n]의 DFTX[k]X[k]= N 1 n = 0 x[n]에의해 주어집니다 j1X[k]x[n]N 이 짝수 이면(그리고 N
X[k]=n=0N1x[n]WNkn.
N 다음과 같이 합 두 개의 합으로 분할 될 수있다)의 정수이고 X[K]= N / 2 - 1 Σ N=0, X[2N]W 2 K N N + N / 2 - 1 Σ를 N=0x[2n+1]W k ( 2 n + 1 ) NN2
X[k]=n=0N/21x[2n]WN2kn+n=0N/21x[2n+1]WNk(2n+1)
여기서의 짝수 샘플 제 합산 상품 과의 홀수 번째 샘플 X [ N ] . 정의 X E [ N ] X [ 2 N ]X O [ N ] X [ 2 N + 1 ] 및 그 사실을 이용하여x[n]x[n]xe[n]x[2n]xo[n]x[2n+1]
  1. WNk(2n+1)=WN2knWNk
  2. ,WN2kn=WN/2kn

이것은 X [ k ] 로 다시 쓸 수 있습니다 여기서Xe[k]Xo[k] N

X[k]=n=0N/21xe[n]WN/2kn+WNkn=0N/21xo[n]WN/2kn=Xe[k]+WNkXo[k]
Xe[k]Xo[k]x[n]의 짝수 및 홀수 샘플의 2- 포인트 DFT 변환. 그래서 우리는 단일N-포인트 DFT를 두 개의 작은N으로변환했습니다.N2x[n]N 포인트 DFT. 이것은2(N이기 때문에 계산 비용을 줄입니다. N2N>2.
2(N2)2+N<N2
N>2

그런 다음 두 개의 작은 DFT에서 동일한 프로세스를 반복 할 수 있습니다. 이 분할 및 정복 접근법은 복잡성에 도달 할 수있게하는데 , 이는 순진한 DFT 구현에서 우리가 가지고 있는 O ( N 2 ) 보다 훨씬 습니다 ( 왼쪽 주위 의 답변으로 크게 설명되어 있음 ).O(NlogN)O(N2)


각 변수의 의미를 기꺼이 나열 하시겠습니까? 나는이 오히려 새로운, 그래서 W, j, X(), N그리고 k아직 나에 대한 정의가 없습니다.
Seph 리드

Wkn

19

http://nbviewer.jupyter.org/gist/leftaroundabout/83df89a7d3bdc24373ea470fb50be629

DFT, 사이즈 16

크기가 16 인 순진한 DFT에서의 작업 다이어그램

FFT, 사이즈 16

크기 16 기수 -2 FFT에서의 작업 다이어그램

복잡성의 차이는 분명합니다. 그렇지 않습니까?


FFT를 이해하는 방법은 다음과 같습니다.

FT:L2(R)L2(R)

RC가장 간단한 경우는 함수가 연속적이며 너무 작은 영역으로 나눠서 기본적으로 일정하다는 것입니다. 그런 다음 각 STFT는 가장 강력한 0 번째 항을 갖습니다. 다른 계수를 무시하면 각 도메인은 단일 데이터 포인트입니다. 이러한 모든 단기 -LF- 제한 계수 중에서 이산 푸리에 변환을 수행 할 수 있습니다. 실제로 측정 된 실제 데이터에 대해 FT를 수행 할 때 수행하는 작업입니다.

그러나 측정 된 데이터가 반드시 기본 물리량에 해당 할 필요는 없습니다. 예를 들어, 약간의 빛 강도 를 측정 할 때는 실제로 주파수가 너무 높아서 ADC로 샘플링하기 어려운 전자기파 의 진폭 을 측정하는 것 입니다. 그러나 광파의 미친 주파수에도 불구하고 샘플링 된 광도 신호의 DFT를 저렴하게 계산할 수도 있습니다.

FFT가 가장 저렴한 이유는 다음과 같습니다.

가장 높은 레벨에서 개별 진동주기보려고 하지 마십시오 . 대신 이미 로컬에서 사전 처리 된 다소 높은 수준의 정보 만 변환하십시오.

그러나 이것이 전부가 아닙니다. FFT의 가장 큰 장점은 완전한 DFT가 제공하는 모든 정보를 여전히 제공 한다는 입니다. 즉, 광선의 정확한 전자기파를 샘플링 할 때 얻을 수있는 모든 정보입니다. 포토 다이오드 신호를 변환하여이를 달성 할 수 있습니까? – 정확한 광선 주파수를 측정 할 수 있습니까?


Δν=1/Δt

전체적으로 더 긴 시간 범위를 가짐으로써 주파수 불확실성을 좁힐 수 있어야합니다. 거친 주파수뿐만 아니라 파도 의 위상 을 국부적으로 측정하면 실제로 가능합니다 . 1 초 후에 1000Hz 신호를 보면 위상이 정확히 동일하다는 것을 알고 있습니다. 1000.5Hz 신호는 단기간에 구분할 수 없지만 1 초 후에 위상이 반전됩니다.

다행스럽게도이 위상 정보는 단일 복소수로 저장 될 수 있습니다. 그리고 이것이 FFT의 작동 방식입니다! 작은 로컬 변환이 많이 시작됩니다. 이것들은 저렴합니다. 한 가지 이유는 적은 양의 데이터 만 사용하기 때문이지만 두 번째는 짧은 시간으로 인해 주파수를 매우 정확하게 해석 할 수 없다는 것을 알고 있기 때문입니다. 그래도 여전히 저렴합니다. 그런 변화를 많이하세요.

그러나 이것 또한 위상을 기록 하므로, 주파수 분해능을 최상위 레벨에서보다 정확하게 만들 수 있습니다. 고주파 변환에는 신경을 쓰지 않고 사전 처리 된 저주파 데이터에만 신경을 쓰므로 필요한 변환은 다시 저렴합니다.


그렇습니다. 제 주장은이 시점에서 약간 원형입니다. 재귀 라고 부르고 우리는 괜찮습니다 ...

이 관계는 없는 기계 양자하지만, 하이젠 베르크의 불확실성은 실제로 같은 근본적인 이유가있다.


2
문제의 멋진 그림 묘사. :-)
robert bristow-johnson

2
당신은 어디서나 반복되고 실제로 어디에도 설명되지 않은 다이어그램을 좋아하지 않습니다 :)
user541686

1
나는 anpar의 대답을 읽은 후에 그 그림을 이해했습니다.
JDługosz

15

다음은 작업의 "재사용"(이 경우 8 포인트 DFT)을 보여주는 Robert의 좋은 답변에 추가 할 그림입니다. "트위들 팩터"는 표기법 사용하여 다이어그램에 표시됩니다.WNnkej2πnkN

표시된 경로와 아래 방정식은 Robert의 방정식으로 주어진 주파수 빈 X (1)의 결과를 보여줍니다.

점선은 요약 합치기의 위치를 ​​명확히하기 위해 실선과 다르지 않습니다.

FFT 구현


8

본질적으로 요약에서 직접 순진한 DFT를 계산할 때 :

엑스[케이]==01엑스[]이자형제이2π케이

있다 트위들 팩터에 대한 테이블 조회 이자형제이2π케이, 복잡한 곱셈 1추가. 그리고 그것은 단지 하나의 가치를위한 것입니다엑스[케이] 그리고 하나의 예 케이. 순진한 DFT는 모든 중간 데이터를 버리고 다시 모든 데이터를 통과합니다.엑스[케이+1].

  1. FFT는 일부 중간 데이터를 유지합니다.
  2. FFT는 또한 트위들 팩터를 약간 팩터링하여 데이터의 중간 조합에 동일한 팩터를 사용할 수 있습니다.

4

나는 시각적 인 사람입니다. FFT를 요약 트릭이 아닌 매트릭스 트릭으로 생각합니다.

높은 수준으로 설명하려면 :

순진한 DFT는 각 출력 샘플을 독립적으로 계산하고 각 계산의 모든 입력 샘플을 사용합니다 (클래식 N² 알고리즘).

공통 FFT는 DFT 정의에서 대칭과 패턴을 사용하여 "레이어"(log N 레이어)로 계산을 수행합니다. 각 레이어는 N log N 알고리즘을 생성하는 샘플 당 일정한 시간 요구 사항을 갖습니다.

더 구체적인 사항 :

이러한 대칭을 시각화하는 한 가지 방법은 DFT 를 모든 복잡한 지수 의 NxN 행렬 에 곱한 1xN 행렬 입력으로 보는 것 입니다. "radix 2"사례부터 시작하겠습니다. 행렬의 짝수 행과 홀수 행 (짝수 및 홀수 입력 샘플에 해당)을 분리하여 두 개의 개별 행렬 곱셈으로 간주하여 동일한 최종 결과를 얻습니다.

이제이 행렬들을 살펴보십시오. 첫 번째 행렬에서 왼쪽 절반은 오른쪽 절반과 동일합니다. 다른 쪽에서, 오른쪽 절반은 왼쪽 절반 x -1입니다. 이것은 곱셈을 위해이 행렬의 왼쪽 절반 만 사용하고 1 또는 -1을 곱하여 오른쪽 절반을 저렴하게 만들어야한다는 것을 의미합니다. 다음으로, 두 번째 행렬이 첫 번째 행렬과 각 열에서 동일한 요인에 의해 다르다는 것을 관찰하십시오. 따라서이를 곱하고 입력에 곱할 수 있으므로 짝수 샘플과 홀수 샘플이 동일한 행렬을 사용하지만 승수가 필요합니다 먼저. 그리고 마지막 단계는이 결과 N / 2 × N / 2 행렬이 N / 2 DFT 행렬과 동일하다는 것을 관찰하고 DFT가 항등 함수 인 1x1 행렬에 도달 할 때까지이 작업을 계속 반복 할 수 있습니다.

기수 2를 넘어 일반화하려면 세 번째 행마다 분할하고 세 개의 열 청크 또는 4 번째 열 등을 볼 수 있습니다.

소수 크기의 입력의 경우 제로 패드, FFT 및 자르기를 올바르게 수행하는 방법이 있지만 이는이 답변의 범위를 벗어납니다.

참조 : http://whoiskylefinn.com/MatrixFFT.html


프라임 FFT , 다양한 FFT . 제로 패드를 사용하는 것이 유일한 옵션은 아닙니다. 죄송합니다. 제로 패딩이 과도하게 사용되었습니다. 작은 질문 하나, "샘플 당 일정한 시간 요구 사항을 가진 각 레이어"의 의미를 이해하지 못합니다. 설명 할 수 있다면 훌륭 할 것입니다.
Evil

1
죄송합니다. 제로 패딩이 길이라고 말하지 않았으며 추가 독서를 지적하고 싶었습니다. 그리고 "layer"는 재귀 또는 N DFT에서 2 N / 2 DFT 로의 변환을 의미하며, 샘플 당 일정한 시간을 갖는이 단계는 O (N)입니다.
kylefinn 2016 년

지금까지 모든 설명 중 복잡한 문제를 간단하게 만드는 데 가장 가까운 것 같습니다. 그러나 누락 된 가장 큰 것은이 매트릭스의 예입니다. 당신은 하나가 있습니까?
Seph Reed 2018 년

이 업로드, 도움이 될 것입니다 whoiskylefinn.com/MatrixFFT.html
kylefinn

1

DFT는 무차별 대 입력 N ^ 2 행렬을 곱합니다.

FFT는 계산 비용을 줄이기 위해 행렬의 속성을 활용하여 (행렬 곱셈을 해제) 영리한 트릭을 수행합니다.

먼저 작은 DFT를 살펴 보겠습니다.

W = fft (눈 (4));

x = 랜드 (4,1) + 1j * 랜드 (4,1);

X_ref = fft (x);

X = W * x;

주장 (max (abs (X-X_ref)) <1e-7)

FFT 함수에서 행렬을 채워서 작은 4x4 (복잡한) 행렬 곱셈으로 FTLW 라이브러리에 대한 MATLAB 호출을 대체 할 수 있습니다. 이 행렬은 어떻게 생겼습니까?

N = 4,

Wn = exp (-1j * 2 * pi / N),

f = ((0 : N-1) '* (0 : N-1))

f =

 0     0     0     0
 0     1     2     3
 0     2     4     6
 0     3     6     9

W = 원

W =

1 1 1 1

1 -i -1 나는

1-1 1-1

1 내가 -1 -i

각 요소는 +1, -1, + 1j 또는 -1j입니다. 분명히, 이것은 우리가 완전히 복잡한 곱셈을 피할 수 있음을 의미합니다. 또한 첫 번째 열은 동일하므로 x의 첫 번째 요소에 동일한 요소를 반복해서 곱한다는 의미입니다.

Kronecker 텐서 제품, "트위스트 팩터"및 이진법 개정에 따라 인덱스가 변경되는 순열 행렬은 모두 컴팩트하며 FFT가 희소 행렬 연산 세트로 계산되는 방법에 대한 대체 관점을 제공합니다.

아래의 줄은 단순한 DIF (Decime in Frequency) 기수 2 순방향 FFT입니다. 단계가 번거로워 보일 수 있지만 실제 FFT가 실제 환경에서 구현되는 방식을 공정하게 표현하면서 순방향 / 역방향 FFT, 기수 4 / 분할 기수 또는 시간에 따라 데시 메이션에 재사용하는 것이 편리합니다. 나는 믿는다.

N = 4;

x = 랜 (N, 1) + 1j * 랜 (N, 1);

T1 = exp (-1j * 2 * pi * ([제로 (1, N / 2), 0 : (N / 2-1)]). '/ N),)

M0 = 크론 (눈 (2), fft (눈 (2))),

M1 = 크론 (fft (eye (2)), eye (2)),

X = 비트 레비 오더 (x. '* M1 * diag (T1) * M0),

X_ref = fft (x)

주장 (max (abs (X (:)-X_ref (:))) <1e-6)

CF Van Loan은이 주제에 관한 훌륭한 책을 가지고 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.