Lowpass Filter with Linear Units

3 次查看(过去 30 天)
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.

采纳的回答

Star Strider
Star Strider 2017-8-30
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 个评论
Shaun Gair
Shaun Gair 2017-8-30
编辑:Shaun Gair 2017-8-30
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 2017-8-30
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.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Multirate Signal Processing 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by