Содержание статьи

Сглаживание графиков в MATLAB – необходимый инструмент для обработки зашумленных данных, выделения трендов и улучшения визуальной интерпретации результатов. Встроенные функции, такие как smoothdata, sgolayfilt и medfilt1, позволяют применять различные алгоритмы фильтрации без глубоких знаний в области цифровой обработки сигналов. Например, smoothdata с параметром ‘movmean’ использует скользящее среднее с настраиваемым окном, что эффективно убирает высокочастотный шум при анализе временных рядов.
Для более сложных задач, таких как сохранение резких переходов в данных, подходит метод Савицкого-Голея (sgolayfilt). Он аппроксимирует локальные участки полиномами заданной степени, что позволяет сглаживать графики без значительного искажения пиков. Оптимальный выбор параметров – порядка полинома (обычно 2–4) и размера окна (нечетное число) – зависит от характера данных. Например, для сигналов с резкими скачками рекомендуется окно в 5–11 точек.
Альтернативой служат вейвлет-преобразования (wdenoise) и сплайновые аппроксимации (csaps). Вейвлеты эффективны для нестационарных сигналов, где шум распределен неравномерно, а сплайны позволяют гибко настраивать степень сглаживания через параметр сглаживания (от 0 до 1). При работе с большими массивами данных (105+ точек) целесообразно использовать fastsmooth из File Exchange – он реализует оптимизированный алгоритм скользящего среднего с минимальными затратами памяти.
Выбор метода зависит от структуры данных и целей анализа. Для предварительной оценки подойдет smoothdata с параметром ‘gaussian’, который дает плавное сглаживание с минимальными настройками. В случаях, когда важно сохранить форму сигнала, предпочтительны адаптивные фильтры или комбинация методов, например, медианная фильтрация с последующим применением Савицкого-Голея.
Использование функции `smoothdata` для быстрого сглаживания массивов
`smoothdata` – встроенная функция MATLAB, оптимизированная для обработки одномерных и многомерных массивов с минимальными затратами на настройку. Поддерживает методы сглаживания: скользящее среднее (`’movmean’`), медианное (`’movmedian’`), Гауссово (`’gaussian’`), Савицкого-Голея (`’sgolay’`) и низкочастотный фильтр (`’lowess’`). По умолчанию используется скользящее среднее с окном в 5 точек, но параметр `’Window’` позволяет задать произвольный размер окна, например, `smoothdata(y, ‘movmean’, 10)` для 10-точечного усреднения. Для данных с выбросами эффективнее медианное сглаживание: `smoothdata(y, ‘movmedian’, 7)`.
Функция автоматически обрабатывает края массива, применяя симметричное или периодическое расширение (параметр `’Endpoints’` со значениями `’symmetric’`, `’periodic’` или `’fill’`). При работе с неравномерными временными рядами используйте `’SamplePoints’`: `smoothdata(y, ‘SamplePoints’, t)`, где `t` – вектор временных меток. Для ускорения вычислений на больших массивах (10⁵+ точек) задайте метод `’sgolay’` с полиномом 2-го порядка и окном 21: `smoothdata(y, ‘sgolay’, 21, 2)`. Это сохраняет локальные тренды лучше, чем скользящее среднее.
В отличие от ручной реализации фильтров, `smoothdata` минимизирует артефакты на границах и поддерживает векторизованные операции. Для сравнения методов визуализируйте результаты: `plot(t, y, ‘:’, t, smoothdata(y, ‘gaussian’, 15))`. При сглаживании изображений используйте двумерный вариант: `smoothdata2(A, ‘gaussian’, [5 5])` для Гауссова ядра 5×5 пикселей. Для удаления высокочастотного шума в сигналах с частотой дискретизации 1 кГц оптимально окно в 50–100 точек при методе `’lowess’`.
Применение скользящего среднего с настраиваемым окном в MATLAB
Скользящее среднее с настраиваемым окном в MATLAB реализуется функцией movmean, которая позволяет задавать размер окна как фиксированное значение или адаптивный параметр. Например, для сглаживания временного ряда с шумом окно в 5 точек (movmean(data, 5)) убирает высокочастотные колебания, сохраняя тренд. При увеличении окна до 20 точек сглаживание усиливается, но возрастает риск потери локальных особенностей сигнала. Оптимальный размер окна зависит от частоты дискретизации данных: для сигналов с частотой 1 кГц окно в 10–50 точек обычно дает баланс между шумоподавлением и детализацией.
Для неравномерных данных или временных рядов с пропусками MATLAB поддерживает параметр ‘SamplePoints’, позволяющий задавать пользовательские позиции точек. Это критично при обработке финансовых данных, где интервалы между сделками непостоянны. Пример: movmean(price, 3, 'SamplePoints', time) корректно вычисляет среднее даже при отсутствии значений в некоторых временных метках. Без этого параметра функция использует индексы массива, что приводит к искажениям.
Асимметричные окна применяются для устранения задержки сглаженного сигнала. В MATLAB это реализуется через параметр ‘Endpoints’. Например, movmean(data, 10, 'Endpoints', 'discard') отбрасывает первые и последние 5 точек, исключая краевые эффекты. Альтернатива – 'fill' с заполнением границ нулями или экстраполяцией, но это может внести артефакты. Для анализа в реальном времени предпочтительнее центрированное окно ('Endpoints', 'shrink'), которое уменьшает размер окна на границах, сохраняя симметрию.
При работе с многомерными данными movmean поддерживает сглаживание вдоль заданного измерения. Для матрицы размером 100×200 сглаживание по строкам выполняется так: movmean(matrix, 7, 2). Это полезно при обработке изображений или спектральных данных, где шум распределен неравномерно. Для ускорения вычислений на больших массивах рекомендуется использовать GPU-версию функции (gpuArray), что сокращает время обработки в 5–10 раз на видеокартах NVIDIA с поддержкой CUDA.
Настраиваемое окно позволяет адаптировать сглаживание к специфике задачи. Для сигналов с переменной частотой шума эффективен экспоненциальный скользящий средний (movavg с параметром 'exponential'), где вес точек убывает по экспоненте. В MATLAB это реализуется через smoothdata(data, 'movmean', 15, 'SamplePoints', time) с дополнительными опциями. При выборе метода важно тестировать результаты на синтетических данных с известным трендом, сравнивая среднеквадратичную ошибку (RMSE) между исходным и сглаженным сигналом.
Сглаживание графиков с помощью фильтра Савицкого-Голея
Фильтр Савицкого-Голея – полиномиальный сглаживающий фильтр, сохраняющий особенности сигнала (пики, перегибы) за счёт аппроксимации локальных участков полиномами низкой степени. В MATLAB реализован функцией sgolayfilt из пакета Signal Processing Toolbox. Основные параметры: порядок полинома (обычно 2–4) и длина окна (нечётное число, кратное 5–25 точкам). Например, для данных с шумом и резкими выбросами оптимально использовать окно 11 точек и полином 3-го порядка: y_smooth = sgolayfilt(y, 3, 11). Фильтр эффективен для сигналов с высокочастотным шумом, но не подходит для данных с разрывами.
Отличие от скользящего среднего – сохранение амплитуды пиков. При сглаживании ЭКГ-сигналов фильтр Савицкого-Голея с окном 21 и полиномом 2-го порядка снижает шум на 40–60% без искажения R-зубцов. Для сравнения: скользящее среднее с тем же окном уменьшает амплитуду пиков на 15–25%. Критерий выбора параметров: окно должно быть шире характерных особенностей сигнала, но уже его общей длины. При обработке спектров рекомендуется начинать с окна 5–7 точек и полинома 2-го порядка, увеличивая параметры до достижения баланса между шумоподавлением и потерей деталей.
Для неравномерных данных фильтр применяют с предварительной интерполяцией. Пример: если временные метки неравномерны, используйте interp1 для приведения к равномерной сетке перед сглаживанием. Альтернатива – функция sgolay, возвращающая коэффициенты фильтра для последующего применения через conv. Это полезно при работе с потоковыми данными, где требуется минимизировать задержку: b = sgolay(3, 11); y_smooth = conv(y, b((size(b,1)+1)/2,:), 'same'). Задержка фильтра составляет (окно-1)/2 точек, что критично для систем реального времени.
Ограничения метода: чувствительность к выбросам и необходимость подбора параметров. При наличии импульсных помех рекомендуется предварительная медианная фильтрация (medfilt1) с окном 3–5 точек. Для автоматического подбора параметров используйте кросс-валидацию: разделите данные на обучающую и тестовую выборки, минимизируя среднеквадратичную ошибку на тестовой части. В MATLAB это реализуется через crossval или ручной перебор параметров с оценкой immse.
Пример обработки реальных данных: сглаживание кривой титрования с шумом 5% от амплитуды. Параметры фильтра – окно 15, полином 3-го порядка – снижают шум на 70% при сохранении точки эквивалентности с погрешностью ±0.2%. Для визуализации используйте plot(x, y, 'b:', x, y_smooth, 'r-', 'LineWidth', 1.5), где пунктирная линия – исходные данные, сплошная – сглаженные. При публикации результатов указывайте параметры фильтра для воспроизводимости.
Работа с функцией `lowess` для локального регрессионного сглаживания

