свертка в R - PullRequest
       14

свертка в R

6 голосов
/ 07 марта 2011

Я пытался сделать свертку в R напрямую и используя БПФ, затем взяв обратное. Но, как видно из простого наблюдения, это не правильно. Посмотрите на этот пример:

# DIRECTLY
> x2$xt
[1] 24.610 24.605 24.610 24.605 24.610
> h2$xt
[1] 0.003891051 0.003875910 0.003860829 0.003845806 0.003830842
> convolve(h2$xt,x2$xt)
[1] 0.4750436 0.4750438 0.4750435 0.4750437 0.4750435

# USING INVERSE FOURIER TRANSFORM
> f=fft(fft(h2$xt)*fft(x2$xt), inv=TRUE)
> Re(f)/length(f) 
[1] 0.4750438 0.4750435 0.4750437 0.4750435 0.4750436
>

Давайте возьмем индекс 0. В 0 свертка должна быть просто последним значением x2 $ xt (24.610), умноженным на первое значение h2 $ xt (0.003891051), которое должно дать свертку при индексе 0 = 24.610 * 0.003891051 = 0,09575877, что далеко от 0,4750436.

Я что-то не так делаю? Почему значения так отличаются от ожидаемых?

1 Ответ

13 голосов
/ 07 марта 2011

Обе convolve и fft являются круглыми .Первым элементом свертки должно быть скалярное произведение этих двух рядов.Полученные вами результаты являются правильными в этом смысле.

Для выполнения линейной свертки используйте:

convolve(h2$xt,x2$xt,type="open")

В этом случае также применяется круговая свертка, но необходимое количество нулей добавляется к входамдля достижения линейной свертки.

Я считаю, что нет прямого способа добиться линейной свертки с fft в R. Однако это не имеет большого значения, поскольку convolve сам использует подход FFT, который вы опубликовали.


Круговая свертка

Дискретный сигнал x является периодическим, если существует период N такой, что x [n] =x [n + N] для всех n .Такие сигналы могут быть представлены N выборками от x [0] до x [N-1] .

... x[-2] x[-1] x[0] x[1] x[2] ... x[N-2] x[N-1] x[N] x[N+1] ...
                ^    this part is sufficient   ^

Aопределение свертки между апериодическими x и y определяется как:

(x * y)[n] = sum{k in [-inf, inf]}(x[k]y[n-k])

Однако для периодических сигналов эта формула не даетконечные результаты.Чтобы преодолеть эту проблему, мы определяем круговую свертку между периодическими x и y .

(x * y)[n] = sum{k in [0, N-1]}(x[i]y[n-k])

Когда эти два сигнала представлены с помощью *Только 1054 * N значений, мы можем использовать y [n-k + N] вместо y [nk] для отрицательных значений nk .

Крутая вещь с круговой сверткой заключается в том, что она может вычислять линейную свертку между прямоугольными сигналами, которые являются дискретными сигналами с конечным числом ненулевых элементов.

прямоугольные сигналы длиной N могут подаваться в круговую свертку с периодичностью 2N , N для исходных образцов и N с нулями, дополненными вконец.Результатом будет круговая свертка с 2N выборками с 2N-1 для линейной свертки и дополнительным нулем.

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


Пожалуйста, смотрите:

Также смотрите:

...