Які існують відмінності між DFT та FFT, які роблять 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?

PS Я спробував розглянути завершені алгоритми FFT в Інтернеті, але всі хитрощі, як правило, згуртовуються в один прекрасний фрагмент коду без особливих пояснень. Перш за все, перш ніж я зможу зрозуміти все, що мені потрібно, це деяке вступ до кожної з цих ефективних змін як понять.

Дякую.


7
"DFT" не посилається на алгоритм: він посилається на математичну операцію. "FFT" відноситься до класу методів для обчислення цієї операції.

1
Просто хотілося зазначити, що використання sudoу вашому прикладі коду може бути заплутаним, оскільки це добре відома команда в комп'ютерному світі. Ви, мабуть, мали на увазі psuedocode.
rwfeather

1
@nwfeather Він, ймовірно, означав "псевдокод".
користувач207421

Відповіді:


20

Наївна реалізація - точкове ДПФ в основному множення на матриці. Це призводить до складності .N × N O ( N 2 )NN×NO(N2)

Одним з найпоширеніших алгоритмів швидкої трансформації Фур’є (FFT) є алгоритм FFT радіо-2 Кулі-Тукі. Це основний підхід і підкорити.

Спочатку визначте "коефіцієнт подвійності" як: де - уявна одиниця, то DFT з задається Якщо парне (а ціле число), то суму можна розділити на дві суми так, як де перше підсумовування стосується парних зразків з , а другий з непарними зразками . Визначення і j

WNеj2πN
X[k]x[n]X[k]= N - 1 n = 0 x[n]j-1Х[к]x[n]N N
X[k]=n=0N1x[n]WNkn.
N X[k]= N / 2 - 1 n=0x[2n]W 2 k n N + N / 2 - 1 n=0x[2n+1]W k ( 2 n + 1 ) N x[n]x[n]xeN2
X[k]=n=0N/21x[2n]WN2кн+н=0N/2-1х[2н+1]WNк(2н+1)
х[н]х[н]хе[н]х[2н]хо[н]х[2н+1] і, використовуючи те, що
  1. WNк(2н+1)=WN2кнWNк , і
  2. WN2kn=WN/2kn ,

це може бути переписано як де і є -поточні перетворення DFT парних і непарних зразків відповідно. Таким чином, ми просто перетворили одну точку DFT у дві менші -поточні DFT. Це зменшує обчислювальні витрати, оскільки коли .

X[k]=n=0N/21xe[n]WN/2kn+WNkn=0N/21xo[n]WN/2kn=Xe[k]+WNkXo[k]
Xe[k]Xo[k]N2x[n]NN2
2(N2)2+N<N2
N>2

Потім ми можемо повторно повторити той самий процес на цих двох менших DFT. Цей підхід розділити і перемогти дозволяє досягти складності , що набагато краще, ніж ми мали наївну реалізацію DFT (як це в значній мірі ілюструється leftaroundabout відповідь «s).О(NжурналN)О(N2)


Чи бажаєте ви перерахувати, що означає кожна з змінних? Я досить новий для цього, так що W, j, X(), Nі kще не має визначення для мене.
Seph Reed

W вже визначено у моїй відповіді. Я намагався краще визначити деякі інші позначення. позначає індекс у частотній області та індекс у часовій області. kn
anpar

19

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

DFT, розмір 16

Діаграма операцій в DFT розміром 16 наїв

FFT, розмір 16

Діаграма операцій на FFT розміром-16 radix-2

Різниця в складності досить очевидно з цього, чи не так?


Ось як я розумію FFT.

По-перше, я б завжди думав про перетворення Фур'є насамперед як перетворення безперервних функцій, тобто бієктивне відображення . У цьому світлі зрозуміло, що перейти на "найглибший рівень" та перейти на окремі елементи неможливо , тому що "окремі елементи" - це єдині точки на реальній лінії, яких є надмірно нескінченними. .FT:L2(R)L2(R)

То як же ця трансформація все ще чітко визначена? Що ж, важливо, щоб він працював не на загальному просторі функцій а лише на просторі (Lebesgue-, квадратних) інтегруваних функцій. Тепер ця інтеграція не є дуже сильною властивістю (набагато слабшою, ніж диференційованість тощо), але вона вимагає, щоб функція стала "локально доступною для відображення з інформацією, що обчислюється". Така характеристика задана коефіцієнтами короткочасного перетворення Фур'є . RCНайпростіший випадок полягає в тому, що ваша функція є безперервною, і ви поділяєте її на настільки малі регіони, що вони в основному постійні в кожному з них. Тоді кожен із STFT має найбільш сильний нульовий доданок. Якщо ви ігноруєте (інакше занепадаючі) інші коефіцієнти, то кожен домен - це лише одна точка даних. З усіх цих коротко-часових граничних коефіцієнтів ви можете взяти дискретні перетворення Фур'є. Насправді це саме те, що ти робиш, виконуючи будь-який FT на вимірюваних реальних даних!

