Одномерный фильтр Гаусса по неэквидистантным данным

У меня есть данные, распределенные в неэквидистантном одномерном пространстве, и мне нужно свернуть их с помощью фильтра Гаусса,

gaussFilter = sqrt(6.0/pi*delta**2)*exp(-6.0*x**2 /delta**2);

где delta — константа, а x соответствует пробелу.

Может ли кто-нибудь подсказать, как выполнить хорошую интеграцию (2-й порядок), поскольку данные не равномерно распределены, заботясь о конечном конце? Я намерен писать код на Fortran, но пример Matlab также приветствуется.


person user1117812    schedule 07.09.2013    source источник
comment
Как вы определяете определение свертки с неэквидистантными выборками?   -  person Luis Mendo    schedule 07.09.2013
comment
В Matlab у вас есть функции gaussfir и filter, но они будут работать только для равноудаленных образцов. Если ваши данные не равноудалены, вам нужно будет каким-то образом преобразовать их в равноудаленные. Я не знаю, как это сделать на неэквидистантных образцах.   -  person Werner    schedule 07.09.2013
comment
Преобразование данных в равноудаленное пространство потребует большого количества точек для правильной интерполяции данных.   -  person user1117812    schedule 08.09.2013
comment
Вы можете посмотреть здесь: scicomp.stackexchange.com/questions/593/   -  person Buck Thorn    schedule 08.09.2013
comment
Большое количество баллов? Для интерполяции кубическим сплайном требуется 3 точки данных (i, i+1 и i-1), хотя очевидно, что чем больше, тем лучше.   -  person Kyle Kanos    schedule 08.09.2013


Ответы (2)


использовать это:

function yy = smooth1D(x,y,delta)
    n = length(y);
    yy = zeros(n,1);
    for i=1:n;
        ker = sqrt(6.0/pi*delta^2)*exp(-6.0*(x-x(i)).^2 /delta^2);
        %the gaussian should be normalized (don't forget dx), but if you don't want to lose     (signal) energy, uncomment the next line
        %ker = ker/sum(ker); 
        yy(i) = y'*ker;
    end
end
person Mercury    schedule 08.09.2013
comment
Спасибо за ответ. Ядро должно быть нормализовано, тогда почему оно закомментировано? Что значит терять энергию? Не могли бы вы уточнить прокомментированный материал? - person user1117812; 10.09.2013
comment
Константа перед exp() существует, так что интеграл по ядру будет равен 1. Это означает, что свернувшись с этим ядром, вы не усиливаете сигнал (добавляя энергию) - person Mercury; 10.09.2013

Нашел то, что работает. Хотя не уверен, что это очень точный способ, так как интегрирование (trapz) имеет первый порядок.

function [fbar] = gaussf(f,x,delta )


n = length(f);
fbar = zeros(n,1);

for i=1:n;
    kernel =  sqrt(6/(pi*delta^2))*exp(-6*((x - x(k))/delta).^2);

    kernel = kernel/trapz(x,kernel);
    fbar(i) = trapz(x,f.*kernel);
end

end
person user1117812    schedule 10.09.2013