Как рассчитать энергию на бин в ДПФ?

Я проверяю свои знания о дискретных преобразованиях Фурье.

Сейчас я тестирую, как вычислить центральную частоту волны с помощью DFT.

Для этого я создаю синусоидальные данные, используя этот код:

// create a 100 Hz wave with a sampling rate of 512 samples per second
var data : [Double] = []
for i in 0...511 {
  let t = Double(i) * 100/256
  let f = 10 * sin(2 * Double.pi * t)
  data.append(f)
}

Затем я выполняю DWT на data и получаю два вектора, один из которых содержит действительную часть, а другой - мнимую.

Я так понимаю, что внутри каждого вектора у меня будет следующее:

  1. данные имеют 512 образцов
  2. следовательно, элементы от 0 до 256 будут положительными частотами
  3. и элементы с 257 по 511, отрицательные частоты
  4. Я могу отбросить отрицательные частоты и сохранить положительные частоты от 0 до 255.
  5. Бункер 0 - это DC. Я могу отказаться от этого.
  6. Bin 255 будет 256 Гц, потому что это половина частоты дискретизации.

Чтобы убедиться, что я правильно понял, я проверяю 256 ячеек и ищу наибольшую величину. Ячейка с наибольшей амплитудой будет K по следующей формуле, и я могу найти частоту сигнала:

freq = (K + 1) * fps / N

K+1, потому что мой первый индекс - это 0, и я исключил DC из моего массива, и где N - количество выборок.

Большая проблема: как рассчитать энергию на бункер?

E[i] = sqrt(realPart[i] * realPart[i] + imaginaryPart[i] * imaginaryPart[i])

????


person Duck    schedule 30.03.2019    source источник


Ответы (1)


Вышеупомянутый план выглядит точным ... чтобы вычислить величину для данного бункера

mag = 2.0 * math.Sqrt(real*real+imag*imag) / number_of_samples

где number_of_samples - это длина массива, подаваемого в вызов fft ... красивый аспект выполнения fft - вы можете затем применить обратное преобразование Фурье к этому набору (частота, величина, фазовый сдвиг), чтобы вернуть исходный сигнал во временной области ... это хороший способ проверить правильность вашего процесса

Магия преобразования Фурье и обратного преобразования Фурье - пример:

вы начинаете с массива с плавающей запятой, который представляет что-то, что колеблется, например, звук, индекс фондового рынка или любой временной ряд ... это представление во временной области, поскольку это набор точек на кривой, где время находится слева направо по оси X а ось Y вверх и вниз - это высота кривой ... затем вы передаете этот массив в вызов API-интерфейса fft, который вернет вам ту же информацию в своем представлении в частотной области ... это та же информация только в другое представление ... в домене freq у вас будет массив, где элемент 0 всегда имеет частоту 0 циклов в секунду (смещение постоянного тока), а затем, когда вы выполняете итерацию по массиву, вы увеличиваете частоту, используя формулу

incr_freq := sample_rate / number_of_samples

поэтому в сложном массиве, сгенерированном вызовом fft, каждый элемент - это данные для заданной частоты, где каждый элемент представляет собой просто комплексное число ... Проще говоря, это представление области частот - это просто набор частот, каждая частота воплощена в виде сложного число (A + Bi), которое можно использовать для вычисления амплитуды и фазового сдвига этой частоты

теперь самое интересное ... если вы отправите этот массив домена freq в обратное преобразование Фурье, вы получите обратно свои исходные данные, которые находятся в представлении во временной области

myAudio_TD (временной домен) - ›отправить в fft -› myAudio_FD (частотный домен)

затем позже вы можете сделать обратное, как в

myAudio_FD (частотный домен) - ›отправить в обратный fft -› myAudio_TD (временной домен)

обратите внимание, что в этой прогрессии вы начали с массива myAudio_TD, который был отправлен в вызов fft, а затем в обратный вызов fft, который волшебным образом вернет вам ваш исходный myAudio_TD

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

person Scott Stensland    schedule 30.03.2019
comment
Спасибо за формулу !!! Величина такая же, как и энергия? Я не понимаю ваш последний абзац. Пожалуйста, объясните, что вы имеете в виду. - person Duck; 31.03.2019
comment
Вы уверены в заказе корзины? Я ожидаю, что ячейка 0 будет (-f / 2), средняя ячейка будет DC, а ячейка с самым большим номером будет (f / 2). ... по крайней мере, так работает мой унаследованный код Python. - person grambo; 11.06.2019