smoothing a graph using matlab

how can I smooth data imported from one column (Excel sheet) using Matlab
how to smooth the corners?

 Risposta accettata

A frequency-selective filter can preseerve the essential shape of the signal, eliminating only the high-frequency oscillations in the ‘valleys’.
Try this —
V1 = readmatrix('https://www.mathworks.com/matlabcentral/answers/uploaded_files/900720/data.xlsx');
L = numel(V1);
t = linspace(0, L-1, L);
Ts = t(2)-t(1);
Fs = 1/Ts;
Fn = Fs/2;
NFFT = 2^nextpow2(L);
FTV1 = fft(V1,NFFT);
Fv = linspace(0, 1, NFFT/2+1)*Fn;
Iv = 1:numel(Fv);
figure
plot(Fv, abs(FTV1(Iv))*2)
grid
xlabel('Frequency')
ylabel('Amplitude')
title('Fourier Transform (Detail)')
xlim([0 0.05])
UpperPassband = 0.023;
V1F = lowpass(V1, UpperPassband, Fs, 'ImpulseResponse','iir');
figure
subplot(2,1,1)
plot(t, V1)
grid
title('Original')
subplot(2,1,2)
plot(t, V1F)
grid
xlabel('Time')
title('Filtered')
Adjust the ‘UpperPassband’ frequency to produce the desired result.
.

2 Commenti

This looks like it maintains the shape of the "good" part better than the Savistky-Golay filter.
I like the sgolayfilt function and use it to filter broadband noise. However, this is band-limited noise (the reason I did the fft was to determine that) so a frequency-selective filter works best in this instance.

Accedi per commentare.

Più risposte (1)

Image Analyst
Image Analyst il 20 Feb 2022

0 voti

You could use sgolayfilt() to fit a sliding window to the data. Window width would be about the width of one of those humps. It looks kind of like a sine or cosine wave thus you can fit it to a 4th or 5th order polynomial. Attach your data if you need more help.

6 Commenti

could you please give me an example how to do this ?
Thanks
Attached is a generic demo I wrote. Experiment around with different parameters. If you need more help, could you attach your actual data. Otherwise could you click the "Accept this answer" link?
Thank you so much
Kindly could you help me to apply this on attached excel file?
I really think you could have done it if you would have tried, but anyway, here is the simple moification I made. I read in your data (instead of creating some) with readmatrix, and I set the window width to 113 and the polynomial order to 5.
% Filter a noisy, 1-D sine wave signal using Savitzky-Golay filtering to reduce the noise.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 25;
% Read in data.
y = readmatrix('data.xlsx')
x = 1 : length(y);
% Plot the noisy signal
subplot(2,1,1);
plot(x, y, 'b-', 'LineWidth', 2);
grid on;
title('Noisy Signal', 'FontSize', fontSize);
xlabel('Index', 'FontSize', fontSize);
ylabel('Value', 'FontSize', fontSize);% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.96]);
% Give a name to the title bar.
set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')
% Now smooth with a Savitzky-Golay sliding polynomial filter
windowWidth = 203-90; % Distance between a couple of peaks.
polynomialOrder = 5;
smoothY = sgolayfilt(y, polynomialOrder, windowWidth);
% Now it's done - it's smoothed. Now plot it.
subplot(2,1,2);
plot(x, smoothY, 'b-', 'LineWidth', 2);
grid on;
caption = sprintf('Smoothed Signal with window width = %d and polynomial order = %d', windowWidth, polynomialOrder);
title(caption, 'FontSize', fontSize);
xlabel('Index', 'FontSize', fontSize);
ylabel('Value', 'FontSize', fontSize);
% Put axis in the middle
ax = gca;
ax.XAxisLocation = 'origin';
Thank you so much
Image Analyst
Image Analyst il 20 Feb 2022
Modificato: Image Analyst il 20 Feb 2022
If it worked, can you click "Accept this answer" for the best answer? Thanks in advance.

Accedi per commentare.

Tag

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by