Дискретное преобразование Гильберта

metelev_sv
Сообщений: 11
Зарегистрирован: 08 окт 2021, 14:55
Откуда: СПб
Контактная информация:

Дискретное преобразование Гильберта

Сообщение metelev_sv » 22 янв 2022, 14:20

Здравствуйте!

Есть такая штука, называется преобразование Гильберта.

[math]

Видно, что это фактически свёртка [math]

Поэтому одним из способов его вычисления служит дискретное преобразование Фурье от исходной функции, домножение на образ от $1/(\pi x)$ и обратное преобразование Фурье.

[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] и наоборот.

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Дискретное преобразование Гильберта

Сообщение zykov » 22 янв 2022, 23:47

Hilbert transform: Relationship with the Fourier transform
[math]
Т.к. преобразование линейно, то множитель [math] можно наружу вынести.

metelev_sv
Сообщений: 11
Зарегистрирован: 08 окт 2021, 14:55
Откуда: СПб
Контактная информация:

Дискретное преобразование Гильберта

Сообщение metelev_sv » 23 янв 2022, 16:48

zykov

Спасибо за ответ.

То, что Вы сказали понятно и именно так реализовано.

Вопрос с дискретным преобразованием. Если функция задана в виде таблицы, то нам приходится пользоваться дискретным преобразованием Фурье. Но мы им пользуемся только для [math], а вторую часть свёртки считаем заданной аналитически.

Ну а если бы она не была известна аналитически. Если бы мы не знали, что [math], то естественно попытались бы сделать дискретное преобразование. Так вот, дискретное преобразование Фурье не получается похожим на [math].

Вот я делаю преобразование от [math] и не получаю ничего похожего на [math] в мнимой части.

Код: Выбрать все

> 1/pi/-9.5:9.5
 [1] -0.03350630 -0.03744822 -0.04244132 -0.04897075 -0.05787452 -0.07073553
 [7] -0.09094568 -0.12732395 -0.21220659 -0.63661977  0.63661977  0.21220659
[13]  0.12732395  0.09094568  0.07073553  0.05787452  0.04897075  0.04244132
[19]  0.03744822  0.03350630
> fft(1/pi/-9.5:9.5)
 [1] -5.551115e-17+0.000000e+00i -1.845636e-01+1.165289e+00i
 [3]  2.784677e-01-8.570353e-01i -4.852015e-01+9.522615e-01i
 [5]  5.563108e-01-7.656962e-01i -7.387092e-01+7.387092e-01i
 [7]  7.773447e-01-5.647740e-01i -9.227192e-01+4.701489e-01i
 [9]  9.193203e-01-2.987053e-01i -1.019437e+00+1.614629e-01i
[11]  9.682476e-01+0.000000e+00i -1.019437e+00-1.614629e-01i
[13]  9.193203e-01+2.987053e-01i -9.227192e-01-4.701489e-01i
[15]  7.773447e-01+5.647740e-01i -7.387092e-01-7.387092e-01i
[17]  5.563108e-01+7.656962e-01i -4.852015e-01-9.522615e-01i
[19]  2.784677e-01+8.570353e-01i -1.845636e-01-1.165289e+00i
> plot(Im(fft(1/pi/-9.5:9.5)))


Изображение



Методом тыка получилось похожее, если делать в таком виде:

Код: Выбрать все

plot(Im(fft(c(0,1/pi/9.5:-9.5))))


Это соответствует такому массиву:

Код: Выбрать все

> c(0,1/pi/9.5:-9.5)
 [1]  0.00000000  0.03350630  0.03744822  0.04244132  0.04897075  0.05787452
 [7]  0.07073553  0.09094568  0.12732395  0.21220659  0.63661977 -0.63661977
[13] -0.21220659 -0.12732395 -0.09094568 -0.07073553 -0.05787452 -0.04897075
[19] -0.04244132 -0.03744822 -0.03350630


Изображение

Но тут они через одну точку чередуются +1 -1 и т.п.

В результате и возникает вопрос, может такой вид и надо брать для свёртки?

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

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Дискретное преобразование Гильберта

Сообщение zykov » 24 янв 2022, 00:00

metelev_sv писал(а):Source of the post Вот я делаю преобразование от [math] и не получаю ничего похожего на [math] в мнимой части.
Ну так не от этой же функции делаете, а от дискретного набора точек.
Вот на википедии подробнее написано про Discrete Hilbert transform. Оно там и определяется через discrete-time Fourier transform (DTFT).
metelev_sv писал(а):Source of the post то естественно попытались бы сделать дискретное преобразование
Нет, это противоестественно. Если вместо самой функции взять только отдельные её точки, то это сильно её искажает. И результат преобразования будет сильно искажен. Если есть возможность аналитически посчитать всю функцию точно, то это гораздо лучше.

metelev_sv
Сообщений: 11
Зарегистрирован: 08 окт 2021, 14:55
Откуда: СПб
Контактная информация:

Дискретное преобразование Гильберта

Сообщение metelev_sv » 24 янв 2022, 07:11

zykov писал(а):Source of the post Если есть возможность аналитически посчитать всю функцию точно, то это гораздо лучше.


Ну если строго следовать этому подходу, то в программе функции [math] должна соответствовать ступенька с резкими краями. А там по краям половинные значения. Я пытался сделать и просто ступеньку, на глаз отличия незаметны.

Там ещё есть такой момент, что если дополнить исходную функцию нулями справа и слева, то дискретное преобразование Гильберта даёт результат гораздо более близкий к аналитическому, чем при непосредственном использовании исходной функции. Насколько я вижу, в английской википедии тоже об этом есть. Так что спасибо за ссылку! Я когда-то просматривал эту страничку, но тогда не обратил внимания, что там про дискретное преобразование тоже есть. Буду внимательно читать.


Вернуться в «Математика»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 8 гостей