Offset in filtered data when using filtfilt() Function

15 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
Paul
Paul on 19 Nov 2022
Hi Kletzi,
It will be easier to get help if you post the full code and data that recreastes the example in your question (or something close to it).
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!