How to smoothen a plot in MATLAB?
Or some form of thresholding so that I can selectively smoothen out the parts that is too bumpy?
I am not sure but can fast-fourier-transform help?
5 Answers 5
If you have the Curve Fitting Toolbox, you can use the smooth function. The default method is a moving average of size 5 (method can be changed). An example:
If not, you can use use your own window function using the filter function from core MATLAB:

A simple (ad hoc) way is to just take a weighted average (tunable by alpha ) at each point with its neighbors:
or some variation thereof. Yes, to be more sophisticated you can Fourier transform your data first, then cut off the high frequencies. Something like:
This cuts out the highest 20 frequencies. Be careful to cut them out symmetrically otherwise the inverse transform is no longer real. You need to carefully choose the cutoff frequency for the right level of smoothing. This is a very simple kind of filtering (box filtering in frequency domain), so you can try gently attenuating high order frequencies if the distortion is unacceptable.
Как сгладить сюжет в MATLAB?

Или какая-то форма пороговой обработки, чтобы я мог выборочно сгладить слишком неровные участки?
5 ответы
Простой (специальный) способ — просто взять средневзвешенное значение (настраивается alpha ) в каждой точке со своими соседями:
или некоторые его вариации. Да, чтобы быть более сложным, вы можете сначала преобразовать данные Фурье, а затем отсечь высокие частоты. Что-то вроде:
Это отсекает 20 самых высоких частот. Будьте осторожны, чтобы вырезать их симметрично, иначе обратное преобразование больше не будет реальным. Вам нужно тщательно выбирать частоту среза для правильного уровня сглаживания. Это очень простой вид фильтрации (блочная фильтрация в частотной области), поэтому вы можете попробовать мягко ослабить частоты высокого порядка, если искажение неприемлемо.
ответ дан 04 окт ’09, 10:10
не должно ли c = ifft (fft (a)) всегда давать c = a? это верно для некоторых случаев, но не для a = [2 3 4 5 6 1 2 4 7 3 3 21 1 4 5 77 3 2 256 3 312 1 5 76 4 3 3 2 6 7 3 3 56 5 645 4 4 4 4 XNUMX] Я получаю некоторые мнимые числа в c. Есть догадки, почему? — Лазер
@eSKay: Это абсолютно верно для меня. Однако из-за округления c может получить небольшую мнимую составляющую. Я исправил приведенный выше код, чтобы он выглядел снаружи ifft, как и должно было быть. — Виктор Лю
Практическая часть
Табличные данные очень часто удобно интерпретировать как некоторую функцию, в частности, полиномиальную или сплайн — гладкую функцию, которая на отрезках области определения равна полиномам определенной степени. Будем различать два критерия приближения табличных функций: интерполирование, при котором аппроксимирующая функция совпадает с табличной в узлах, и сглаживание, основанное на минимизации некоторого критерия, например, суммы квадратов отклонений в узлах. Итак, возникает задача о построении полиномиальной или кусочно-полиномиальной функции для приближения некоторых дискретных данных. Набор вычислительных функций MATLAB содержит функции для решения таких задач, как в случае одномерных, так и многомерных данных. Самым простым способом интерполяции является аппроксимация данных сплайном нулевого порядка (на каждом участке степень полинома равна нулю), при которой значение в каждой промежуточной точке принимается равным ближайшему значению, заданному в таблице. В результате данные приближаются ступенчатой функцией, а само приближение называется интерполяцией по соседним точкам. Линейная интерполяция основана на соединении соседних точек отрезками прямых — табличные данные приближаются ломаной линией (сплайн первого порядка дефекта единица). Для получения более гладкой функции следует применять интерполяцию кубическими сплайнами.
Постановка задачи
Определить по кривой (рис. 1), при б=0° (для оцифровки графиков удобно воспользоваться программой GetData) значение в интервале , и интерполировать полученные данные с помощью кусочно-линейной интерполяцией и кубическим сплайном. Результаты интерполяции представить графически. Определить площадь под кривой численным интегрированием.

