Lowpass Filter with Linear Units

조회 수: 11 (최근 30일)
Shaun Gair
Shaun Gair 2017년 8월 30일
댓글: Star Strider 2017년 8월 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