Difference between revisions of "Filtre"
From RoboWiki
(→Príklad použitia) |
|||
(12 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | Java príklady na hrátky so signálmi http://www.dsptutor.freeuk.com/ | + | * Java príklady na hrátky so signálmi http://www.dsptutor.freeuk.com/ |
+ | * Frekvenčná charakteristika: [http://www.phys.unsw.edu.au/jw/hearing.html tester sluchu] | ||
== 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:''' [[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 9: | Line 105: | ||
[[Image:MA-FreqChar.jpg]] | [[Image:MA-FreqChar.jpg]] | ||
+ | |||
+ | [[Category:DSP]] |
Latest revision as of 14:06, 19 June 2008
- Java príklady na hrátky so signálmi http://www.dsptutor.freeuk.com/
- Frekvenčná charakteristika: tester sluchu
Contents
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");
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.