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?
Thanks a lot, Sathya

 Accepted Answer

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);

2 Comments

Thanks a lot for your response. I am extremely sorry to mention that the normal butterworth lowpass using 'filtfilt' function works fine for the first set of data(i.e i get a proper sinusiodal signal). The problem is only with the second set.
The filter that you suggested smoothens the signal but i am still not able to get a sine wave. These two signals have to be subtracted finally. As a result it would rather be better if the filtered signal from the second set is also a sine wave.
I also tried to use PSD estimate to find out the peaks at specific frequencies so that i can filter them out,but i get a wide range of Power distribution.
It would be really helpful if i could get any suggestions.
Thank you again.
As you know, the sine wave can be estimated as a Taylor series so with enough terms and the proper window size in the Savitzky-Golay filter you should be able to get a reasonable sine wave out. Since you seem to know what you want, just create it. Your PSD method should also work. Of course you'll get a wide distribution of power at various frequencies - you know this already because you know you have a noisy signal. But picking out the dominant frequency should be easy and then you just use sine() to reconstruct a signal at that frequency. I can't tell if you did that and it worked or didn't work for some reason. Is this a homework problem?

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!