Я сделал код Python для сглаживания данного сигнала, используя преобразование weierstrass, которое в основном является сверткой нормализованного гауссов с сигналом.#Importing relevant libraries
from __future__ import division
from scipy.signal import fftconvolve
import numpy as np
def smooth_func(sig, x, t= 0.002):
N = len(x)
x1 = x[-1]
x0 = x[0]
# defining a new array y which is symmetric around zero, to make the gaussian symmetric.
y = np.linspace(-(x1-x0)/2, (x1-x0)/2, N)
#gaussian centered around zero.
gaus = np.exp(-y**(2)/t)
#using fftconvolve to speed up the convolution; gaus.sum() is the normalization constant.
return fftconvolve(sig, gaus/gaus.sum(), mode='same')
< /code>
Если я запускаю этот код, чтобы сказать, что этап -функция, он сглаживает угол, но на границе он интерпретирует другой угол и сглаживает это, в результате, давая ненужное поведение на границе. Я объясняю это с рисунком, показанной в ссылке ниже.
пограничные эффекты < /p>
Эта проблема не возникает, если мы напрямую интегрируемся, чтобы найти свертку. Следовательно, проблема не в преобразовании Вейерстрасса, и, следовательно, проблема заключается в функции FFTConvolve в Scipy. < /p>
Чтобы понять, почему возникает эта проблема, нам сначала нужно понять работу FFTConvolve в Scipy.
Функция FFTConvolve в основном использует теорему свертки для ускорения вычислений. /> свертка (int1, int2) = ifft (fft (int1)*fft (int2))
Если мы напрямую применяем эту теорему, мы не получаем желаемый результат. Чтобы получить желаемый результат, нам нужно взять БПФ на массиве вдвое больше, чем максимум (Int1, Int2). Но это приводит к нежелательным граничным эффектам. Это связано с тем, что в коде FFT, если размер (int) больше, чем размер (по которому можно взять БПФ), он нулевой накладывает вход, а затем берет БПФ. Эта нулевая прокладка - именно то, что отвечает за нежелательные граничные эффекты. < /p>
Можете ли вы предложить способ удалить эти граничные эффекты? После сглаживания функции я собираю значение сглаживаемого сигнала с исходным сигналом вблизи границ, и если они не совпадают, я заменяю значение сглаживаемого фонда на входной сигнал в этой точке.i = 0
eps=1e-3
while abs(smooth-sig)> eps: #compairing the signals on the left boundary
smooth = sig
i = i + 1
j = -1
while abs(smooth[j]-sig[j])> eps: # compairing on the right boundary.
smooth[j] = sig[j]
j = j - 1
< /code>
Существует проблема с этим методом, из -за использования Epsilon есть небольшие прыжки в сглаженной функции, как показано ниже:
прыгает в плавном фан -< /p>
. Проблема?
Подробнее здесь: https://stackoverflow.com/questions/100 ... y-numpy-ff
Как удалить граничные эффекты, возникающие из -за нулевой прокладки в Scipy/Numpy FFT? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Математическое выражение преобразования Фурье, используемое в numpy.fft.fft
Anonymous » » в форуме Python - 0 Ответы
- 1 Просмотры
-
Последнее сообщение Anonymous
-