118 views (last 30 days)

Star Strider
on 20 Jan 2021

I am not certain what result you want.

Try this:

D1 = readmatrix('SensorValues.xlsx');

s = D1; % Signal Vector

L = size(s,1); % Data Length

Fs = 1; % <— Need Actual Sampling Frequency Here!

Ts = 1/Fs; % Sampling Interval

Fn = Fs/2; % Nyquist Frequency

t = linspace(0, L, L)*Ts; % Time Vector

sc = s - mean(s); % Subtract Mean (Makes Other Peaks More Prominent)

FTs = fft(sc)/L; % Normalised Fourier Transform

Fv = linspace(0, 1, fix(L/2)+1)*Fn; % Frequency Vector

Iv = 1:numel(Fv); % Index Vector (One-Sided Fourier Transform)

figure

plot(Fv, abs(FTs(Iv))*2)

grid

xlim([0 0.001])

title('Fourier Transform')

xlabel('Frequency (Hz)')

ylabel('Amplitude')

Wp = [0.001 0.075]/Fn; % Passband Frequency (Normalised)

Ws = [0.9 1.1].*Wp; % Stopband Frequency (Normalised)

Rp = 1; % Passband Ripple

Rs = 60; % Passband Ripple (Attenuation)

[n,Wp] = ellipord(Wp,Ws,Rp,Rs); % Elliptic Order Calculation

[z,p,k] = ellip(n,Rp,Rs,Wp); % Elliptic Filter Design: Zero-Pole-Gain

[sos,g] = zp2sos(z,p,k); % Second-Order Section For Stability

figure

freqz(sos, 2^20, Fs) % Filter Bode Plot

set(subplot(2,1,1), 'XLim',Wp*Fn.*[0.8 1.2]) % Optional

set(subplot(2,1,2), 'XLim',Wp*Fn.*[0.8 1.2]) % Optional

s_filtered = filtfilt(sos, g, s); % Filter With IIR Filter

figure

plot(t, s)

hold on

plot(t, s_filtered)

hold off

grid

xlabel('Time (Units Estimated)')

ylabel('AMplitude (Units Not Specified)')

legend('Original Signal', 'Bandpass-Filtered Signal', 'Location','W')

producing:

The filter eliminates the d-c (constant) offset, and a bit of the high-frequency noise. Adjust the upper limit of the ‘Wp’ vector to get the result you want.

Note — With the actual sampling frequency, it will be necessary to adjust the limits of ‘Wp’ and the xlim values of the Fourier Transform plot.

Star Strider
on 21 Jan 2021

Spikes and other discontinuities can be difficult to deal with.

One option:

D1 = readmatrix('SensorValues.xlsx');

s = D1; % Signal Vector

L = size(s,1); % Data Length

Fs = 1; % <— Need Actual Sampling Frequency Here!

Ts = 1/Fs; % Sampling Interval

Fn = Fs/2; % Nyquist Frequency

t = linspace(0, L, L)*Ts; % Time Vector

sc = s - mean(s); % Subtract Mean (Makes Other Peaks More Prominent)

FTs = fft(sc)/L; % Normalised Fourier Transform

Fv = linspace(0, 1, fix(L/2)+1)*Fn; % Frequency Vector

Iv = 1:numel(Fv); % Index Vector (One-Sided Fourier Transform)

figure

plot(Fv, abs(FTs(Iv))*2)

grid

xlim([0 0.001])

title('Fourier Transform')

xlabel('Frequency (Hz)')

ylabel('Amplitude')

Wp = [1E-8 1.5E-3]/Fn; % Passband Frequency (Normalised)

Ws = [0.9 1.1].*Wp; % Stopband Frequency (Normalised)

Rp = 1; % Passband Ripple

Rs = 60; % Passband Ripple (Attenuation)

[n,Wp] = ellipord(Wp,Ws,Rp,Rs); % Elliptic Order Calculation

[z,p,k] = ellip(n,Rp,Rs,Wp); % Elliptic Filter Design: Zero-Pole-Gain

[sos,g] = zp2sos(z,p,k); % Second-Order Section For Stability

figure

freqz(sos, 2^20, Fs) % Filter Bode Plot

set(subplot(2,1,1), 'XLim',Wp*Fn.*[0.8 1.2]) % Optional

set(subplot(2,1,2), 'XLim',Wp*Fn.*[0.8 1.2]) % Optional

s_filtered = filtfilt(sos, g, s); % Filter With IIR Filter

s_filtered(s_filtered < -0.5) = nan; % Region = NaN

s_filtered = fillmissing(s_filtered, 'linear'); % Linearly Interpolate

figure

plot(t, s)

hold on

plot(t, s_filtered, '-r', 'LineWidth',1.5)

hold off

grid

xlabel('Time (Units Estimated)')

ylabel('AMplitude (Units Not Specified)')

legend('Original Signal', 'Bandpass-Filtered Signal', 'Location','W')

producing:

The data in the discontinuity region does not appear to be valid, considering the other parts of the signal, so simply eliminating it may be a worthwhile option.

.

Fangjun Jiang
on 19 Jan 2021

In your case, since you have enough data, I think you can use symbol in plot() to remove the "jump".

If your old way is plot(x,y), then you can use plot(x,y,'.')

Matt Gaidica
on 19 Jan 2021

What do you want to do with the data that around the jumps (still referring to my previous figure)? Interpolate it? Maybe you want some type of dynamic detrending, but it still doesn't totally remove the artifact of the jumps. I just loaded your data in A.

y = smoothdata(A,'movmean',100);

close all

figure;

subplot(211);

plot(A);

hold on;

plot(y);

subplot(212);

plot(A-y);

Matt Gaidica
on 21 Jan 2021

Sure thing, sounds like a cool project. Feel free to reach out directly if you need anything!

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

Start Hunting!
## 4 Comments

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/720594-removing-jumps-from-data-when-plotting-a-graph#comment_1271409

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/720594-removing-jumps-from-data-when-plotting-a-graph#comment_1271409

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/720594-removing-jumps-from-data-when-plotting-a-graph#comment_1271479

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/720594-removing-jumps-from-data-when-plotting-a-graph#comment_1271479

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/720594-removing-jumps-from-data-when-plotting-a-graph#comment_1271539

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/720594-removing-jumps-from-data-when-plotting-a-graph#comment_1271539

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/720594-removing-jumps-from-data-when-plotting-a-graph#comment_1273054

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/720594-removing-jumps-from-data-when-plotting-a-graph#comment_1273054

Sign in to comment.