Функция `lowess` в MATLAB реализует метод локально взвешенного сглаживания (LOESS/LOWESS), адаптируясь к нелинейным зависимостям без предварительного задания модели. По умолчанию использует полиномы первой степени и треугольное ядро для взвешивания точек в скользящем окне, ширина которого задаётся параметром `span` (доля от общего числа точек, обычно 0.2–0.5). Для данных с резкими выбросами рекомендуется включать параметр `’robust’`, который автоматически снижает вес аномальных значений за 2–3 итерации перевзвешивания. Пример вызова:
smoothed = lowess(x, y, 0.3, 'robust');– сглаживание с окном 30% и робастной коррекцией.smoothed = lowess(x, y, 0.1);– агрессивное сглаживание (окно 10%) для шумных сигналов.
Метод чувствителен к выбору `span`: слишком малые значения (<0.1) приводят к переобучению на шуме, большие (>0.5) – к потере локальных особенностей. Для временных рядов с неравномерным шагом по оси X используйте предварительную интерполяцию или функцию `loess` (вариант с квадратичными полиномами), которая лучше сохраняет экстремумы.
При работе с многомерными данными `lowess` применяется к каждой переменной отдельно, но для корректного сглаживания требуется предварительная нормализация (например, zscore). Для визуализации результатов используйте plot(x, y, '.', x, smoothed, '-', 'LineWidth', 1.5), где исходные данные отображаются точками, а сглаженная кривая – линией. В случае высокочастотных сигналов комбинируйте `lowess` с фильтрацией (например, smoothdata с методом `’movmean’`), чтобы устранить высокочастотный шум перед локальным сглаживанием.
Настройка параметров сглаживания в `fit` для аппроксимации данных
При работе с неравномерно распределёнными данными метод `lowess` с параметром `’Robust’` (значение `’on’`) автоматически снижает вес выбросов, используя итеративное взвешивание. Это полезно для данных с резкими скачками, например, в сигналах с импульсными помехами. Для контроля качества сглаживания используйте `gof` (goodness-of-fit), сравнивая остатки и коэффициент детерминации R². Если R² < 0.8, попробуйте уменьшить `SmoothingParam` для `smoothingspline` или увеличить `Span` для `lowess`.
Для временных рядов с периодичностью эффективен метод `fourier` в сочетании с `fit`. Задайте количество гармоник `n` (например, `fit(x, y, ‘fourier2’)` для двух гармоник), чтобы сохранить сезонные колебания, избегая избыточного сглаживания. При высокой частоте дискретизации используйте предварительную фильтрацию данных функцией `smoothdata` с методом `’movmean’` или `’gaussian’`, чтобы снизить шум перед аппроксимацией.
Сравнение методов сглаживания: когда использовать каждый из них

