Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Dec 2004

Digitala filter

Hej,

Tänkte kolla om någon av erfarenhet av olika typer av digitala filter. Jag har data som behöver utjämnas för att bland annat kunna hitta lokala minima/maxima samt lite annat. Exempel på hur en kurva kan se ut:

Tanken är att göra detta i matlab.

Jag har läst lite om olika filter, t.e.x. Savitzky-Golay, Nyquist, Moving average etc. Har även läst att man kan använda Fourier transform dock förstår jag på vilket sätt man filtrerar datan efter själva transformeringen. Problemet är inte hur jag implementerar dessa filter (förutom Fourier då); det kan enkelt göras i matlab. Däremot har jag ingen aning om vad jag sysslar med, och då jag inte vill förstöra min data allt för mycket så undrar jag helt enkelt vad för typ av filter som skulle kunna vara mest skonsamt för data av den typen som syns på bilden, samt (om vi håller oss matlab-funktioner) vad de olika parametrarna betyder, t.e.x. för Savitzy-Golay: vad innebär polynomial order och frame size (k och f) och hur vet man vad vad dessa värden ska vara?

Tack på förhand.

Intel 4670K@4.4GHz|Asus Z87M-PLUS|MSI GTX970|Crucial Ballistix Sport 2x4 GB|Fractal Design Arc Mini R2

Trädvy Permalänk
Entusiast
Plats
Stockholm
Registrerad
Jul 2001

Jag antar att "polynomial order" betyder precis samma sak som i andra sammanhang, nämligen vilken grad (order) av polynom filtret använder sig. Alltså, om k = 1 används räta linjens ekvation y=kx+m, om k = 2 används ett andragradspolynom, y=ax²+bx+c, osv.

Högre ordning (grad/order) ger bättre passning till befintliga punkter, men inte nödvändigtvis bättre interpolering. Det är lätt att lura sig själv och inte inse att ett "högt" polynom svänger som attan mellan punkterna. Därför är det lämpligt att plotta polynomet mer finkornigt än datapunkterna.

Simpelt är oftast bäst. Där "moving average" verkar förnuftigt passar ofta ett på engelska s.k. "single pole low-pass filter" minst lika bra och kräver mindre minne och beräkningar. Det gäller bara att leka med koefficienterna. "Single pole low-pass"-filter är av formen y1 = y0 + f(data - y0) där y0 är föregående värde och y1 är det man räknar ur (som blir y0 i nästa steg. Egentligen borde jag skriva yn=yn-1+..., men det ser konstigt ut när jag inte kan skriva nedsänkta index).

"f(x)" är en funktion som ofta bara är en förstagradare med m=0 (alltså y=kx) och k är då den s.k. "filter fraction". "k" bestämmer alltså hur mycket det nya värdet påverkas av aktuellt värde.

Det kanske är lite lättare att förstå om jag skriver nästa=(föregående) + f*(data - föregående) och "f" då är "filter fraction".

Men rent spontant ser din kurva ut som något sigmoid-liknande. Det finns säkert filter speciellt anpassade till sigmoida kurvor, vad vet jag. Hur skulle en idealt filtrerad kurva se ut?

http://www.theatlantic.com/national/archive/2012/05/how-the-p...
"If there's a simple lesson in all of this, it's that hoaxes tend to thrive in communities which exhibit high levels of trust. But on the Internet, where identities are malleable and uncertain, we all might be well advised to err on the side of skepticism."

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Dec 2004

Hej! Tack för svar.

Kurvan representerar koncentration av gas på y-axeln uppmätt med ett FTIR instrument. Idealt ska kurvan inte svänga alls, men antagligen på grund av "random errors" så avläser detektorn lite olika värden därav bruset. Med andra ord bör medelvärdet av alla punkter (förutom när kurvan dalar) representera det "sanna" y-värdet. Problemet är ju då att man måste hitta brytpunkten, dvs vid vilket x svänger kurvan nedåt? Eftersom bruset verkar mindre när kurvan dalar innebär ju det också att variansen minskar. Så kanske det kan användas som indikator?

Du har rätt angående formen på kurvan, att den ser ut som sigmoid funktion. Eventuellt skulle jag kunna ansätta en sigmoid kurva, t.ex.

och använda icke-linjär regression för att anpassa kurvan till min data? Men jag ska också testa single pole low-pass filter! Tack för hjälpen.

Edit: Jag kanske har missuppfattat det här... Jag vill INTE att kurvan ska svänga. Jag antar att när man pratar om filter av olika slag så syftar man på kurvor som ska svänga, men där amplituden har modifierats av brus? I mitt fall är svängningarna bruset...

Intel 4670K@4.4GHz|Asus Z87M-PLUS|MSI GTX970|Crucial Ballistix Sport 2x4 GB|Fractal Design Arc Mini R2