Difference between revisions of "Filtre"

From RoboWiki
Jump to: navigation, search
(Príklad použitia)
 
(11 intermediate revisions by the same user not shown)
Line 4: Line 4:
  
 
== Moving Average Filter ==
 
== Moving Average Filter ==
 +
 +
== Plávajúci priemer ==
 +
 +
<source lang="octave">
 +
% Funkcia pocita plavajuci priemer nad vektorom
 +
%
 +
% Verzia 0.2 doplneny help
 +
% Verzia 0.1 prvy pokus 5. 6. 2008 Richard Balogh
 +
 +
 +
function y = movingaverage (x, M)
 +
 +
% MOVINGAVERAGE Vypocita plavajuci priemer dlzky M na vektore x
 +
%
 +
%  x je vstupny vektor, ktory filtrujeme
 +
%  M je rad filtra, kolko clenov priemerujeme
 +
 +
y=[zeros(1,M-1) x];    % predlzime vektor o M-1 nul na zaciatku
 +
                        % aby sa aj prva hodnota zaratala do priemeru
 +
for i=1 : length(x)
 +
  y(i) = sum( y( i : (i+M-1) ) );      % spocitavame M-tice
 +
endfor
 +
 
 +
y=y/M;                                % napokon to vydelime
 +
 +
y=y(1:length(x));                      % a vektor zasa skratime o ten
 +
                                        % pridavok, lenze na konci
 +
 +
endfunction
 +
 +
</source>
 +
 +
'''Download:''' [[Media:movingaverage.m|movingaverage.m]]
 +
 +
=== Príklad použitia ===
 +
 +
% Priklad na pouzivanie MA filtra:
 +
 +
SignalSinus=sin(linspace(1,6*pi,300))
 +
 
 +
 +
% Najprv sa pozrime, ako poskodi MA filter povodny harmonicky
 +
% signal pri roznych velkostiach okienka:
 +
 +
plot(SignalSinus);  hold on;
 +
plot(movingaverage(SignalSinus,5));
 +
plot(movingaverage(SignalSinus,25));
 +
plot(movingaverage(SignalSinus,100));
 +
 +
 +
% Teraz uz naozaj ideme filtrovat. Vidno, ze ak jed MA filter
 +
% normalny cisty signal mierne tlmi, tuto sa to neprejavi, pretoze
 +
% sum niektore hodnoty rozhodi aj smerom nahor, aj nadol. Takze
 +
% vyfiltrovany sinus je niekedy aj vacsi ako povodny...
 +
 +
clg;
 +
 +
noise    = 0 + 0.1 * randn(size(SignalSinus)); % \mu = 0, \sigma = 0.1
 +
 +
plot(SignalSinus+noise); hold on;
 +
plot(movingaverage(SignalSinus+noise,10),"r");
 +
plot(SignalSinus,"g");
 +
 +
 +
 +
% Teraz ideme filtrovat realne data z teplomera:
 +
 +
clg;
 +
data; % nacita vektor temperature s teplotami:
 +
 +
 +
t1 = movingaverage(temperature(:,2)',10);  % skus rozlicne M = 10, 30, 100
 +
plot(t1);
 +
hold on;
 +
plot(temperature(:,2),"g");
 +
 +
'''Download:''' &nbsp; [[Image:Mfile_icon.png]]
 +
* [[Media:MAexample.m|MAexample.m]]
 +
* [[Media:data.m|data.m]]
 +
 +
== Domáca úloha ==
 +
 +
Stiahnite si zo stránky [[Signály|o signáloch]] m-file s [[Media:Teplota.m|nameranými teplotami]]
 +
a [[Media:NoiseA4_44k.wav|zašumený tón A4]]. Vyskúšajte plávajúci priemer na všetkých signáloch a pohrajte
 +
sa s veľkosťou okna M.
 +
 +
Keď bude hotovo, pošlite mi:
 +
 +
* obrázok demonštrujúci nevhodnú veľkosť M pre nezašumený sínus 440 Hz,
 +
* obrázok vyfiltrovanej teploty a veľkosť použitého okna,
 +
* vyfiltorvaný .wav s tónom A4 a veľkosť použitého okna.
 +
 +
 +
 +
== Frekvenčné charakteristiky ==
  
  
Line 10: Line 105:
  
 
[[Image:MA-FreqChar.jpg]]
 
[[Image:MA-FreqChar.jpg]]
 +
 +
[[Category:DSP]]

Latest revision as of 14:06, 19 June 2008


Moving Average Filter

Plávajúci priemer

% Funkcia pocita plavajuci priemer nad vektorom
% 
% Verzia 0.2 doplneny help
% Verzia 0.1 prvy pokus 5. 6. 2008 Richard Balogh 

 
function y = movingaverage (x, M)

% MOVINGAVERAGE Vypocita plavajuci priemer dlzky M na vektore x 
%
%  x je vstupny vektor, ktory filtrujeme
%  M je rad filtra, kolko clenov priemerujeme
 
 y=[zeros(1,M-1) x];     % predlzime vektor o M-1 nul na zaciatku
                         % aby sa aj prva hodnota zaratala do priemeru
 for i=1 : length(x)
  y(i) = sum( y( i : (i+M-1) ) );       % spocitavame M-tice
 endfor
  
 y=y/M;                                 % napokon to vydelime
 
 y=y(1:length(x));                      % a vektor zasa skratime o ten 
                                        % pridavok, lenze na konci
 
 endfunction

Download: movingaverage.m

Príklad použitia

% Priklad na pouzivanie MA filtra:

SignalSinus=sin(linspace(1,6*pi,300))
 

% Najprv sa pozrime, ako poskodi MA filter povodny harmonicky
% signal pri roznych velkostiach okienka:

plot(SignalSinus);  hold on;
plot(movingaverage(SignalSinus,5));
plot(movingaverage(SignalSinus,25));
plot(movingaverage(SignalSinus,100));


% Teraz uz naozaj ideme filtrovat. Vidno, ze ak jed MA filter
% normalny cisty signal mierne tlmi, tuto sa to neprejavi, pretoze
% sum niektore hodnoty rozhodi aj smerom nahor, aj nadol. Takze
% vyfiltrovany sinus je niekedy aj vacsi ako povodny... 

clg;

noise    = 0 + 0.1 * randn(size(SignalSinus)); % \mu = 0, \sigma = 0.1

plot(SignalSinus+noise); hold on;
plot(movingaverage(SignalSinus+noise,10),"r");
plot(SignalSinus,"g");



% Teraz ideme filtrovat realne data z teplomera:

clg;
data; % nacita vektor temperature s teplotami:


t1 = movingaverage(temperature(:,2)',10);  % skus rozlicne M = 10, 30, 100
plot(t1);
hold on;
plot(temperature(:,2),"g");

Download:   Mfile icon.png

Domáca úloha

Stiahnite si zo stránky o signáloch m-file s nameranými teplotami a zašumený tón A4. Vyskúšajte plávajúci priemer na všetkých signáloch a pohrajte sa s veľkosťou okna M.

Keď bude hotovo, pošlite mi:

  • obrázok demonštrujúci nevhodnú veľkosť M pre nezašumený sínus 440 Hz,
  • obrázok vyfiltrovanej teploty a veľkosť použitého okna,
  • vyfiltorvaný .wav s tónom A4 a veľkosť použitého okna.


Frekvenčné charakteristiky

MA-TimeChar.jpg


MA-FreqChar.jpg