Какие данные я должен использовать для проверки реализации FFT, и какую точность мне следует ожидать?

14

Я вовлечен в усилия по реализации алгоритма FFT, и мне любопытно, какой рекомендуемый совет для использования входных тестовых данных - и почему! - и какую точность ожидать.

Что касается входных данных теста, я нашел небольшое руководство в старых постах Usenet, которые я опубликую в качестве ответа, но это всего лишь предложения одного человека без большого оправдания - я не нашел ничего, что выглядело бы как надежный ответ.

Что касается точности, Википедия говорит, что ошибка должна быть O (e log N), но каково разумное ожидание в абсолютном выражении?

Изменить, чтобы добавить: фактические тесты находятся в форме, в которой я сохранил массивы входных данных и предварительно вычисленные «опорные» выходные данные для сравнения, поэтому мне не обязательно что-то с решением в закрытой форме.

Брукс Моисей
источник

Ответы:

12

Если вы хотите проверить правильность алгоритма БПФ , в том смысле, что он выполняет требуемую функцию, которая обладает известными свойствами дискретного преобразования Фурье , то вы можете использовать подход, предложенный в:

Ergün, Funda. (Июнь 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])
  • ДПФ единичного импульса: сигнал во временной области, равный дельта-функции Кронекера, подается на вход алгоритма БПФ, а выход проверяется по известному ДПФ единичной импульсной функции (он преобразуется в постоянное значение во всех выходных данных). бункера). Если алгоритм БПФ обеспечивает IFFT, его можно протестировать в обратном порядке, чтобы показать, что он снова выдает функцию единичного импульса.

  • Сдвиг по времени: два набора данных применяются для ввода алгоритма БПФ; единственная разница между ними во временной области - это постоянный сдвиг во времени. Основываясь на известных свойствах ДПФ, это должно влиять на известный линейный фазовый сдвиг между представлениями частотной области двух сигналов, где наклон фазового сдвига пропорционален сдвигу времени.

Авторы статьи утверждают, что этих тестов достаточно для проверки правильности реализации FFT. Я не использовал эту технику в прошлом, но она, кажется, имеет смысл, и я бы поверил авторам FFTW (которые создали отличное бесплатное программное обеспечение) в качестве авторитетных авторитетов в отношении хороших подходов к проблеме валидации.

Джейсон Р
источник
Благодарность! Есть ли у авторов какие-либо предположения о значениях a1, a2, x1 [n] и x2 [n] для использования в тесте на линейность (или они утверждают, что это в значительной степени не имеет значения)? И, в этом отношении, для наборов данных, чтобы использовать для теста сдвига времени?
Брукс Моисей
3
Прочитав статью, я могу ответить на свой вопрос: авторы не описывают, как выполняется тест на линейность, а вместо этого предполагают, что он сделал это достаточно, чтобы доказать, что это верно для «большинства входных данных». Кроме того, эта статья описывает доказательство точной правильности, предполагая точную арифметику; оно не описывает средство для характеристики числовой ошибки в приближенной программе (что обязательно следует из использования арифметики с конечной точностью).
Брукс Моисей
Я отмечу это как принятый, потому что это, безусловно, лучший ответ на данный момент - но я все еще очень заинтересован в других ответах, которые касаются того, какие тестовые входные наборы данных использовать (и почему), или деталей ожидаемой точности , Благодарность!
Брукс Моисей
2
На самом деле есть два компонента для проверки правильности алгоритма БПФ: проверка его правильности и измерение его числовой точности. Мой ответ адресован только первым. Трудно сделать какие-либо заявления о том, какую числовую точность ожидать, потому что она изначально зависит от реализации. Тип арифметики (например, фиксированная по сравнению с плавающей запятой), структура, используемая для реализации алгоритма, длина БПФ (т. Е. Количество этапов, используемых для декомпозиции проблемы), любые комбинации клавиш, используемые для улучшения скорости выполнения и т. Д., Будут играть фактор и трудно обобщать.
Джейсон Р
Хорошая точка зрения; Я, вероятно, должен был задать их как отдельные вопросы.
Брукс Моисей
5

Как упоминалось в этом вопросе, я нашел один набор предложений в заархивированных сообщениях comp.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: Fuzz-тестирование может быть полезно для выявления сбоев. И, в зависимости от типа входного шума (скажем, розовый шум или белый шум), может быть полезно проверить, соответствует ли общее распределение энергии ожидаемому.
Smokris
2
@Dilip - мой fft "тест на дым" это то, что ifft (fft (random_stuff)) ~ = random_stuff.
hotpaw2
NCN(0,1)99%N CN(0,1)
2
@Dilip: Я парень по железу. Я хотел что-то, что могло бы переключать высокий процент всех бит во всех множителях и CSA.
hotpaw2