Как сгладить сюжет в MATLAB? - PullRequest
       71

Как сгладить сюжет в MATLAB?

20 голосов
/ 04 октября 2009

У меня есть около 9000 точек, которые нанесены на график:

[ Полное разрешение ]

alt text

На самом деле, сюжет не такой гладкий, как мне хотелось бы. Можно ли как-нибудь сгладить график до необходимой степени?

Или какая-то форма порога, чтобы я мог выборочно сгладить слишком неровные части?

Я не уверен, но может ли быстрое преобразование Фурье помочь?

Ответы [ 5 ]

30 голосов
/ 04 октября 2009

Если у вас есть Curve Fitting Tool , вы можете использовать функцию smooth. По умолчанию используется метод скользящего среднего размера 5 (метод можно изменить). Пример:

% some noisy signal
Fs = 200; f = 5;
t = 0:1/Fs:1-1/Fs;
y = sin(2*pi*f*t) + 0.6*randn(size(t));
subplot(411)
plot(y), title('Noisy signal')

% smoothed signal
subplot(412)
plot( smooth(y, 5, 'moving') ), title('smooth')
ylim([-2 2])

Если нет, вы можете использовать собственную оконную функцию, используя функцию filter из ядра MATLAB:

% equivalent to a moving average window
wndwSize = 5;
h = ones(1,wndwSize)/wndwSize;
subplot(413)
plot( filter(h, 1, y) ), title('filter + square window')

% Guassian
h = pdf('Normal',-floor(wndwSize/2):floor(wndwSize/2),0,1);
subplot(414)
plot( filter(h, 1, y) ), title('filter + Guassian window')

screenshot

17 голосов
/ 04 октября 2009

Простой (ad hoc) способ состоит в том, чтобы просто взять средневзвешенное значение (настраиваемое на alpha) в каждой точке со своими соседями:

data(2:n-1) = alpha*data(2:n-1) + (1-alpha)*0.5*(data(1:n-2)+data(3:n))

или какой-либо ее вариантДа, чтобы быть более изощренным, вы можете сначала преобразовать данные Фурье, а затем отключить высокие частоты.Что-то вроде:

f = fft(data)
f(n/2+1-20:n/2+20) = zeros(40,1)
smoothed = real(ifft(f))

Это обрезает 20 самых высоких частот.Будьте осторожны, чтобы вырезать их симметрично, иначе обратное преобразование больше не является реальным.Вам нужно тщательно выбрать частоту среза для правильного уровня сглаживания.Это очень простой вид фильтрации (блочная фильтрация в частотной области), поэтому вы можете попытаться мягко ослабить высокие частоты, если искажение недопустимо.

5 голосов
/ 05 ноября 2009

БПФ не плохая идея, но, вероятно, здесь слишком много. Бегущие или скользящие средние дают, как правило, плохие результаты, и их следует избегать во всем, кроме поздних домашних заданий (и белого шума).

Я бы использовал фильтрацию Савицкого-Голея (в Matlab sgolayfilt (...)). Это даст вам лучшие результаты для того, что вы ищете - некоторое локальное сглаживание при сохранении формы кривой.

-Поль

3 голосов
/ 14 июля 2011

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

1 голос
/ 04 октября 2009

Сначала я бы попытался отобразить скользящее среднее по нескольким точкам, например 5 или 10. Таким образом, единственное расхождение в значениях лишь незначительно влияет на график. Конечно, это зависит от того, насколько точным должен быть график.

...