I'm struggling to design a lowpass filter for data that is in a linear unit, not decibels. It's displacement data measured directly by a potentiometer. I'd like to remove noise above approximately 250hz, but I'll need to play around with that number I'm sure. The data is in a vector. I don't understand how all the different parameters work, like filter order, ripple, etc. Been frustrating myself all morning trying to sort it out. Any help is more than welcome.
Prashant Kumar answered .
2025-11-20
signal = ...; % Signal Vector tv = ...; % Time Vector Ts = mean(diff(tv)); % Sampling Interval Fs = 1/Ts; % Sampling Frequency (Hz) Fn = Fs/2; % Nyquist Frequency (Hz) Wp = 250/Fn; % Passband Frequency (Normalised) Ws = 252/Fn; % Stopband Frequency (Normalised) Rp = 1; % Passband Ripple (dB) Rs = 50; % Stopband Ripple (dB) [n,Ws] = cheb2ord(Wp,Ws,Rp,Rs); % Filter Order [z,p,k] = cheby2(n,Rs,Ws); % Filter Design [soslp,glp] = zp2sos(z,p,k); % Convert To Second-Order-Section For Stability figure(3) freqz(soslp, 2^16, Fs) % Filter Bode Plot filtered_signal = filtfilt(soslp, glp, signal); % Filter Signal
Note — Your sampling frequency ‘Fs’ must be at least 550 Hz for this filter to work. It has a passband ripple of 1 dB (that is irrelevant here with a Chebyshev Type II filter) and a stopband attenuation of 50 dB. Change those as necessary.