Подтвердить что ты не робот

Понимание выхода FFT

Мне нужна помощь в понимании вывода вычислений DFT/FFT.

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

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

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

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

enter image description here

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

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

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  ]

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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