Понимание FFT вывода - PullRequest
77 голосов
/ 19 июля 2011

Мне нужна помощь в понимании результатов расчетов DFT / FFT.

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

Пожалуйста, не отвечайте "иди на EE класс". Я на самом деле планирую сделать это, если мой работодатель заплатит мне. :)

Так вот моя проблема:

Я зафиксировал сигнал с частотой 32 Гц. Вот 1 секунда выборки из 32 точек, которую я наметил в Excel.

enter image description here

Затем я получил код FFT , написанный на Java от Колумбийского университета (после того, как следовал советам в посте " Надежное и быстрое FFT в Java ").

Вывод этой программы следующий. Я считаю, что он работает на месте БПФ, поэтому он повторно использует один и тот же буфер для ввода и вывода.

Before: 

Re: [0.887  1.645  2.005  1.069  1.069  0.69  1.046  1.847  0.808  0.617  0.792  1.384  1.782  0.925  0.751  0.858  0.915  1.006  0.985  0.97  1.075  1.183  1.408  1.575  1.556  1.282  1.06  1.061  1.283  1.701  1.101  0.702  ]

Im: [0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ]

After: 

Re: [37.054  1.774  -1.075  1.451  -0.653  -0.253  -1.686  -3.602  0.226  0.374  -0.194  -0.312  -1.432  0.429  0.709  -0.085  0.0090  -0.085  0.709  0.429  -1.432  -0.312  -0.194  0.374  0.226  -3.602  -1.686  -0.253  -0.653  1.451  -1.075  1.774  ]

Im: [0.0  1.474  -0.238  -2.026  -0.22  -0.24  -5.009  -1.398  0.416  -1.251  -0.708  -0.713  0.851  1.882  0.379  0.021  0.0  -0.021  -0.379  -1.882  -0.851  0.713  0.708  1.251  -0.416  1.398  5.009  0.24  0.22  2.026  0.238  -1.474  ]

Итак, на данный момент я не могу сделать вывод или хвост на выходе. Я понимаю концепции DFT, такие как действительная часть, являющаяся амплитудами составляющих косинусных волн, и мнимая часть, являющаяся амплитудами составляющих синусоидальных волн. Я также могу следовать этой диаграмме из великой книги " Руководство ученого и инженера по цифровой обработке сигналов ": enter image description here

Итак, мои конкретные вопросы:

  1. Как найти «наиболее часто встречающиеся частоты» на выходе БПФ? Это часть моего анализа моих данных акселерометра. Должен ли я читать реальные (косинус) или мнимые (синус) массивы?

  2. У меня 32-точечный вход во временной области. Разве выходные данные БПФ не должны быть массивом из 16 элементов для вещественных чисел и массивом из 16 элементов для мнимых? Почему программа выдает мне реальные и мнимые выходные данные массива размером 32?

  3. В связи с предыдущим вопросом, как мне проанализировать индексы в выходных массивах? Учитывая мой ввод 32 выборок с частотой дискретизации 32 Гц, я понимаю, что выход массива из 16 элементов должен иметь свой индекс, равномерно распределенный до 1/2 частоты дискретизации (32 Гц), поэтому я правильно понимаю, что каждый элемент массива представляет (32 Гц * 1/2) / 16 = 1 Гц?

  4. Почему выход FFT имеет отрицательные значения? Я думал, что значения представляют амплитуды синусоиды. Например, выход Real [3] = -1,075 должен означать амплитуду -1,075 для косинусоидальной волны частоты 3. Это правильно? Как амплитуда может быть отрицательной?

Ответы [ 4 ]

76 голосов
/ 19 июля 2011
  1. Вы не должны искать ни действительную, ни образную часть комплексного числа (то, что является вашим реальным и воображаемым массивом). Вместо этого вы хотите найти величину частоты, которая определяется как sqrt (real * real + imag * imag). Это число всегда будет положительным. Теперь все, что вам нужно для поиска, - это максимальное значение (игнорируйте первую запись в вашем массиве. Это ваше смещение по постоянному току и не содержит информации, зависящей от частоты).

  2. Вы получаете 32 реальных и 32 мнимых вывода, потому что вы используете комплексное БПФ. Помните, что вы преобразовали 32 сэмпла в 64 значения (или 32 комплексных значения), расширив его до нулевых мнимых частей. Это приводит к симметричному выходу FFT, где результат частоты встречается дважды. После того, как вы готовы использовать выходы от 0 до N / 2 и зеркально отразить на выходах от N / 2 до N. В вашем случае проще всего просто игнорировать выходы от N / 2 до N. Они вам не нужны, они просто артефакт о том, как вы рассчитываете свой БПФ.

  3. Уравнение частоты к fft-bin имеет вид (bin_id * freq / 2) / (N / 2), где freq - частота дискретизации (32 Гц, а N - размер БПФ). В вашем случае это упрощает до 1 Гц на бин. Ячейки от N / 2 до N представляют отрицательные частоты (странная концепция, я знаю). В вашем случае они не содержат никакой важной информации, потому что они являются просто зеркалом первых N / 2 частот.

  4. Ваши реальные и мнимые части каждой корзины образуют комплексное число. Это нормально, если действительная и мнимая части отрицательны, а величина самой частоты положительна (см. Мой ответ на вопрос 1). Я предлагаю вам прочитать комплексные числа. Объяснение того, как они работают (и почему они полезны), превышает то, что можно объяснить в одном вопросе stackoverflow.

Примечание. Вы также можете прочитать, что такое автокорреляция и как она используется для определения основной частоты сигнала. У меня такое чувство, что ты действительно этого хочешь.

8 голосов
/ 19 июля 2011

У вас уже есть несколько хороших ответов, но я просто добавлю, что вам действительно нужно применить оконную функцию к данным вашей временной области до FFT, иначе вы получите неприятные артефакты в своем спектре.

5 голосов
/ 19 июля 2011

1) Ищите индексы в реальном массиве с самыми высокими значениями, кроме первого (это компонент DC). Вам, вероятно, понадобится частота дискретизации, значительно превышающая 32 Гц, и больший размер окна, чтобы получить много значимых результатов.

2) Вторая половина обоих массивов является зеркалом первой половины. Например, обратите внимание, что последний элемент реального массива (1.774) совпадает со вторым элементом (1.774), а последний элемент мнимого массива (1.474) является отрицательным второго элемента .

3) Максимальная частота, которую вы можете выбрать при частоте дискретизации 32 Гц, составляет 16 Гц ( Предел Найквиста ), поэтому каждый шаг составляет 2 Гц. Как отмечалось ранее, помните, что первый элемент равен 0 Гц (т. Е. Смещение постоянного тока).

4) Конечно, отрицательная амплитуда имеет смысл. Это просто означает, что сигнал «перевернут» - стандартное БПФ основано на косинусе, который обычно имеет значение = 1 при t = 0, поэтому сигнал, имеющий значение = -1 при времени = 0, будет иметь отрицательную амплитуду .

4 голосов
/ 20 июля 2011

Обратите внимание, что «наиболее часто встречающаяся частота» может разбрызгиваться на несколько ячеек БПФ даже при использовании оконной функции. Поэтому вам, возможно, придется использовать более длинное окно, несколько окон или интерполяцию, чтобы лучше оценить частоту любых спектральных пиков.

...