Выбор метода сглаживания зависит от характера данных, уровня шума и целей анализа. MATLAB предлагает инструменты с разными подходами: от простых скользящих средних до адаптивных фильтров. Ниже приведены ключевые сценарии применения.
Скользящее среднее (movmean) эффективно для данных с равномерным шумом и низкой частотой изменений. Оптимально при окне шириной 3–10 точек для временных рядов с шагом дискретизации ≤10 Гц. Пример: сглаживание показаний датчиков температуры с частотой 1 Гц. Недостаток – искажение резких переходов (например, фронтов сигнала).
- Используйте для: предварительной обработки, удаления высокочастотного шума.
- Избегайте при: данных с резкими скачками или неравномерным шагом.
Медианная фильтрация (medfilt1) незаменима для подавления импульсных помех (выбросов). Работает с окном 3–7 точек, сохраняя локальные экстремумы. Пример: очистка ЭКГ-сигналов от артефактов движения. В отличие от скользящего среднего, не размывает фронты, но менее эффективна против гауссова шума.
Для данных с переменной частотой шума подходит адаптивная фильтрация (например, фильтр Калмана). MATLAB реализует её через kalman или adaptfilt. Преимущество – динамическая подстройка параметров. Пример: обработка GPS-треков с меняющейся точностью. Требует задания модели шума, что усложняет настройку.
- Оцените спектр шума: для белого шума – скользящее среднее, для импульсного – медианный фильтр.
- Проверьте наличие трендов: при линейных трендах используйте
smoothdataс методом'loess'. - Для нестационарных данных: адаптивные методы или вейвлет-сглаживание (
wdenoise).
Локальная регрессия (loess/lowess) в smoothdata справляется с нелинейными трендами. Параметр 'Span' (0.1–0.5) регулирует степень сглаживания: меньшие значения сохраняют детали, большие – убирают шум. Пример: анализ сезонных колебаний в экономических данных. Не подходит для данных с высокой частотой дискретизации (>1 кГц).
Для сигналов с известной частотной структурой (например, аудио) применяйте фильтры Баттерворта или Чебышёва (butter, cheby1). Позволяют точно настраивать полосу пропускания. Пример: удаление сетевых наводок (50/60 Гц) из биомедицинских сигналов. Требуют знания частотных характеристик шума.
Вейвлет-сглаживание (wdenoise) превосходит другие методы при нестационарных сигналах с меняющейся частотой. Параметры: тип вейвлета ('sym4', 'db4') и уровень разложения (3–5). Пример: анализ вибраций механизмов с переменной скоростью вращения. Вычислительно сложнее, но сохраняет локальные особенности.
Рекомендации по выбору:
- Шум равномерный, данные стационарные → скользящее среднее или фильтр Баттерворта.
- Импульсные помехи → медианная фильтрация.
- Нелинейные тренды → loess/lowess.
- Нестационарные сигналы → вейвлет-сглаживание или адаптивные фильтры.
- Высокая частота дискретизации (>1 кГц) → фильтры с конечной импульсной характеристикой (FIR).
