Lowpass Filter with Linear Units

3 visualizaciones (últimos 30 días)
Shaun Gair
Shaun Gair el 30 de Ag. de 2017
Comentada: Star Strider el 30 de Ag. de 2017
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.

Respuesta aceptada

Star Strider
Star Strider el 30 de Ag. de 2017
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.
  2 comentarios
Shaun Gair
Shaun Gair el 30 de Ag. de 2017
Editada: Shaun Gair el 30 de Ag. de 2017
Thanks for such a detailed answer. Unfortunately, I'm getting an error.
Error using cheb2ap
Expected N to be integer-valued.
Error in cheb2ap (line 20)
validateattributes(n,{'numeric'},{'scalar','integer','positive'},'cheb2ap','N');
Error in cheby2 (line 95)
[z,p,k] = cheb2ap(n, r);
I'm not sure at all where this would be coming from.
EDIT: I sorted that out, the usual typo that caused bunch of values to remain NaN. Now, when I run the signal through the filter...
disp_filt = filtfilt(soslp, glp, signal); % Filter Signal
All I get back is a vector that same size full of NaN values. Trying to debug it now.
Star Strider
Star Strider el 30 de Ag. de 2017
My pleasure.
The vector of NaN values usually results from at least one value in the original signal vector being NaN.
There are several options to remove the NaN values, depending on what you want to do. One option is to set them to the mean of the signal (using mean with the 'omitnan' option). A more preferable option is to interpolate them if they are isolated.
I usually eliminate them from the signal and time vectors first, then interpolate them to the original time vector. The best function for this in a signal processing context is the Signal Processing Toolbox resample function, since it incorporates an anti-aliasing filter.
It is important to retain the same signal length as the original time vector, and preferably to have a continuous and regularly-sampled signal, since discrete filters assume this in their design.

Iniciar sesión para comentar.

Más respuestas (0)

Community Treasure Hunt

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

Start Hunting!

Translated by