MATLAB: Lowpass Filter with Linear Units

filterlow passMATLABordersignalsignal processingSignal Processing Toolbox

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.

Best Answer

The ‘decibel’ calculation simply converts amplitude to power, and scales it logarithmically. It is convenient with respect to plotting transfer functions and designing filters, and has no effect at all on the actual signal. If you give the filter your data in ‘linear’ amplitude units, the filtered result will be in the same units.
A prototype filter for your signal would be:
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.