Однак вимірювані дані не обов'язково повинні відповідати основній фізичній величині. Наприклад, коли ви вимірюєте деяку інтенсивність світла , ви насправді просто вимірюєте амплітуду електромагнітної хвилі, частота якої сама зависока, щоб бути вибіркою з АЦП. Але очевидно, ви можете також обчислити DFT вибіркового сигналу інтенсивності світла, і це дешево, незважаючи на шалену частоту світлової хвилі.

Це можна зрозуміти як найважливішу причину FFT дешева:

Не турбуйтеся намагатися побачити окремі цикли коливань з найвищого рівня. Натомість трансформуйте лише дещо інформацію високого рівня, яка вже була попередньо оброблена локально.

Але це ще не все. Чудова річ у FFT полягає в тому, що він все ще надає всю інформацію, яку надає повна DFT . Тобто всю інформацію, яку ви також отримаєте, відбираючи точну електромагнітну хвилю світлового променя. Чи можна це досягти шляхом перетворення фотодіодного сигналу? - Ви можете виміряти точну частоту світла від цього?

Ну, відповідь - ні, ти не можеш. Тобто, якщо не застосовувати зайвих хитрощів.
Перш за все, вам потрібно хоча б приблизно виміряти частоту в коротких часових блоках. Ну, це можливо за допомогою спектрографа. Але це можливо лише до точності , типового відношення невизначеності .Δν=1/Δt

Маючи загальний більш тривалий проміжок часу, ми також повинні мати можливість зменшити невизначеність частоти. І це дійсно можливо, якщо виміряти локально не тільки чортову частоту, але і фазу хвилі. Ви знаєте, що сигнал 1000 Гц матиме абсолютно таку ж фазу, якщо ви подивитесь на нього одну секунду пізніше. Тоді як сигнал 1000,5 Гц, не відрізняючи його від короткомасштабної, буде інвертованою фазою через секунду.

На щастя, ця фазова інформація може дуже добре зберігатися в єдиному комплексному числі. І ось так працює FFT! Це починається з безлічі невеликих, локальних перетворень. Вони дешеві - одне, очевидно, тому що вони використовують лише невелику кількість даних, а по-друге, тому що вони знають, що через короткий проміжок часу вони не можуть вирішити частоту дуже точно - так що це все ще доступно, хоча ви зробити цілу купу таких перетворень.

Однак вони записують також фазу , і після цього ви зможете зробити точнішу роздільну здатність на верхньому рівні. Необхідна трансформація знову дешева, оскільки сама по собі не турбує якісь високочастотні коливання, а лише попередньо оброблені низькочастотні дані.


Так, моя аргументація на даний момент трохи кругла. Давайте просто назвемо це рекурсивним і ми все добре ...

Це відношення не є квантово-механічним, але невизначеність Гейзенберга має фактично ту ж саму фундаментальну причину.


2
приємне зображення піктограми. :-)
Роберт Брістоу-Джонсон

2
Ви не любите діаграми, які повторюються скрізь і ніколи насправді ніде не пояснюють :)
user541686

1
Я зрозумів картину після того, як щойно прочитав відповідь Анпара.
JDługosz

15

WNнкеj2πнкN

Зверніть увагу на показаний шлях, а рівняння під ним показує результат для частоти бін X (1), як задано рівнянням Роберта.

Штрихові лінії не відрізняються від суцільних ліній лише для того, щоб зрозуміти, де знаходиться підсумок.

Впровадження FFT


8

по суті, в обчисленні наївного DFT безпосередньо з підсумовування:

Х[к]=н=0N-1х[н]еj2πнкN

Nеj2πнкNNN-1Х[к]кХ[к+1]

  1. тому FFT тримається на деяких проміжних даних.
  2. FFT також трохи використає коефіцієнт подвійного коефіцієнта, щоб той самий фактор міг бути використаний для проміжної комбінації даних.

4

Я візуальна людина. Я вважаю за краще FFT як матричний фокус, а не як підсумок.

Щоб пояснити на високому рівні:

Наївний DFT обчислює кожен вихідний зразок самостійно і використовує кожен вхідний зразок у кожному обчисленні (класичний алгоритм N²).

Загальний FFT використовує симетрії та шаблони у визначенні DFT для обчислення в "шарах" (шарах N N), кожен шар з вимогою постійного часу на зразок, створюючи алгоритм N log N.

Детальніше:

Один із способів візуалізації цих симетрій - це розглядати DFT як вхід матриці 1 × N, помножений на матрицю NxN всіх ваших складних експоненцій. Почнемо з корпусу «радіакс 2». Ми збираємося розділити парні і непарні рядки матриці (що відповідають парним і непарним вхідним зразкам) і розглянемо їх як два окремих матричних множення, які складаються разом, щоб отримати однаковий кінцевий результат.

