Фильтр Matlab против сглаженных данных - PullRequest
0 голосов
/ 05 июня 2018

Я не нахожу причину, по которой функция filter, похоже, выводит что-то отличное от функции smoothdata.Они оба должны реализовать сглаживание окна 5 с использованием скользящей средней .Может кто-то разбирается в этих функциях объяснить, что происходит?

Вот ссылка> <на документацию, адаптированный оттуда код, добавленный <code>smoothdata (и для дополнительной загадки, функция smooth, которая тоже не та):

% from documentation
t = linspace(-pi,pi,100);
rng default  %initialize random number generator
x = sin(t) + 0.25*rand(size(t));
windowSize = 5;
b = (1/windowSize)*ones(1,windowSize);
a = 1;
y = filter(b,a,x);

%this is added for this example, you need >Matlab 2017a to run this
y2=smoothdata(x,'movmean',windowSize)
%y3=smooth(x,100);  %bug in the code (obsolete)
y3=smooth(x,windowSize);

%now plot data
figure;
plot(t,x)
hold on
plot(t,y)
plot(t,y2)
plot(t,y3)
legend('Input Data','Filtered Data','smoothdata','smooth')

%show obvious parts of plot
xlim([0 3]);
ylim([0 1.25]);

Вот что я получу в качестве вывода:

WTF

Вот некоторые несоответствия в первой части графика:

%this is added for this example, you need >Matlab 2017a to run this
y2 = smoothdata(x,'movmean',[windowSize-1,0]);
y3 =  smoothdata(padarray(x,[0 2]),'movmean',[windowSize-1,0]);
%now plot data
figure(1); clf;
plot(t,x)
hold on
plot(t(1:10),y(1:10))
plot(t(1:10),y2(1:10))
plot(t(1:10),y3(1:10))

legend('Input Data','Filtered Data','smoothdata',['padded ' char(10) 'smoothdata'])

%show obvious parts of plot
xlim([-3.1784   -2.3858]);

WTF2

1 Ответ

0 голосов
/ 05 июня 2018

Параметр window для smoothdata, если он скалярный, выдает окно с центром вокруг начала координат.filter реализует причинный фильтр, что означает, что он принимает среднее значение windowSize предыдущих выборок.Таким образом, разница между этими двумя результатами - сдвиг windowSize/2 выборок.Вы можете ясно увидеть этот сдвиг на своем графике.Используйте два параметра для имитации результата filter:

y2 = smoothdata(x,'movmean',[windowSize-1,0])

Функция smooth также реализует скользящее среднее, вторым параметром является размер окна.Здесь вы используете 100 вместо windowSize, значение которого 5.Таким образом, этот результат в среднем в 20 раз больше значений.Воспроизведите результат, используя правильный размер окна:

y3 = smooth(x,windowSize);

Я предполагаю, что y3 будет смещен относительно результата filter, точно так же, как y2 было в вопросе.

...