MATLAB „s filtfilt
face o filtrare înainte-înapoi, adică filtrează, inversează semnalul, filtrează din nou și apoi inversează din nou. Se pare că acest lucru este făcut pentru a reduce decalajele de fază? într-o creștere eficientă a ordinii filtrelor).
Ar fi preferabil să utilizați întotdeauna filtfilt
în loc de filter
( adică, doar filtrare directă)? Există aplicații în care este necesar să se utilizeze acest lucru și unde nu ar trebui să fie folosit?
Comentarii
- Nu utilizați ' nu utilizați filtrarea în fază zero pentru audio, deoarece provoacă " pre-sonerie " care sună ciudat. Filtrarea în fază minimă este mai naturală. ccrma.stanford.edu/~jos/filters/Linear_Phase_Really_Ideal.html
Răspuns
Cel mai bine îl puteți privi în domeniul frecvenței. Dacă $ x [n] $ este secvența de intrare și $ h [n] $ este răspunsul la impuls al filtrului, atunci rezultatul primei treceri a filtrului este
$$ X (e ^ {j \ omega}) H (e ^ {j \ omega}) $$
cu $ X (e ^ {j \ omega}) $ și $ H (e ^ {j \ omega}) $ Transformate Fourier de $ x [n] $ și respectiv $ h [n] $. Inversarea timpului corespunde înlocuirii $ \ omega $ cu $ – \ omega $ în domeniul frecvenței, deci după inversarea timpului obținem
$$ X (e ^ {- j \ omega}) H (e ^ {- j \ omega}) $$
A doua trecere a filtrului corespunde unei alte înmulțiri cu $ H (e ^ {j \ omega}) $:
$$ X (e ^ {- j \ omega}) H (e ^ {j \ omega}) H (e ^ {- j \ omega}) $ $
care după inversarea timpului oferă în sfârșit spectrul semnalului de ieșire
$$ Y (e ^ {j \ omega}) = X (e ^ {j \ omega }) H (e ^ {j \ omega}) H (e ^ {- j \ omega}) = X (e ^ {j \ omega}) | H (e ^ {j \ omega}) | ^ 2 \ tag {1} $$
deoarece pentru coeficienții de filtrare cu valoare reală avem $ H (e ^ {- j \ omega}) = H ^ {*} (e ^ {j \ omega}) $. Ecuația (1) arată că spectrul de ieșire este obținut prin filtrarea cu un filtru cu răspuns de frecvență $ | H (e ^ {j \ omega}) | ^ 2 $, whi ch are o valoare pur reală, adică faza sa este zero și, prin urmare, nu există distorsiuni de fază.
Aceasta este teoria. În procesarea în timp real, desigur, există o întârziere destul de mare, deoarece inversarea timpului funcționează numai dacă permiteți o latență corespunzătoare lungimii blocului de intrare. Dar acest lucru nu schimbă faptul că nu există distorsiuni de fază, este doar o întârziere suplimentară a datelor de ieșire. Pentru filtrarea FIR, această abordare nu este utilă mai ales, deoarece la fel de bine ați putea defini un nou filtru $ \ hat {h } [n] = h [n] * h [-n] $ și obțineți același rezultat cu filtrarea obișnuită. Este mai interesant să utilizați această metodă cu filtre IIR, deoarece acestea nu pot avea faza zero (sau faza liniară, adică o întârziere pură).
În concluzie:
-
dacă aveți sau aveți nevoie de un filtru IIR și doriți o distorsiune de fază zero, ȘI întârzierea procesării nu este o problemă, atunci această metodă este utilă
-
dacă întârzierea procesării este o problemă, nu trebuie să o utilizați
-
dacă aveți un filtru FIR , puteți calcula cu ușurință un nou răspuns de filtrare FIR care este echivalent cu utilizarea acestei metode. Rețineți că cu filtrele FIR se poate realiza întotdeauna o fază exact liniară.
Comentarii
- Am creat o etichetă numită
maximum-aposteriori-estimation
. Ați putea să-l redenumiți înmaximum-a-posteriori-estimation
? Din greșeală am uitat-
dupăa
. Mulțumesc.
Răspunde
Am găsit acest videoclip să fie foarte, foarte util (se explică răspunsul lui Matt).
Iată câteva idei cheie din videoclip:
- Faza zero va nu va avea nicio distorsiune de fază, dar va avea ca rezultat un filtru non-cauzal. Aceasta înseamnă că dacă datele sunt filtrate pe măsură ce sunt colectate, aceasta nu va fi o opțiune (valabilă doar pentru datele stocate pe care le putem procesa ulterior) .
- Când implementați un filtru non-cauzal, tranzitorii se estompează înainte și înapoi (de exemplu, dacă dorim o ondulare de 2 dB, faptul faptul că vom „face o alergare înainte și înapoi folosind filtrul înseamnă că vom dori ca fiecare dintre acestea să aibă 1dB).
- Folosește proprietatea de inversare a timpului transformatei Fourier în timp discret.
- Răspunsul efectiv în frecvență cauzat de FILTFILT este magnitudinea celui într-o direcție, pătrat. Vă luați semnalul de intrare,
x[n]
, îl filtrați, inversați rezultatul, îl filtrați din nou și îl inversați din nou (pasul de inversare a timpului necesită ca toate datele să fie disponibile).