Есть такая штука, называется преобразование Гильберта.
[math]
Видно, что это фактически свёртка [math]
Поэтому одним из способов его вычисления служит дискретное преобразование Фурье от исходной функции, домножение на образ от и обратное преобразование Фурье.
[math]
В R (пакет EMD) ровно это и написано в строчке 16:
Код: Выбрать все
1··hilbert
2··function (xt)
3··{
4·· if (is.ts(xt))
5·· xt <- as.numeric(xt)
6·· ndata <- length(xt)
7·· h <- rep(0, ndata)
8·· if (ndata%%2 == 0) {
9·· h[c(1, ndata/2 + 1)] <- 1
10·· h[2:(ndata/2)] <- 2
11·· }
12·· else {
13·· h[1] <- 1
14·· h[2:((ndata + 1)/2)] <- 2
15·· }
16·· xt <- fft(h * fft(xt), inverse = TRUE)/ndata
17·· return(xt)
18··}
19··<bytecode: 0x556ed49f6ea0>
20··<environment: namespace:EMD>
xt --- одномерный массив, подлежащий преобразованию
ts --- time series, мне не важно
ndata --- количество точек
h --- это образ [math] Как раз с этим массивом у меня будет связан вопрос, который далее будет.
Присваивание в строчке 9 --- означает, что 1му и ndata/2+1му элементам присваиваются значения 1
в строчке 10 --- всему диапазону от 2 до ndata/2 присваиваются значения 2.
В общем и целом, если ndata=10, то h=с(1,2,2,2,2,1,0,0,0,0) Грубо говоря вся первая половина 2, а вторая половина 0.
Я как наивный человек считаю, что в дискретном преобразовании Фурье отсчёт идёт начиная с нулевого индекса и что вторая половина массива это значения функции при отрицательных значениях аргумента. То есть, что паттерн повторяется переносом на длину массива вправо и влево. В соответствии с этой концепцией, если вспомнить, что такое функция [math], то у нас половина массива должна быть заполнена 1, а далее -1. То есть фактически [math].
И представьте себе, это рассуждение до некоторой степени работает. Если я считаю, что там действительно [math], то далее ожидаю такого результата:
[math]
И действительно, после работы функции в действительной части я получу комплексный массив, действительная часть которого соответствует исходной функции, а мнимая --- преобразованию Гильберта с обратным знаком.
ТЕПЕРЬ НАКОНЕЦ ВОПРОС
Если я пытаюсь сделать дискретное преобразование Фурье для функции [math], то вовсе не получаю функцию, похожую на [math]. Так же, как если я делаю обратное преобразование Фурье от ступеньки я не получаю ничего похожего на [math]. Точнее что-то похожее я получаю, но там есть и действительная и мнимая часть и то, что можно принять за 1/x там через одно значение получается. Понятно, что дискретное преобразование даёт периодическую функцию, но всё же, я думал что при увеличении размера массива получу что-то похожее на искомую пару.
Так почему же тогда работает преобразование Гильберта?
Изначально я думал, что всё понимаю, только не понимаю зачем они единички ставят с двух сторон в массиве h. А теперь что-то совсем уже запутался.
PS В случае когда это обычное преобразование Фурье, через интеграл, его можно посчитать "в лоб" и действительно получить, что [math] и наоборот.