Рис. 1. Кривая зависимости безразмерной величины нагрузки от безразмерной деформации
Решение задачи
Схема решения данной задачи в MATLAB состоит из следующих этапов:
1. Определение по кривой при б=0° значений в интервале .
2. Интерполирование полученных данных с помощью кусочно-линейной интерполяции и кубическим сплайном.
3. Построение графиков исходной зависимости и графиков интерполянтов.
4. Определение площади под кривой численным интегрированием (метод трапеций).
Значения в интервале были найдены с помощью оцифровки графика программой GetData:
§ нанесение координатных осей (Команды > Установить систему координат);
§ оцифровка графика (Команды > Авто трассировка линий);
§ удаление ненужных точек (Команды > Ластик точек данных);
§ сохранение массивов точек в файл (Файл > Экспорт данных).
Данные способы интерполяции реализованы в функции interp1. Функция yi = interp1 (x, y, xi) строит интерполирующую кривую для одномерного массива y, заданного на сетке x; выходной массив yi может быть определен на более мелкой сетке xi. Если Y — двумерный массив, то интерполирующая кривая строится для каждого столбца. По умолчанию реализована линейная интерполяция.
Для использования yi = interp1 (x, y, xi, `<метод>») следует задать координаты абсцисс промежуточных точек, в которых вычисляются значения интерполянта, и способ интерполирования:
§ ‘linear’ — линейная интерполяция (применяется по умолчанию, если способ интерполирования не задан);
При линейной интерполяции MATLAB соединяет существующие точки данных прямыми линиями. Использует векторы данных и , чтобы возвратить интерполируемое значение , соответствующее третьему аргументу . Аргументы и должны быть векторами одинаковой длины. Вектор должен содержать вещественные значения, расположенные в порядке возрастания. Эта функция соединяет точки данных отрезками прямых, создавая таким образом ломаную. Интерполируемое значение для конкретного х есть ордината у соответствующей точки ломаной. Для значений , расположенных перед первой точкой в векторе , MATLAB продолжает ломаную прямой линией, проходящей через первые две точки данных. Для значений , расположенных за последней точкой , MATLAB продолжает ломаную прямой линией, проходящей через последние две точки данных. Для получения наилучших результатов должно находится между самыми большими и самыми маленькими значениями — маловероятно, что будут полезны значения, вычисленные для вне этого диапазона.
§ ‘spline’ — интерполяция кубическими сплайнами;
Сплайн-интерполяция используется для представления данных отрезками полиномов невысокой степени — чаще всего третьей. При этом кубическая интерполяция обеспечивает непрерывность первой и второй производных результата интерполяции в узловых точках. Из этого вытекают следующие свойства кубической сплайн-интерполяции:
§ график кусочно-полиномиальной аппроксимирующей функции проходит точно через узловые точки;
§ в узловых точках нет разрывов и резких перегибов функции;
§ благодаря низкой степени полиномов погрешность между узловыми точками обычно достаточно мала;
§ связь между числом узловых точек и степенью полинома отсутствует;
§ поскольку используется множество полиномов, появляется возможность аппроксимации функций с множеством пиков и впадин.
В переводе spline означает «гибкая линейка». График интерполирующей функции при этом виде интерполяции можно уподобить кривой, по которой изгибается гибкая линейка, закрепленная в узловых точках. Сплайн-интерполяция дает неплохие результаты для функций, не имеющих разрывов и резких перегибов. Особенно хорошие результаты получаются для монотонных функций.
Методы линейной и кубической интерполяции реализуются довольно просто; что же касается интерполяции сплайнами, то в этом случае используются вспомогательные функции ppval, mkpp, unmkpp, которые образуют небольшой пакет для работы с кусочно-гладкими полиномами.
Выходным аргументом interp1 является вектор значений интерполянта в промежуточных точках.
Графики в декартовой системе координат строят с помощью команды plot. Команда plot имеет различные формы, связанные с входными параметрами. Результат выводится в специальном окне. Команда plot (x, у, «цвет_стиль_маркер’) — позволяет задавать цвет, стиль линий и маркеры. Аргумент ‘цвет_стиль_маркер» — это строковая константа, составленная из символов цвета, стиля линий и маркеров. Если определить только тип маркеров, но не указать стиль линий, MATLAB выведет на график только маркеры.
Нанесение надписей и сетки на графике:
§ xlabel (‘TEXT’) — маркировка оси х.
§ ylabel (‘TEXT’) — маркировка оси у.
§ legend (‘TEXT1’, ‘TEXT2’, …) — легенда.
Команда grid осуществляет нанесение координатной сетки. По умолчанию на двумерных графиках сетка не наносится. Для задания сетки нужно выполнить команду grid on, а убрать по команде grid off. Команда grid без параметров действует как переключатель.
Добавление кривых на существующий график:
§ hold on — обеспечивает продолжение вывода графиков в текущее окно;
§ hold off — отменяет режим продолжения;
§ hold — работает как переключатель с одного режима на другой.
Интегрирование методом трапеций:
§ I = trapz (x, y)
Функция I = trapz (x, y) вычисляет интеграл от функции y по переменной x, используя метод трапеций. Аргументы x и y могут быть одномерными массивами одинакового размера, либо массив Y может быть двумерным, но тогда должно выполняться условие size (Y, 1) = length(x). В последнем случае вычисляется интеграл для каждого столбца.
Текст файл-программы interpoljacija для решения данной задачи приведен в листинге 1.
Листинг 1. Файл-программа interpoljacija
% заполнение массивов для табличной функции
x = [-0.5 -0.4677 -0.4343 -0.3952 -0.3493 -0.2951 -0.2278 -0.1431 -0.0394 0.0803 0.2099 0.3445 0.4816 0.6225 0.7647 0.9009 1];
y = [16 14.6264 13.2183 11.8263 10.4538 9.1135 7.8345 6.6780 5.7083 4.9382 4.3355 3.8454 3.4550 3.1773 2.9703 2.7792 2.7];
% вывод графика табличной функции маркерами
% задание промежyточныx точек для интерполирования
xi = [x(1):0.1:x (length(x))];
% вычисление кyсочно-линейной фyнкции в промежyточныx точкаx
yline = interp1 (x, y, xi, ‘linear’);
% вычисление кyбического сплайна в промежyточныx точкаx
yspline = interp1 (x, y, xi, ‘spline’);
% для построения графиков в одном окне
% нанесение измерительной сетки
% построение графиков интерполянтов
plot (xi, yline, ‘k-‘, xi, yspline, ‘k — .’)
% нанесение названий координатных осей
legend (‘табличная фyнкция’, ‘линейная (linear)’, ‘кyбический сплайн (spline)’)
y1 = interp1 (x, y, x1, ‘spline’);
% нахождение площади под графиком
интерполяция инженерный сплайн matlab
Выполнение файл-программы interpoljacija приводит к появлению графика, изображенного на рис. 2., отражающего график табличной функции и графики интерполянты. Как видно, интерполяция кубическим сплайном является более точным методом интерполяции, чем кусочно-линейная, вследствие чего график сплайна располагается ближе к графику табличной функции. Также мы нашли площадь под графиком табличной функции: S = 8.1882 (кв. ед.).
Алгоритм сглаживания сигнала (скользящее среднее Matlab)
Я написал простой код, который выполняет алгоритм сглаживания скользящих средних по 3 точкам. Он предназначен для того же базового алгоритма, что и гладкая (. ) функция Matlab, как описано здесь.
Однако результат моего кода сильно отличается от кода Matlab. Трехточечный фильтр Matlab, по-видимому, выполняет гораздо более агрессивное сглаживание.
Вот сравнение зашумленных данных, сглаженных с использованием моего кода (красный) и функции Matlab (синий):

Вот мой код, написанный в форме функции:
Функция Matlab используется следующим образом:
signal = smooth(time, signal, 3, ‘moving’);
Насколько я понимаю, функция Matlab работает так же; это усредняет 3 смежных бункера к одному бинку. Поэтому я ожидал, что оба алгоритма дадут одинаковые результаты.
Итак, в чем причина расхождения? И как я мог настроить свой код для получения тех же результатов?
Мои образцы данных можно найти здесь. Доступ к нему можно получить с помощью:
Вот новый результат (красный график) с использованием поправки Ринкерта:

Одной из причин этого может быть то, что вы частично используете сглаженный сигнал во время сглаживания. В вашем цикле вы сохраняете сглаженное значение в NewSignal(i,:) , и для следующего образца для сглаживания это значение будет вызываться NewSignal(i-1,:) .
Пусть NewSignal будет определяться только исходным signal :
Обновление: чтобы показать, что вышеприведенная функция на самом деле делает то же самое, что и smooth функция Matlab, давайте рассмотрим этот MVCE:
Таким образом, создавая синусоидальную волну, добавьте немного шума и определите абсолютную разницу между двумя методами. Если вы возьмете сумму всех различий, вы увидите, что это в сумме примерно равно 7,5137e-14, что не может объяснить различия, которые вы видите.
Построение сглаженного сигнала (синий оригинал, красный сглаженный):

А затем вычерчиваем разницу между двумя методами:

Как вы можете видеть, разница имеет порядок 1e-16, поэтому на нее влияет относительная точность с плавающей точкой (см. eps ).
Чтобы ответить на ваш вопрос в комментариях: функции filter и smooth выполняют арифметически одинаково (в случае, если они применяются для скользящей средней). однако в начале и в конечных точках существуют особые случаи, которые обрабатываются по-разному. Это также указано в документации по сглаживанию » Из-за того, как сглаживание обрабатывает конечные точки, результат отличается от результата, возвращаемого функцией фильтра «.
Вот вы видите это в примере:

Как вы можете видеть, отфильтрованные данные (красным цветом) представляют собой просто отложенную версию сглаженных данных (пурпурного цвета). Кроме того, они отличаются в начале. Задержка сглаженных данных приводит к тому же сигналу, что и к отфильтрованным данным (кроме начала). Как указал Ринкерт, ваш подход перезаписывает точки данных, к которым вы обращаетесь на следующем шаге. Это другая проблема.
В следующем примере вы увидите, что реализация rinkerts (smooth-rinkert) идентична matlabs smooth , и что ваш подход отличается от обоих из-за перезаписи значений:

Таким образом, ваша функция сильнее передает входной сигнал. (как указано Крисом)