А тепер подивіться на ці матриці: у першій ліва половина ідентична правій половині. В іншому права половина - ліва половина x −1. Це означає, що нам потрібно дійсно використовувати ліву половину цих матриць для множення, а праву половину дешево створити, помноживши на 1 або −1. Далі зауважте, що друга матриця відрізняється від першої матриці коефіцієнтами, однаковими у кожному стовпчику, тому ми можемо виокремити та помножити її на вхід, тому тепер і парні, і непарні зразки використовують ту саму матрицю, але потребують множника спочатку. І останнім кроком є ​​зауваження, що ця результуюча матриця N / 2 × N / 2 ідентична матриці N / 2 DFT, і ми можемо робити це знову і знову, поки ми не досягнемо матриці 1 × 1, де DFT є функцією ідентичності.

Щоб узагальнити рамки 2, ви можете розділити кожен третій ряд і переглянути три шматки стовпців або кожен четвертий і т.д.

У разі введення простіших розмірів існує метод правильної нульової колодки, FFT та усікання, але це виходить за рамки цієї відповіді.

Дивіться: http://whoiskylefinn.com/MatrixFFT.html


основний FFT , різні FFT . Використання нульового майданчика - не єдиний варіант. Вибачте, я просто вважаю, що нульова накладка перестарається. Одне невелике запитання, я не розумію, що ви маєте на увазі під "кожним шаром з вимогою постійного часу на зразок", якщо ви могли б пояснити, це було б дивним.
Зло

1
Вибачте, що я не хотів сказати, що нульова накладка була ТО, просто хотіла вказати на подальше читання І "шар", що означає рекурсію, або переклад з N DFT на 2 N / 2 DFT, з постійним часом на зразок, що означає цей крок O (N).
kylefinn

Поки, з усіх описів, цей здається найближчим до спрощення складної проблеми. Хоча велика річ, якої вона не вистачає, є прикладом цих матриць. Чи трапилося б у вас таке?
Seph Reed

Завантажив це, має допомогти: whoiskylefinn.com/MatrixFFT.html
kylefinn

1

DFT помножує матрицю грубої сили N ^ 2.

FFTs робить розумні хитрощі, використовуючи властивості матриці (вироджуючи множину матриці), щоб зменшити обчислювальні витрати.

Давайте спочатку розглянемо невеликий DFT:

W = fft (око (4));

x = rand (4,1) + 1j * rand (4,1);

X_ref = fft (x);

X = W * x;

стверджувати (max (abs (X-X_ref)) <1e-7)

Чудово, тому ми можемо замінити виклик MATLAB до бібліотеки FFTW невеликим множенням 4х4 (складних) матриць, заповнивши матрицю з функції FFT. То як виглядає ця матриця?

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 = Wn. ^ F

W =

1 1 1 1

1 -i -1 i

1 -1 1 -1

1 i -1 -i

Кожен елемент є або +1, -1, + 1j або -1j. Очевидно, це означає, що ми можемо уникнути повного складного множення. Далі перший стовпець ідентичний, це означає, що ми множимо перший елемент x знову і знову на один і той же множник.

Виявляється, тензорні продукти Kronecker, "подвійні фактори" та перестановочна матриця, де індекс змінюється відповідно до бінарної репрезентації, перевернуті, є одночасно компактними та дають альтернативну точку зору того, як обчислюються FFT як набір розріджених матричних операцій.

Нижче наведені рядки - це просте обчислення частоти (DIF) в радіусі 2 вперед FFT. Хоча кроки можуть здаватися громіздкими, їх зручно використовувати для прямої / зворотної FFT, radix4 / split-radix або в часі декімації, одночасно являючи собою справедливе уявлення про те, як місцеві FFT мають тенденцію до впровадження в реальному світі, Я вірю.

N = 4;

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

T1 = exp (-1j * 2 * pi * ([нулі (1, N / 2), 0: (N / 2-1)]). '/ N),

M0 = kron (око (2), fft (око (2))),

M1 = крон (fft (око (2)), око (2)),

X = бітовий порядок (x. '* M1 * diag (T1) * M0),

X_ref = fft (x)

стверджувати (max (abs (X (:) - X_ref (:))) <1e-6)

CF Van Loan має чудову книгу на цю тему.


1

Якщо ви хочете пити з Мудрості Мудрості, пропоную:

"Швидкі перетворення - алгоритми, аналізи, застосування" Дугласа Е. Елліотта, К. Рамамохана Рао

Він охоплює FFT, Hartley, Winograd та додатки.

Одним із сильних моментів є те, що показує, як FFT - це набір розрізнених матричних множників з упорядкуванням бітів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.