Які дані слід використовувати для тестування впровадження FFT, і яку точність слід очікувати?


14

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

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

Щодо точності, Вікіпедія говорить, що помилка повинна бути O (e log N), але в чому абсолютне очікування?

Редагувати, щоб додати: Фактичні тести знаходяться у формі, де я зберігав масиви вхідних даних та попередньо обчислювані "посилання" вихідних даних для порівняння, тому мені не обов'язково потрібно щось із рішенням закритої форми.

Відповіді:


12

Якщо ви хочете перевірити алгоритм FFT на правильність , у тому сенсі, що він виконує бажану функцію, яка має відомі властивості дискретного перетворення Фур'є , то ви можете використовувати підхід, запропонований у:

Ергун, Фунда. (1995, червень). Тестування багатоваріантних лінійних функцій: Подолання вузького місця вуглецю. У Зб. Двадцять сьома Енн. ACM Symp. Теорія обчислень . (стор. 407–416).

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

  • Лінійність: DFT (разом з іншими перетвореннями родичів у сімействі Фур'є) є лінійним оператором , тому для всіх значень має виконуватися таке рівняння:a1,a2,x1[n],x2[n]

FFT(a1x1[n]+a2x2[n])=a1FFT(x1[n])+a2FFT(x2[n])
  • DFT одиничного імпульсу: Сигнал часової області, рівний функції дельти Kronecker, застосовується до входу алгоритму FFT і вихід перевіряється відповідно до відомого DFT функції одиничного імпульсу (він перетворюється на постійне значення у всьому виході бункери). Якщо алгоритм FFT забезпечує IFFT, його можна перевірити в зворотному порядку, щоб показати, що він знову дає функцію одиничного імпульсу.

  • Зсув у часі: до вводу алгоритму FFT застосовуються два набори даних; Єдина відмінність між двома в часовій області - це постійний зсув часу. Виходячи з відомих властивостей DFT, це повинно впливати на відомий лінійний зсув фази між представленнями частоти домену двох сигналів, де нахил фазового зсуву пропорційний часовому зсуву.

Автори статті стверджують, що цих тестів достатньо для підтвердження правильності впровадження FFT. Раніше я не використовував цю методику, але це, мабуть, має сенс, і я би довіряв авторам FFTW (які створили чудовий фрагмент вільного програмного забезпечення) як надійним авторитетам щодо хороших підходів до проблеми перевірки.


Спасибі! Чи є автори якісь пропозиції щодо значень a1, a2, x1 [n] та x2 [n], які слід використовувати в тесті на лінійність (чи вони стверджують, що це значною мірою не має значення)? І, з цього приводу, для наборів даних, які використовуються для тесту зсуву часу?
Брукс Мойсей

3
Насправді прочитавши статтю, я можу відповісти на власне запитання: Автори не описують, як хтось виконує тест на лінійність, а натомість припускають, що це було зроблено достатньо, щоб довести, що це правда для "більшості матеріалів". Також ця стаття описує доказ точної коректності, припускаючи точну арифметику; це не опис засобу для характеристики числової помилки у наближеній програмі (як обов'язково результат використання арифметики з кінцевою точністю).
Брукс Мойсей

Я продовжую і відзначу це як прийняте, тому що це, безумовно, найкраща відповідь поки що - але мене все ще цікавлять інші відповіді, які висвітлюють, які тестові набори даних для використання (і чому), або деталі очікуваної точності . Спасибі!
Брукс Мойсей

2
У вашому питанні щодо перевірки алгоритму FFT дійсно два компоненти: перевірка його правильності та вимірювання його чисельної точності. Моя відповідь стосувалася лише першої. Важко робити будь-які твердження про те, якої чисельної точності очікувати, оскільки вона по суті залежить від реалізації. Тип арифметики (наприклад, фіксований проти плаваючої точки), структура, що використовується для реалізації алгоритму, довжина FFT (тобто кількість етапів, що використовуються для розкладання проблеми), будь-які ярлики, вжиті для підвищення швидкості виконання тощо, будуть відтворювати фактор і їх важко узагальнити.
Джейсон R

Гарна думка; Напевно, я мав би задавати їх як окремі запитання.
Брукс Мойсей

5

Як уже згадувалося в запитанні, я знайшов один набір пропозицій в заархівованих публікаціях Use.dsp Usenet ( http://www.dsprelated.com/showmessage/71595/1.php , повідомлення від "tdillon"):

A.Single FFT tests - N inputs and N outputs
 1.Input random data
 2.Inputs are all zeros
 3.Inputs are all ones (or some other nonzero value)
 4.Inputs alternate between +1 and -1.
 5.Input is e^(8*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 6.Input is cos(8*2*pi*i/N) for i = 0,1,2, ...,N-1.
 7.Input is e^((43/7)*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 8.Input is cos((43/7)*2*pi*i/N) for i = 0,1,2, ...,N-1.

B.Multi FFT tests - run continuous sets of random data
 1.Data sets start at times 0, N, 2N, 3N, 4N, ....
 2.Data sets start at times 0, N+1, 2N+2, 3N+3, 4N+4, ....

Нитка також пропонує зробити два синуси, один з великою амплітудою і один з малою амплітудою.

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


1
Що б виявило "1. Вхідні випадкові дані"?
Діліп Сарват

1
@DilipSarwate: Тест-тест може бути корисним для виявлення збоїв. І, залежно від типу вхідного шуму (скажімо, рожевий шум або білий шум), може бути корисним для перевірки того, що загальний розподіл енергії є таким, як очікувалося.
smokris

2
@Dilip - Мій fft "тест на дим" полягає в тому, що ifft (fft (random_stuff)) ~ = random_stuff.
hotpaw2

NCN(0,1)99%N CN(0,1)

2
@Dilip: Я апаратний хлопець. Я хотів щось, що могло б змінити високий відсоток усіх бітів у всіх множниках та CSA.
hotpaw2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.