Я проверяю свои знания о дискретных преобразованиях Фурье.
Сейчас я тестирую, как вычислить центральную частоту волны с помощью 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
и получаю два вектора, один из которых содержит действительную часть, а другой - мнимую.
Я так понимаю, что внутри каждого вектора у меня будет следующее:
- данные имеют 512 образцов
- следовательно, элементы от 0 до 256 будут положительными частотами
- и элементы с 257 по 511, отрицательные частоты
- Я могу отбросить отрицательные частоты и сохранить положительные частоты от 0 до 255.
- Бункер 0 - это DC. Я могу отказаться от этого.
- 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])
????