Подтвердить что ты не робот

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

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

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

alt text

Собственно, сюжет не такой гладкий, как я хотел. Есть ли способ сгладить график до требуемой степени?

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

Я не уверен, но может помощь fast-fourier-transform?

4b9b3361

Ответ 1

Простой (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 частот. Будьте осторожны, чтобы вырезать их симметрично, иначе обратное преобразование больше не является реальным. Вам нужно тщательно выбрать частоту среза для правильного уровня сглаживания. Это очень простой вид фильтрации (фильтрация ящиков в частотной области), поэтому вы можете спокойно смягчать частоты высокого порядка, если искажение неприемлемо.

Ответ 2

Если у вас есть панель инструментов Curve Fitting Toolbox, вы можете использовать функцию 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

Ответ 3

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

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

-Поль

Ответ 4

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

Ответ 5

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