Effacer les filtres
Effacer les filtres

how to filter without a for loop (first order filter)

4 vues (au cours des 30 derniers jours)
Andrew Tilmouth
Andrew Tilmouth le 10 Déc 2017
Modifié(e) : Jan le 8 Déc 2018
Hi for a large vector (361156 points or more) I have this for loop to filter engine speed (RPM), it works fine but it is too slow
for i=1:length(RPM)
RPMFilt(i) = RPM(i) + RPMFilt(i-1) - RPM(i) * RPMFiltConstant
end
where RPMFiltConstant = 0.98 (heavily filtered)
Too avoid the for loop, I guess that I could use the filter function y = filter(b,a,x) (only the matlab filter function, I don't have the DSP or signal processing tool boxes)
But the problem is I am not sure what I should set b and a to in order to achieve the same result as the equation above with 0.98 filter constant, can anyway explain and show how to calculate what b and a should be for different values of RPMFiltConstant between 0 and 1.
thanks
  1 commentaire
Jan
Jan le 10 Déc 2017
Your code does not run: What is RPMFilt(i-1) for i=1 ? Please post the real code, which runs and produces the wanted result.

Connectez-vous pour commenter.

Réponse acceptée

Jan
Jan le 10 Déc 2017
Modifié(e) : Jan le 8 Déc 2018
Your code does not run: What is RPMFilt(i-1) for i=1 ? Please post the real code, which runs and produces the wanted result.
Do you pre-allocate the output?
RPM = rand(1, 361156);
RPMFiltConstant = 0.98;
tic;
RPMFilt = zeros(size(RPM));
RPMFilt(1) = RPM(1); % Or what else?
for i = 2:length(RPM)
RPMFilt(i) = RPM(i) + RPMFilt(i-1) - RPM(i) * RPMFiltConstant;
end
toc
This takes 0.026 sec on my R2016b/64/Win7 system. Not so much. This is a little bit faster:
tic;
b = 1 - RPMFiltConstant;
RPMFilt = zeros(size(RPM));
RPMFilt(1) = RPM(1); % Or what else?
for i = 2:length(RPM)
RPMFilt(i) = b * RPM(i) + RPMFilt(i-1);
end
toc
And with filter:
RPMFilt = [RPM(1), filter([0.02, 0], [1, -1], RPM(2:end), RPM(1))];
  3 commentaires
Lugi Marcato
Lugi Marcato le 8 Déc 2018
RPMFiltConstant is equal to Tsimpling/(Tsimpling+tau)?
what is [0.02, 0], [1, -1]?
Jan
Jan le 8 Déc 2018
Modifié(e) : Jan le 8 Déc 2018
@Lugi: I do not knwo what Tsimpling and tau is.
[0.02, 0], [1, -1] are the filter parameters B and A, which perform the same calculations as the for loop, except for rounding errors:
RPM = rand(1, 361156);
RPMFiltConstant = 0.98;
R1 = zeros(size(RPM));
R1(1) = RPM(1); % Or what else?
for i = 2:length(RPM)
R1(i) = RPM(i) + R1(i-1) - RPM(i) * RPMFiltConstant;
end
R2 = [RPM(1), filter([1-RPMFiltConstant, 0], [1, -1], RPM(2:end), RPM(1))];
max(abs(R1 - R2) ./ abs(R2)) % Relative error: about 1.7763e-15

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by