Filter Selection for Noisy Signal

Hello,
I am filtering a noisy signal that has a carrier frequency of 800 Hz, but was sampled at a very high frequency, ~250 kHz. I generated the following code, and it filters the signal, but produces a start-up transient (which doesn't filter the beginning of the data). It may just be a feature of the first order filter that I am using (which has a tau). Are there any other filters available that could accomplish my goal (filtering all of the data w/o a transient)? I attached 3 pictures: the first is the entire signal (zoomed out); the second is of the start up transient, and the third is of a portion of the signal that shows I am filtering it (at least in the time domain).
Fc = 800; % filter corner (Hz)
Wc = 2*pi*Fc; % filter corner (rad/sec)
tau = 1/Wc; % filter time constant (sec)
% First order lag
% 1
% G(s) = _____________
% tau*s + 1
num = [1];
den = [tau 1];
printsys(num,den); % analog filter
% Data sampled at 249,600 Hz
Ts = 4.0064e-06
% Convert analog filter to digital
[b,a] = c2dm(num,den,Ts);
printsys(b,a,'z');
den = [a(1) a(2)];
num = [b(1) b(2)];
test = filter(num,den,data);
figure; plot(data); hold on; plot(test, 'r')

 Accepted Answer

Star Strider
Star Strider on 26 Mar 2018
If you have the Signal Processing Toolbox, use the filtfilt (link) function instead of filter.

4 Comments

I tried filtfilt and still received an undesirable start up transient. I'm wondering if a higher order filter would address this issue along with the use of filtfilt.
Higher-order filters are usually better. Also, with filtfilt, you can use second-order-section representation, usually more stable. Use the tf2sos function to do that transformation.
C. Robinson
C. Robinson on 27 Mar 2018
Edited: C. Robinson on 27 Mar 2018
When I tried filtfilt before, my input wasn't of type double, and that was the reason for me not getting a desirable response. I attached two plots; the one entitled Filtered Signal 3 displays filter vs. filtfilt, and the one entitled Filtered Signal 4 displays the filtfilt response on top of the noisy signal (no unwanted transient). I was able to do it with a first order filter. Thanks for your help! I really appreciate it.
As always, my pleasure!

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!