Offset in filtered data when using filtfilt() Function

10 views (last 30 days)
Hello,
when filtering my data using the filtfilt() Function, I get a offset in the filtered data.Can anyone tell me where this offset could come from and how to get rid of it?
Below is the code I use for filterdesign and actual filtering:
fg = 0.1; % Desired Cutoff frequency
fs = 1/(mean(diff(Time))); % Derive sample frequency fs from Time vector
fc = 2*fg/fs; % Calculate normalized cutoff frequency
d = designfilt("lowpassfir", 'PassbandFrequency', fc, 'StopbandFrequency',fc+0.5*fc) % Filterdesign as lowpass filter
filtered_data = filtfilt(d, unfiltered_data);
figure()
plot(Time, unfiltered_data)
hold on
plot(Time, filtered_data)
legend('unfiltered data', 'filtered data')
The figure below shows the result of some example data.
  2 Comments
Jan
Jan on 19 Nov 2022
Edited: Jan on 19 Nov 2022
@Paul: You can reproduce the effect with dummy data:
fc = 0.4;
d = designfilt("lowpassfir", 'PassbandFrequency', fc, 'StopbandFrequency', 1.5 * fc);
x = rand(1, 200) + 20;
y = filtfilt(d, x);
plot(x, 'b'); hold('on');
plot(y, 'r');

Sign in to comment.

Answers (1)

Paul
Paul on 19 Nov 2022
Thanks @Jan
The filter, d, does not have unity gain at dc.
fc = 0.4;
d = designfilt("lowpassfir", 'PassbandFrequency', fc, 'StopbandFrequency', 1.5 * fc);
dcgain = sum(d.Coefficients)
dcgain = 0.9481
filtfilt attenuates the dc component of x by dcgain^2
(20 + .5)*dcgain^2 % 0.5 is the mean of rand
ans = 18.4273
x = rand(1, 200) + 20;
y = filtfilt(d, x);
plot(x, 'b'); hold('on');
plot(y, 'r');
plot(filtfilt(d,20+0.5+0*x),'g');

Community Treasure Hunt

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

Start Hunting!

Translated by