how to filter without a for loop (first order filter)
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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
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.
Réponse acceptée
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
le 8 Déc 2018
RPMFiltConstant is equal to Tsimpling/(Tsimpling+tau)?
what is [0.02, 0], [1, -1]?
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
Plus de réponses (0)
Voir également
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!