Removing noise from a sine wave

Illustration
Mikaela_sf - 2021-03-04T13:50:54+00:00
Question: Removing noise from a sine wave

Hello, I have two sets of measurement data (sine wave of 10 = Hz and fs = 2048 Hz) with lots of noise. I tried to filter them using a butterworth lowpass filter using filtfilt function.   Unfortunately, the filtered signal is not a pure sine wave and hence i couldn't use them further.   Can anyone guide me how exactly to process this signal?   PS: Can i add .fig to my post?

Expert Answer

Profile picture of Neeta Dsouza Neeta Dsouza answered . 2025-11-20

You might try the Savitzky Golay filter, in the Signal Processing  Toolbox. It fits a polynomial to the signal in a sliding window.
 
My demo below is for an  image but you could easily adapt it to a 1D signal. After all, an image is just a bunch of 1D signals stacked on top of each other (each row or column could be considered a 1D signal). That's what I do, just extract a row or column and call sgolayfilt() on each row or column.
 
 
% Filter using Savitzky-Golay filtering.
% By Image Analyst
% Change the current folder to the folder of this m-file.
if(~isdeployed)
  cd(fileparts(which(mfilename)));
end
clc;  % Clear command window.
clear;  % Delete all variables.
close all;  % Close all figure windows except those created by imtool.
imtool close all;  % Close all figure windows created by imtool.
workspace;  % Make sure the workspace panel is showing.
fontSize = 14;
% Read in standard MATLAB gray scale demo image.
% imageArray = imread('football.jpg');
imageArray = imread('cameraman.tif');
imageArray = double(imageArray);
[rows columns numberOfColorBands] = size(imageArray);
subplot(2, 2, 1);
imshow(imageArray, [0 255]);
title('Original Grayscale Image', 'FontSize', fontSize);
set(gcf, 'Position', get(0,'Screensize')); % Enlarge figure to full screen.
set(gcf,'name','Savitzky-Golay Filter Image Analysis Demo','numbertitle','off') 

% Apply the Savitzky-Golay filter.
% First apply it in the vertical (row) direction.
k = 1; % Order of the polynomial
windowSize = 25;
verticallySmoothedImage = sgolayfilt(imageArray, k, windowSize, [], 1);
subplot(2, 2, 2);
imshow(verticallySmoothedImage, [0 255]);
title('Savitzky-Golay filtered in the vertical direction only', 'FontSize', fontSize);

% Apply the Savitzky-Golay filter.
% First apply it in the vertical (row) direction.
k = 1; % Order of the polynomial
windowSize = 25;
horizontallySmoothedImage = sgolayfilt(imageArray, k, windowSize, [], 2);
subplot(2, 2, 3);
imshow(horizontallySmoothedImage, [0 255]);
title('Savitzky-Golay filtered in the horizontal direction only', 'FontSize', fontSize);

doublySmoothedImage = sgolayfilt(verticallySmoothedImage, k, windowSize, [], 2);
subplot(2, 2, 4);
imshow(doublySmoothedImage, [0 255]);
title('Savitzky-Golay filtered in both directions', 'FontSize', fontSize);


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!