Как рассчитать энергию на бин в ДПФ? - PullRequest
3 голосов
/ 30 марта 2019

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

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

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

// 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 - это постоянный ток. Я могу отказаться от него.
  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])

????

1 Ответ

4 голосов
/ 30 марта 2019

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

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

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

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

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

incr_freq := sample_rate / number_of_samples

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

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

myAudio_TD (временной домен) -> отправить в fft -> myAudio_FD (freq domain)

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...