Bewegende Gemiddelde Filter Kern


Die wetenskaplike en ingenieurs Guide to Digital Signal Processing Deur Steven W. Smith, Ph. D. Hoofstuk 15: Moving Gemiddelde filters Familielede van die bewegende gemiddelde filter in 'n perfekte wêreld, sal filter ontwerpers net te doen het met die tyd domein of frekwensiegebied geënkodeerde inligting, maar nooit 'n mengsel van die twee in dieselfde sein. Ongelukkig is daar is 'n paar programme waar beide domeine is gelyktydig belangrik. Byvoorbeeld, televisie seine val in hierdie nare kategorie. Video inligting word geïnkripteer in die tydgebied, dit wil sê die vorm van die golfvorm ooreenstem met die patrone van helderheid in die beeld. Maar tydens die oordrag van die video sein behandel volgens die frekwensie samestelling, soos sy totale bandwydte, hoe die draer golwe vir klank amp kleur bygevoeg, uitskakeling amp herstel van die DC-komponent, ens As 'n voorbeeld, elektromagnetiese interferensie word die beste verstaan ​​word in die frekwensiegebied, selfs al is die seine inligting ingebou in die tydgebied. Byvoorbeeld, kan die temperatuur monitor in 'n wetenskaplike eksperiment word besmet is met 60 hertz van die kraglyne, 30 kHz uit 'n skakel kragbron, of 1320 kHz uit 'n plaaslike AM radiostasie. Familielede van die bewegende gemiddelde filter het 'n beter frekwensiedomein prestasie, en kan nuttig wees in hierdie gemengde domein aansoeke wees. Meervoudige pas bewegende gemiddelde filters behels verby die insetsein deur 'n bewegende gemiddelde filter twee of meer keer. Figuur 15-3a toon die algehele filter kern as gevolg van een, twee en vier passe. Twee passe is gelykstaande aan die gebruik van 'n driehoekige filter kern (n vierkantige filter kern gekonvuleerde met homself). Na vier of meer verby, die ekwivalent filter kern lyk soos 'n Gaussiese (onthou die sentrale limietstelling). Soos getoon in (b), verskeie passe produseer 'n s gevorm stap reaksie, in vergelyking met die reguit lyn van die enkele slaag. Die frekwensie response in (c) en (d) word gegee deur vergelyking. 15-2 met homself vermenigvuldig vir elke slaag. Dit wil sê, elke keer domein konvolusie resultate in 'n vermenigvuldiging van die frekwensie spektrum. Figuur 15-4 toon die frekwensieweergawe van twee ander familielede van die bewegende gemiddelde filter. Wanneer 'n suiwer Gaussiese word gebruik as 'n filter kern, die frekwensieweergawe is ook 'n Gaussiese, soos bespreek in Hoofstuk 11. Die Gaussiese is belangrik, want dit is die impulsrespons van baie natuurlike en mensgemaakte stelsels. Byvoorbeeld, sal 'n kort pols van lig wat 'n lang optiese vesel transmissielyn verlaat as 'n Gaussiese pols, te danke aan die verskillende paaie wat deur die fotone binne die vesel. Die Gaussiese filter kern is ook op groot skaal in beeldverwerking, want dit het 'n unieke eienskappe wat vinnig tweedimensionele convolutions (sien Hoofstuk 24) toelaat. Die tweede frekwensieweergawe in Fig. 15-4 ooreenstem met behulp van 'n Blackman venster as 'n filter kern. (Die venster term het geen betekenis hier is dit net deel van die aanvaarde naam van hierdie kurwe). Die presiese vorm van die venster Blackman word in Hoofstuk 16 (Vgl. 16-2, Fig. 16-2) maar dit lyk baie soos 'n Gaussiese. Hoe is hierdie familie van die bewegende gemiddelde filter beter as die bewegende gemiddelde filter self drie maniere: Eerstens, en belangrikste, hierdie filters het 'n beter stopband attenuasie as die bewegende gemiddelde filter. Tweedens, die filter pitte taps tot 'n kleiner amplitude naby die einde. Onthou dat elke punt in die uitsetsein is 'n geweegde som van 'n groep van die monsters van die insette. As die filter kern goewerneur, is monsters in die insetsein wat verder weg is gegee minder gewig as dié naby. Derde, die stap antwoorde is glad krommes, eerder as om die skielike reguit lyn van die bewegende gemiddelde. Hierdie laaste twee is gewoonlik van beperkte voordeel, maar jy aansoeke waar hulle is ware voordele kan vind. Die bewegende gemiddelde filter en sy familie is almal oor dieselfde op die vermindering van ewekansige geluid terwyl die handhawing van 'n skerp stap reaksie. Die dubbelsinnigheid lê in hoe die risetime van die stap reaksie is gemeet. As die risetime gemeet van 0 tot 100 van die stap, die bewegende gemiddelde filter is die beste wat jy kan doen, soos voorheen aangetoon. In vergelyking, meet die risetime 10-90 maak die venster Blackman beter as die bewegende gemiddelde filter. Die punt is, dit is net teoretiese gekibbel oorweeg hierdie filters gelyke in hierdie parameter. Die grootste verskil in hierdie filters is uitvoering spoed. Met behulp van 'n rekursiewe algoritme (volgende beskryf), sal die bewegende gemiddelde filter loop soos 'n weerligstraal in jou rekenaar. Trouens, dit is die vinnigste digitale filter beskikbaar. Veelvuldige passe van die bewegende gemiddelde sal dienooreenkomstig stadiger, maar nog steeds baie vinnig wees. In vergelyking, die Gaussiese en Blackman filters is tergend stadig, want hulle konvolusie moet gebruik. Dink 'n faktor van tien keer die aantal punte in die filter kern (wat gebaseer is op vermenigvuldiging word sowat 10 keer stadiger as toevoeging). Byvoorbeeld, verwag 'n 100 punt Gauss 1000 keer stadiger as 'n bewegende gemiddelde gebruik van recursion. I nodig om 'n bewegende gemiddelde filter wat 'n afsnyfrekwensie van 7.8 Hz het ontwerp wees. Ek het gebruik voordat bewegende gemiddelde filters, maar so ver as Im bewus, die enigste parameter wat in gevoer kan word is die aantal punte wat gemiddeld. Hoe kan dit met 'n afsnyfrekwensie Die omgekeerde van 7.8 Hz is 130 ms, en Im werk met data wat getoets by 1000 Hz. Impliseer dit dat ek dit behoort te word met behulp van 'n bewegende gemiddelde filter venster grootte van 130 monsters, of is daar iets anders wat Im hier vermis gevra 18 Julie 13 aan 09:52 Die bewegende gemiddelde filter is die filter gebruik word in die tydgebied te verwyder die geraas bygevoeg en ook vir glad doel, maar as jy dieselfde bewegende gemiddelde filter gebruik in die frekwensiedomein vir frekwensie skeiding dan prestasie sal ergste wees. so in daardie geval gebruik frekwensiedomein filters uitvoering maak user19373 3 Februarie by 05:53 Die bewegende gemiddelde filter (soms omgangstaal bekend as 'n wagon filter) het 'n vierkantige impulsrespons: Of, anders gestel: Onthou dat 'n diskretetyd-stelsels frekwensieweergawe is gelyk aan die diskrete-tyd Fourier-transform van sy impulsrespons, kan ons dit soos volg bereken: Wat was die meeste belangstelling in jou geval is die grootte van die filter, H (omega). Met behulp van 'n paar eenvoudige manipulasies, kan ons kry dat in 'n makliker om te begryp vorm: Dit kan nie makliker om te verstaan ​​kyk. As gevolg van Eulers identiteit. onthou dat: Daarom kan ons skryf die bogenoemde as: Soos ek al voorheen gesê, wat jy regtig bekommerd oor die omvang van die frekwensieweergawe. Dus, kan ons die grootte van die bogenoemde te neem om dit verder te vereenvoudig: Let wel: Ons is in staat om die eksponensiële terme uit te laat val, omdat hulle dit nie invloed op die grootte van die resultaat e 1 vir alle waardes van omega. Sedert xy xy vir enige twee eindige komplekse getalle x en y, kan ons aflei dat die teenwoordigheid van die eksponensiële terme dont raak die algehele omvang reaksie (in plaas daarvan, hulle invloed op die stelsels fase reaksie). Die gevolglike funksie binne die omvang hakies is 'n vorm van 'n Dirichlet kern. Dit is soms 'n periodieke sed funksie, want dit lyk soos die sinc funksie ietwat in voorkoms, maar is periodieke plaas. In elk geval, sedert die definisie van afsnyfrekwensie ietwat is underspecified (-3 dB punt -6 dB punt eerste sidelobe nul), kan jy die bostaande vergelyking gebruik om op te los vir alles wat jy nodig het. Stel H (omega) ter waarde wat ooreenstem met die filter reaksie wat jy wil by die afsnyfrekwensie: spesifiek, kan jy die volgende doen. Stel omega gelyk aan die afsnyfrekwensie. Om 'n deurlopende-time frekwensie om die diskrete-tyd domein karteer, onthou dat omega 2pi frac waar FS is jou monster tempo. Vind die waarde van N wat gee jou die beste ooreenkoms tussen die linker - en regterkante van die vergelyking. Dit moet die lengte van jou bewegende gemiddelde wees. As N is die lengte van die bewegende gemiddelde, dan 'n geskatte afsnyfrekwensie F (geldig vir N GT 2) in genormaliseer frekwensie Ff / fs is: Die omgekeerde hiervan is Hierdie formule is asimptoties korrekte vir groot N, en het ongeveer 2 fout vir N2, en minder as 0,5 vir N4. P. s. Na twee jaar, hier uiteindelik wat die benadering gevolg. Die gevolg is gebaseer op ongeveer dieselfde MA amplitude spektrum rondom f0 as 'n parabool (2 orde Series) volgens MA (Omega) ongeveer 1 (frac - frac) Omega2 wat meer presiese naby die nul kruising van MA (Omega) gemaak kan word - frac deur te vermenigvuldig Omega deur 'n koëffisiënt verkryging MA (Omega) ongeveer 10,907523 (frac - frac) Omega2 die oplossing van MA (Omega) - frac 0 gee die resultate hierbo, waar 2pi F Omega. Al die bogenoemde het betrekking op die -3dB afsny frekwensie, die onderwerp van hierdie post. Soms al is dit interessant om 'n verswakking profiel in stop-orkes wat vergelykbaar is met dié van 'n 1 Om IIR laaglaatfilter verkry (enkele paal LPF) met 'n gegewe -3dB afsny frekwensie (so 'n LPF is ook bekend as lekkende integreerder, 'n paal nie presies by DC, maar naby aan dit). Om die waarheid te beide die MA en die 1ste orde IIR LPF het -20dB / dekade helling in die stop-band ( 'n mens moet 'n groter N as die een wat in die figuur, N32, om dit te sien), maar terwyl MA het spektrale nulls by Fk / n en 'n 1 / f evelope, die IIR filter het slegs 'n 1 / f profiel. As 'n mens wil 'n MA filter met 'n soortgelyke geraas filter vermoëns as hierdie IIR filter verkry, en ooreenstem met die 3dB afgesny frekwensies om dieselfde te wees, op die vergelyking van die twee spektra, sou hy besef dat die stop orkes rimpeleffek van die MA filter beland 3dB laer as dié van die IIR filter. Met die oog op dieselfde stop-orkes rimpeleffek (maw dieselfde geraas krag verswakking) as die IIR kry filtreer die formules kan soos volg gewysig word: ek het terug die Mathematica script waar ek bereken die uitroei vir 'n paar filters, insluitend die MA een. Die gevolg is gebaseer op ongeveer dieselfde MA spektrum rondom f0 as 'n parabool volgens MA (Omega) Sonde (OmegaN / 2) / Sonde (Omega / 2) Omega 2piF MA (F) ongeveer N1 / 6F2 (N-N3) pi2. En die afleiding van die kruising met 1 / sqrt van daar af. â € Massimo 17 Januarie by 2: 08The Scientist en Ingenieurs Guide to Digital Signal Processing Deur Steven W. Smith, Ph. D. Soos die naam aandui, die bewegende gemiddelde filter bedryf deur gemiddeld 'n aantal punte van die insetsein aan elke punt in die uitsetsein produseer. In vergelyking vorm, dit is geskrywe: Waar is die insetsein, is die uitset sein, en M is die aantal punte in die gemiddelde. Byvoorbeeld, in 'n 5 punt bewegende gemiddelde filter, punt 80 in die uitsetsein word gegee deur: As 'n alternatief, kan die groep punte van die insetsein simmetries gekies om die uitset punt: Dit stem ooreen met die verandering van die opsomming in vergelyking . 15-1 van: J 0 tot M -1 aan: J - (M -1) / 2 tot (m -1) / 2. Byvoorbeeld, in 'n 10 punt bewegende gemiddelde filter, die indeks, j. kan hardloop 0-11 (een kant gemiddelde) of -5 tot 5 (simmetriese gemiddelde). Simmetriese gemiddelde vereis dat M wees 'n onewe getal. Programmering is 'n bietjie makliker met die punte op slegs een kant egter hierdie produseer 'n relatiewe verskuiwing tussen die inset en uitset seine. Jy moet besef dat die bewegende gemiddelde filter is 'n konvolusie gebruik van 'n baie eenvoudige filter kern. Byvoorbeeld, 'n 5 punt filter het die filter kern: 82300, 0, 1/5, 1/5, 1/5, 1/5, 1/5, 0, 08230. Dit is die bewegende gemiddelde filter is 'n konvolusie van die insetsein met 'n vierkantige pols met 'n oppervlakte van een. Tabel 15-1 toon 'n program uit te voer die bewegende gemiddelde filter. Smoothing Images Die onderstaande verduideliking behoort aan die boek Computer Vision: Algoritmes en aansoeke deur Richard Szeliski en LearningOpenCV Smoothing. ook bekend as vervaag. is 'n eenvoudige en dikwels gebruikte beeldverwerking werking. Daar is baie redes vir glad. In hierdie handleiding word daar gefokus op glad om geraas te verminder (ander gebruike sal gesien word in die volgende tutoriale). Om 'n glad aksie uit te voer sal ons 'n filter van toepassing op ons beeld. Die mees algemene tipe filters is lineêr. waarin 'n uitset pixel8217s waarde (dit wil sê) is bepaal as 'n geweegde som van insette pixel waardes (dit wil sê): Dit help om 'n filter te visualiseer as 'n venster van koëffisiënte gly oor die beeld. Daar is baie soorte filters, hier sal ons praat van die mees gebruikte: genormaliseerde Box Dit filter is die eenvoudigste van alle Elke uitset pixel is die gemiddelde van sy kern bure (almal bydra met gelyke gewigte) Die kern is hieronder: Gauss filter Waarskynlik die mees bruikbare filter (hoewel nie die vinnigste). Gaussiese filter word gedoen deur convolving elke punt in die insette array met 'n Gaussiese kern en dan optel almal aangemoedig om die uitset verskeidenheid produseer. Net om die prentjie duideliker te maak, onthou hoe 'n 1D Gaussiese kern lyk veronderstelling dat 'n beeld is 1D, kan jy sien dat die pixel geleë in die middel van die grootste gewig sou hê. Die gewig van sy bure daal as die ruimtelike afstand tussen hulle en die sentrum pixel toeneem. Onthou dat 'n 2D Gaussiese kan voorgestel word as: Mediaan Filter Die mediaan filter loop deur elke element van die sein (in hierdie geval die beeld) en vervang elke pixel met die mediaan van die naburige pixels (geleë in 'n vierkantige omgewing rondom die geëvalueer pixel ). Bilaterale Filter Tot dusver het ons 'n paar filters wat hoofdoel is om 'n invoer beeld glad verduidelik. Maar soms die filters nie net los die geraas, maar ook weg glad die kante. Om dit te voorkom (op sekere mate ten minste), kan ons 'n bilaterale filter gebruik. In 'n soortgelyke wyse as die Gaussiese filter, die bilaterale filter is ook van mening die naburige pixels met gewigte aan elkeen van hulle. Hierdie gewigte het twee komponente, waarvan die eerste is die dieselfde gewig wat gebruik word deur die Gauss filter. Die tweede komponent in ag neem die verskil in intensiteit tussen die naburige pixels en die geëvalueer een. Vir 'n meer gedetailleerde verduideliking wat jy kan kyk op hierdie skakel Kode Wat beteken hierdie program doen Loads 'n beeld Pas 4 verskillende soorte filters (verduidelik in teorie) en wys die gefiltreer beelde agtermekaar Verduideliking Let8217s die OpenCV funksies wat slegs die smoothing prosedure behels kyk, aangesien die res is reeds bekend teen hierdie tyd. Genormaliseer Blok Filter: OpenCV bied die funksie vervaag uit te voer glad met hierdie filter. Ons spesifiseer 4 argumente (meer besonderhede, kyk die Verwysingsgroep): src. Bron beeld dst. beeld bestemming Grootte (w, h). Definieer die grootte van die kern te gebruik (met wydte w pixels en hoogte h pixels) Punt (-1, -1). Dui aan waar die anker punt (die pixel geëvalueer) is geleë ten opsigte van die omgewing. As daar 'n negatiewe waarde, dan is die middelpunt van die kern is van mening dat die anker punt. Dit word gedoen deur die funksie GaussianBlur: Hier gebruik ons ​​4 argumente (meer besonderhede, kyk die OpenCV verwysing): 'n Ondersoek van 'n vinnige real-time-GPU gebaseerde beeld vervaag algoritmes in hierdie blog post Im gaan begin verken die onderwerp van vervaag filters . My oorspronklike bedoeling was om - 'n Oorsig en optimalisering idees vir 'n paar van die gewilde real time beeld vervaag filters, van toepassing op baie verskillende reeks hardeware (van sub-4W selfoon GPU's te hoë einde 250W lessenaar GPU). - Gee 'n voorbeeld van die tegnieke wat loop op Windows Desktop OpenGL en Android OpenGL ES 3.0 en 3.1, insluitend bereken shader gebruik op OpenGL ES 3.1. maar ek het besef dat dit meer as een blog post (en 'n baie meer werk) kon neem om die onderwerp behoorlik te verken, so hieronder is die eerste paaiement. So, voel asseblief vry om idees en regstellings bydra in die kommentaar afdeling aan die onderkant. Image vervaag filters beeld vervaag filters word algemeen gebruik in rekenaargrafika of dit is 'n integrale deel van 'n diepte van veld of HDR Bloom, of 'n ander pos proses effek, vervaag filters is teenwoordig in die meeste 3D spel enjins en dikwels in verskeie plekke. Vervaag 'n beeld is 'n redelik triviaal ding om te doen: net in te samel naburige pixels, gemiddeld hulle en jy kry jou nuwe waarde, reg Wel, ja, maar daar is verskillende maniere om dit te doen met verskillende visuele resultate, gehalte en prestasie. In hierdie artikel Siek fokus hoofsaaklik op prestasie (en gehalte kompromieë), as die verskil in koste tussen 'n skip en 'n meer optimale oplossing kan soms 'n orde van grootte wees nie, maar ook verskillende algoritmes kan meer optimale op verskillende hardeware wees. Ek het uit te verken en te kontrasteer drie mees algemene tegnieke stel en hoe hulle optree in 'n monster van die moderne GPU hardeware, wat wissel van mobiele GPU's geïntegreerde grafiese en diskrete GPU kaarte. Voel asseblief vry om kommentaar te lewer as jy 'iets beters of anders - ek sou graag wou dit by die monster vir profilering en toetsing, en voorsien die volgende update. Hierdie drie algoritmes is: Classic konvolusie vervaag met behulp van Gauss verdeling 'n veralgemening van 'n Kawase Bloom oud, maar nog steeds baie van toepassing filter deur Masaki Kawase in sy GDC2003 aanbieding raambuffer Post Processing effekte in dubbel-steel (Wreckless) 'n bereken shader-gebaseerde bewegende gemiddelde algoritme geïnspireerde deur Fabian ryg Giesens artikels: fgiesen. wordpress / 2012/07/30 / vinnig vervaagt-1 / en fgiesen. wordpress / 2012/08/01 / vinnig vervaagt-2 /. Hulle is almal generiese algoritmes wat van toepassing is op effekte soos 'n Bloom HDR filter is. Maar in 'n spesifieke scenario, byvoorbeeld vir gebruik in Diepte van veld, hulle sal bykomende aanpassing vereis wat 'n invloed relatiewe prestasie (soos geweegde steekproefneming te haloing / bloeding voorkom). Selfs sou meer aanpassing nodig wees om iets soortgelyk aan 'n mediaan filter (en. wikipedia. org/wiki/Medianfilter) te bereik. Daar moet egter die optimalisering tegnieke en getalle wat hier aangebied word nuttig wees, selfs as jy is besig om 'n spesiale vervaag soos Bokeh (en. wikipedia. org/wiki/Bokeh), Airy skyf (en. wikipedia. org/wiki/Airydisk) doen of verskillende beeld ruimte lens flare-effekte. Die monster bied ook 'n real time Grafiek visualisering wat gebruik kan word om enige persoonlike vervaag tegniek ontleed. Deursnit van 'n wit 10x10 pixel blok op swart agtergrond voor / na toediening van 'n 15x15 Gauss vervaag filter Dit moet ook op gelet word dat, hoewel generiese algoritmes is makliker om te verstaan, te implementeer, hergebruik en in stand te hou, is daar gevalle waar gespesialiseerde kinders mag doen 'n beter werk. Een so 'n voorbeeld (alhoewel ek dit nie in vergelyking met algoritmes wat hier aangebied word) word hier aangebied: software. intel/en-us/articles/compute-shader-hdr-and-bloom (gebaseer op HDR: Die Bungie Way Microsoft Gamefest 2006. .). 2D Gaussiese vervaag filter Kom ons begin met 'n Gaussiese vervaag filter, 'n algemeen gebruikte filter wat beeld detail en geraas verminder (byvoorbeeld, om lens te boots uit fokus vervaging). Dit staan ​​bekend as Gaussiese omdat die beeld is vervaag met behulp van 'n Gauss-kurwe (en. wikipedia. org/wiki/Gaussianfunction). Skip implementering Die algemene manier van doen Gaussiese vervaag is 'n konvolusie kern (en. wikipedia. org/wiki/Kernel(imageprocessing)Convolution) gebruik. Dit beteken eenvoudig dat ons 'n 2D matriks van genormaliseer pre-bereken Gaussiese funksie waardes en gebruik dit as gewigte, en dan doen 'n geweegde som van al die naburige pixels om elke pixels nuwe (gefiltreer) waarde te bereken. 'N Voorbeeld van 'n 7x7 konvolusie kern met Gauss verspreiding waardes. hulle almal toe te voeg saam moet oplewer 1 as waardes is genormaliseer. Vir 'n 2D filter, dit beteken ook dat elke pixel te bereken, moet ons 'n kern grootte dubbele lus doen die algoritme kompleksiteit raak O (n2) vir elke pixel (waar n die kern hoogte en / of breedte, want hulle is dieselfde). Vir alles behalwe kleinste kern groottes, hierdie raak baie duur, baie vinnig. Skeibare Horisontale / Vertikaal Gelukkig 2D Gaussiese filter kern is skeibare soos dit uitgedruk kan word as die buitenste produk van twee vektore (sien blogs. mathworks / Steve / 2006/10/04 / skeibare-konvolusie / en blogs. mathworks / Steve / 2006 / 11/28 / skeibare-konvolusie-deel-2 /), wat op sy beurt beteken dat die filter kan verdeel word in twee passe, horisontale en vertikale, elk met O (n) kompleksiteit per pixel (waar n die pitgrootte) . Dit verminder drasties berekening koste, terwyl die verskaffing van presies dieselfde resultate. Dit is nuttig om daarop te let dat op hierdie stadium, kan dieselfde algoritme gebruik word vir enige ander toepaslike konvolusie (sien skakel hierbo vir meer besonderhede), soos sommige slyp filters of rand opsporing soos Sobel filter. Beter skeibare implementering met behulp van GPU vaste funksie monsterneming Tot dusver het ons geïgnoreer werklike hardeware implementering, maar wanneer ons hierdie algoritme toe te pas om 'n werklike wêreld scenario, die Gaussiese vervaag filter slaag moet gebeur in real-time, dikwels op die foto met 1280x720 of meer pixels. Moderne GPU's (beide op die selfoon en lessenaar toestelle) is ontwerp met die oog hierop en daarom is dit geen wonder dat hulle dit egter kan doen in 'n paar millisekondes, spaar 'n paar van daardie paar millisekondes kon nog beteken 'n verskil tussen 'n spel loop op sub - optimal 25 of glad 30 rame per sekonde. Algoritmies baie beter, kan hierdie skeibare filter loop op hoogs parallel uitvoering GPU eenhede soos dit is, deur die uitvoering van beeld lees, wiskunde en skryf in die vorm van GPU shaders. Shader pseudokode vir horisontale skeibare Gauss 7x7 filter pas: Maar soos uiteengesit in rastergrid / blog / / 09 / doeltreffende-Gaussiese-vervaag-met-lineêre-steekproefneming / 2010. ons kan voordeel van vaste funksie GPU hardeware, naamlik monsternemers, wat twee (in ons geval) naburige pixel waardes kan laai en weer 'n geïnterpoleer gevolg gegrond op die inligting tekstuur koördineer waardes, al vir ongeveer die koste van 'n tekstuur te lees. Dit halveer rofweg die aantal shader instruksies (halveer die getal monsters instruksies en effens verhoog die aantal rekenkundige instruksies) en kan prestasie te verhoog met 'n faktor van twee (of meer, as ons geheue bandwydte beperk). Om dit te doen, moet ons nuwe stel gewigte en monsterneming skyf bereken sodanig dat wanneer monsterneming twee naburige pixels met 'n lineêre filter, kry ons 'n geïnterpoleerde gemiddeld tussen hulle wat in korrekte proporsies met betrekking tot hul oorspronklike Gauss skeibare filter gewigte. Dan voeg ons al die monsters met behulp van die nuwe stel gewigte, en ons eindig met 'n filter wat baie vinniger, maar het dieselfde gehalte in vergelyking met die nie-new skip implementering dat ons begin uit. Werklike GLSL kode van die monster wat gebruik word om te doen 'n skeibare horisontale of vertikale pas vir 'n 7x7 filter: 4 tekstuur monsters wat gebruik word om 7 monster skeibare filter kry (twee sentrum kinders oorvleuel vir-kode eenvoud redes hierdie ondoeltreffendheid raak irrelevant met groter pitte), met pyle merk skyf (gOffsets van kode hierbo). Toets toon dat hierdie twee benadering kan stamp op prestasie met byna 'n faktor van twee, die verhoging van met pitgrootte. Maar vir baie groot pitte, die algoritme raak beperk deur geheue bandwydte (hardeware-spesifieke) die verskaffing van dalende voordeel: die effek begin om merkbare op Intel GPU's op kern groottes op en bo 127x127 (RGBA8), maar is geneig om hoër op diskrete GPU's ( nie getoets). Baie is soortgelyk prestasie verskille beide waargeneem op diskrete lessenaar GPU (Nvidia GTX 650) en 'n Bay Trail tablet CPU met 'n geïntegreerde grafiese (Atom Z3770) met getoets (7x7, 35x35, 127x127) kern groottes. Die FastBlurs monster toon hierdie new Gauss filter implementering en bevat GLSL shader-kode kragopwekker (in GaussianBlur. h) om enige persoonlike pitgrootte te genereer. Daarbenewens kan die GLSL kode gegenereer word deur die loop van die monster, die kies van die vereiste kern breedte en kliek op die Gaussiese Blur koppelvlak knoppie herhaaldelik 'n paar keer. Werk in 'n laer resolusie So, weve het 'n goeie Gaussiese vervaag implementering, maar ons kry getref in die spel van krag vereis 'n groot vervaag kern en ons teiken hardeware is 'n hoë resolusie selfoon. Gaussiese is nog 'n bietjie te duur is, kan ons beter doen Wel, dit blyk dit is redelik algemeen om 'n paar kwaliteit op te offer en omdat vervaag is 'n laaglaatfilter (bewaar lae frekwensie seine terwyl verzachtende hoë frekwensie kinders), down-skaal om 'n kleiner resolusie buffer, byvoorbeeld om deur te voer die vervaag effek en dan skaal terug na die oorspronklike raam buffer. Vir die vervaag filter het hierdie twee groot voordele: Die aantal pixels wat aangespreek moet word verwerk word verminder deur 4 vir 'n x intermediêre vervaag buffer. Dieselfde pitgrootte in die kleiner buffer dek 2 x 2 groter gebied, so vir dieselfde finale effek die vervaag kern moet verminder word deur in elke dimensie. Hierdie twee dinge mengsel sodat die koste vir die soortgelyke effek verminder met 'n faktor van 8 wanneer byl intermediêre buffer gebruik word, alhoewel daar 'n vaste koste wat verband hou met down-steekproefneming om dit, en up-monsterneming van die resultate terug in die hoof een. So dit maak net sin vir Blur pitte van, byvoorbeeld, 7x7 en bo (kleiner korrels is ook nie genoeg om verliese in kwaliteit as gevolg van afskaling en up-skalering verberg). Die belangrikste nadeel is dat met 'n klein hoeveelheid van vervaag (klein vervaag pitte), die blockiness patroon van af-steekproefneming laer resolusie en terug voor die hand liggend word, sodat dit kan problematies wees as 'n effek moet verdwyn in / uit, veral met die verskuiwing beelde. Dit kan opgelos word, want vervaag-in en vervaag-out effekte, deur interpol tussen vervaag af-monster en die finale beeld vir klein kern waardes. In sommige ander gevalle, soos by die gebruik van 'n vervaag filter om 'n Bloom uitwerking te produseer, is kwessies met 'n laer resolusie intermediêre buffers nog meer verswak deur beweging en bloei funksie, so probeer en tref word dikwels nodig is om 'n meer optimale vervaag filter resolusie vind met betrekking tot kwaliteit vs prestasie. Beeld 'n 1280x720 die belangrikheid van werk in kleiner (deur, of selfs deur) intermediêre buffers waar moontlik, Ive gebruik die meegaande voorbeeld om die tyd wat nodig is om die beeld 'n beeld 2560x1600 vervaag op 'n groot lessenaar AMD R9-290X GPU meet, en stres op 'n Nexus 7 tablet: in die geval van R9-290X, 'n groot vervaag kern van 127x127 word gebruik vir die beeld volle resolusie, wat rondom 3ms in berekening tyd. Die gebruik van die intermediêre buffer vereis 'n 63x63 vervaag kern en voer in 0.5ms, beeld byna identies gehalte produseer op 1/6 van die tyd deur intermediêre buffer vereis slegs 0.17ms. Prestasie verskil op Nexus 7 Android tablet is proporsioneel soortgelyke (hardloop toepaslik, veel kleiner werkladings). Kawase vervaag filter So weve het 'n optimale Gaussiese vervaag implementering en ons dit verwerk in by besluit vir ons HDR Bloom uitwerking (in 'n hipotetiese spel ontwikkeling scenario), maar dit is nog steeds kos ons 3ms per raam. Kan ons doen beter die resolusie om deur nie die geval Val kyk goed genoeg nie, want dit veroorsaak Bloom te blink op beweging, en die vermindering van die pitgrootte nie genoeg van die effek te produseer. Wel, een Bloom-spesifieke alternatiewe is die (reeds genoem) software. intel/en-us/articles/compute-shader-hdr-and-bloom (gebaseer op HDR:. Die Bungie Way Microsoft Gamefest 2006.). Maar dit vereis 'n aantal lewer teikens, is 'n bietjie Messier te implementeer en in stand te hou, nie baie herbruikbare as 'n generiese vervaag algoritme en is by verstek, vaste een pitgrootte (maak die effek skerm resolusie afhanklike en nie maklik tweakable deur kunstenaars). Maar dit blyk dat daar 'n generiese vervaag algoritme wat nog beter prestasie as ons optimale Gaussiese oplossing kan hê, hoewel daar 'n trade-off in in filter gehalte / korrektheid (dit bied billike van ideaal verspreiding, maar is aanvaarbaar vir die meeste spel enjin doeleindes) deur Masaki Kawase bekendgestel in sy GDC2003 aanbieding raambuffer Post Processing effekte in dubbel-steel (Wreckless) (www. daionet. gr. jp/ MVSA / argiewe / GDC2003DSTEAL. ppt). Aanvanklik gebruik vir Bloom uitwerking, kan dit veralgemeen om nou aan te pas Gauss in voorkoms. Dit is 'n multi-pass filter waar elke pass gebruik resultate van die vorige een en geld klein hoeveelheid vervaag, masse genoeg om Gauss verspreiding benader. In elk slaag, die nuwe pixel waarde is die gemiddeld van 16 monsters in 'n vierkantige patroon by veranderlike afstand van die pixel sentrum. Die aantal passe en monsterneming afstand vanaf die middelpunt wissel na gelang van die verwagte resultaat. 'N Voorbeeld van 5-pass Kawase vervaag met 0, 1, 2, 2, 3 pitte, wat ooreenstem met die in uitset n 35x35 Gauss vervaag kern. Gemerk in blou is 1 monster wat 4 pixels in rooi gemerk is die bestemming pixel ontvang gemiddeld som van die monsters Hierdie benadering ten volle benut GPU Sampler hardeware (www. realworldtech / Ivy-brug-GPU / 6 /) tot vier pixels kry met 'n monster noem (4 monsters / 16 pixel waardes per pass). Die aantal passe wat nodig is om naby equivalentiefactoren bereik om 'n spesifieke Gauss verspreiding pitgrootte verhoog minder as lineêr met die Gauss pitgrootte. Die aantal passe en kern patroon van die vier monsters wat gebruik word om spesifieke Gauss filter pitte pas is, op die oomblik, gebaseer op empiriese vergelyking 'n meer outomatiese benadering sal in die toekoms updates vir hierdie artikel ondersoek word. Die monster bied 'n grafiek vertoon word om meer akkurate passing van verskillende tegnieke in staat stel om te lyk Gauss filter verspreiding en korrektheid van verspreiding te verseker. Kwaliteit insetwaardes: 12x12 blok wit pixels op swart agtergrond (links: middel dwarsdeursnee langs x-as reg: top-down oog) Waardes na die toepassing van 'n 5-pass Kawase filter met 0, 1, 2, 2, 3 pitte - nou (maar nie perfek) wat ooreenstem met die 35x35 Gauss filter Waardes na die toepassing van 'n 4-pass Kawase filter met 2, 3, 3, 3 pitte - nie relevant is vir enigiets nie, maar kan goed wees vir skerp lig strepe of 'n soortgelyke effek van links is: oorspronklike beeld 35x35 Gauss filter wat relevant is vir Kawase filter mismatch Kawase filter Performance Alhoewel beter presteer in byna al getoets gevalle, die belangrikste impak van Kawase vervaag filter is by groter pitte en 'n paar hardeware voordele daaruit meer (Nexus 7 spesifiek). Ook, groter GPU's moet groter werk teksture vir die verskil te voor die hand liggend is. Gauss vs Kawase, prestasie by 1920x1080 (deur te werk tekstuur) (Nexus 7 nommers nie getoon vir 127x127 Gauss kern as gevolg van probleme met groot pitte) Gauss vs Kawase, prestasie by 2560x1080 (deur te werk tekstuur) (Intel 4de generasie Ultrabook GPU's te diskrete GPU's ) die monster meet die verskil tussen die tekens van die basiese toneel (kiekie en beweeg driehoeke) en teken die basiese toneel plus af-steekproefneming te werk tekstuur grootte, die toepassing van vervaag en die toepassing van die resultate terug na die volle resolusie raambuffer tekstuur. Resultate toon dat Kawase vervaag lyk 1.5x gebruik om 3.0x minder berekening tyd as die optimale Gauss vervaag filter implementering regoor die wye verskeidenheid van hardeware, resolusies en kern groottes, hoewel dit skale besonder goed met 'n groter pitte en groter werk tekstuur groottes, en op laer krag GPU's. Ongelukkig, hoewel die monster dek mate tot 127x127, ek hoef nie (soos van nog) 'n deterministiese wyse te genereer Kawase pitte te pas arbitrêre grootte Gauss filtreer dit is een van die min dinge wat ek van plan is om te dek in die volgende artikel. Bewegende gemiddeldes te bereken shader weergawe Ten slotte, dit blyk dit is moontlik om 'n eenvoudige, lineêre tyd per pixel vervaag filter (met O (1) kompleksiteit) bedink, deur die toepassing van verskeie passe van 'n bewegende gemiddeldes boks filter. Maar lyk as gevolg van die hoë vaste koste hierdie benadering tot net begin bereik van die prestasie van Gauss / Kawase filters op moderne GPU's vir baie groot vervaag kern groottes, so dit mag dalk net in 'n baie spesifieke scenario van toepassing wees. Tog, dit is 'n cool ding om te hê in dié algoritme toolbox en kan beslis handig te pas kom. Die bewegende gemiddeldes boks filter word in 'n baie fyn detail in Rygs uitstekende artikels (fgiesen. wordpress / 2012/07/30 / vinnig vervaagt-1 /) maar hier is die kort opsomming: 'n boks filter is 'n beeld filter dat elke vervang pixels waardes met 'n gemiddeld van MXN naburige pixels (konvolusie filter kern met almal gelyk genormaliseer waardes). 2D boks filter bereik kan word deur dit te doen 2 skeibare 1D horisontale / vertikale verby, op dieselfde manier soos beskryf by die skeibare Gauss filter, vir O (n) kompleksiteit egter in Behalwe dat dit moontlik is om elk van die doen vertikale en horisontale aangeë gebruik van bewegende gemiddeldes vir O (1) kompleksiteit. Bewegende gemiddeldes basies 'n mens gaan oor die hele kolom (of ry), iterating oor die hele lengte: Vir die eerste pitgrootte elemente, is 'n bedrag geskep en gemiddeldes geskryf in die uitset. Dan, vir die elke nuwe element, 'n waarde van die element nie meer gedek deur die pitgrootte afgetrek word van die gemiddelde, en die waarde van die reg is bygevoeg. Gemiddeld som (gedeel deur pitgrootte) word dan aan die uitset geskryf. Die effek hiervan is dat, vir groot genoeg verskeidenheid grootte, berekening tyd groei nie met die pitgrootte. GLSL kode vir 'n horisontale bewegende gemiddeldes Box filter pas: Terwyl 'n enkele vak filter pas nie voorsiening goed genoeg vervaag effek vir die meeste doeleindes, re-toepassing van 'n boks filter verskeie kere oor dieselfde dataset by benadering Gauss verspreiding (sien en. wikipedia. org / wiki / Centrallimittheorem). Die meegaande voorbeeld gebruik van 'n twee pas weergawe, aangesien dit goed genoeg gehalte teen 'n redelike prestasie, hoewel die 3 pas 'n mens voorsien merkbaar beter resultate in sommige gevalle. Prestasie Die volgende grafiek toon die prestasie van 'n 2-pass Box Bewegende Gemiddeldes teen Gauss en Kawase filters. Soos verwag, het die Moving Gemiddeldes filter het 'n redelik vaste koste, ongeag van die pitgrootte en dit begin om meer optimale omstreeks 127x127 pitgrootte (veral op die meer geheue gebind Ultrabook HD4400 GPU). Gekombineer in verskeie hardeware (sal hierdie te vervang met gekombineerde relatiewe prestasie, maak meer sin) Prestasie op Windows OpenGL en Android OpenGLES op Bay Trail (Atom Z3775) was byna identies in alle gevalle so die getalle te dek beide platforms. Die bewegende gemiddelde filter word nie ondersteun op Nexus 7 want dit ontbreek Bereken Shader ondersteuning. Op getoets AMD hardeware was daar 'n probleem met die multi-pass bereken shader, waar 'n oproep om glMemoryBarrier (GLSHADERIMAGEACCESSBARRIERBIT) lyk nie korrek werk nie, wat 'n oproep om glFinish () plaas, wat korrektheid van prestasie getalle invalidates, so dit was weggelaat. Op getoets Nvidia hardeware, die prestasie in ooreenstemming maar onverwags stadig, sinspeel op 'n nie-optimale algoritme implementering (byvoorbeeld, is daar 'n groot prestasie variasies gebaseer op bereken shader groep versending grootte en ek kon dit nie vind die beste geskik is vir twee verskillende Nvidia GPU's) , so hierdie is weggelaat hangende verdere ondersoek. Dit toon ook hoe moeilik dit is om die lieflike plek vir 'n bereken shader werklading getref, ten einde optimaal te voer, want dit vereis verkoper-spesifieke (en selfs verkoper GPU geslag-spesifiek) tuning. Opsomming Die prestasie van die 3 algoritmes (en die koste van af-monsterneming en up-steekproefneming kleiner werk tekstuur) op die mees algemene 4de generasie Intel Ultrabook CPU op die mark Ek hoop dat hierdie artikel het jy 'n paar nuttige inligting oor: Hoe om potensieel maak jou Gauss vervaag filter run vinniger (saam met die bronkode generator). Hoe om te skryf en gebruik 'n Kawase filter, 'n goeie alternatief vir Gauss van prestasie perspektief vir alles behalwe kleinste korrels groottes. Dit geld op hardeware wat wissel van Nexus 7 tablette, oor Intel Ultrabooks en diskrete GPU's. Dat 'n twee (of meer) te slaag bewegende gemiddelde Box filter sal nog beter te doen met 'n baie groot kern groottes, op platforms wat bereken shaders ondersteun (Intels Bay Trail synde die eerste een om dit te doen op Android, met sy OpenGL ES3.1 ondersteuning) . Maar bereken shader benadering maak enigste praktiese sin in spesifieke scenario's en vereis hardeware-spesifieke tuning. Indien u enige voorstelle het, spot enige foute of enige ander soort van kommentaar, laat asseblief in 'n kommentaar gedeelte aan die onderkant van die bladsy. Min bykomende notas Memory uitleg op GPU's en kas vriendelikheid Doen groot pitte per pixel dalk erger as om 'n multi-pass met kleiner gelokaliseerde pitte toegang as gevolg van tekstuur kas wees (en groot pitte is verkwistende en ondoeltreffende). As gevolg van nie-lineêre, geteëlde tekstuur geheue aanspreek (sien www. x.org/wiki/Development/Documentation/HowVideoCardsWork/index1h3), doen horisontale en vertikale bereken shader aangeë het in wese gelyk prestasie. Dit geld net vir die toegang tot Tekstuur voorwerpe, maar nie wanneer 'n buffer in 'n scanline mode, in welke geval geheue toegang in die horisontale pas baie meer kas-vriendelike sal wees met die hand te spreek. In hierdie geval, die omzetting voor en na die vertikale pas kan beter algehele prestasie te lewer. Profilering notas Alle profiele (die Run Maatstaf knoppie in die monster) gedoen word deur gebruik te maak om die off-skerm buffer in die grootte van die gekose toneel inhoud (1280x720, 1600x900, 1920x1080 en 2560x1600) en vertoon dit na 1280x720 vertoonvenster, sodat die getalle is redelik resolusie toestel onafhanklik. In die eerste plek is die basislyn koste gemeet deur gebruik te maak van die inhoud off-skerm en die toepassing daarvan op die skerm (1280x720 vertoonvenster). Dan is die werklading koste gemeet (teken die off-skerm toneel, down-steekproefneming, toe te pas filter, up-steekproefneming, teken aan skerm) Die verskil tussen die basislyn en die werklas vertoon op die skerm. Terwyl profilering, dit 8 keer haak voordat teken GUI en die aanbieding op die skerm om inmenging te verminder. V-sync is afgeskakel (hoewel dit nie die geval blyk te werk op Nvidia jongste bestuurder, sodat dit met die hand moet wees afgeskakel in die grafiese control panel). Dinge wat ek wil om te dek in 'n update generiese (en nie-heelgetal) pitgrootte ondersteuning en vervaag in / uit die ingang: Die monster bied 'n generiese Gauss kern kragopwekker wat werk vir enige n4-1 pitgrootte, maar nie vir enige grootte van die twee. Kawase vervaag kom in 'n aantal van presets, maar op die oomblik is daar nie 'n generiese manier om dit te bereken. Bewegende gemiddeldes implementering is soortgelyk aan die Gauss een. Wat ek wil om volgende te doen, is om: - ondersteuning by vir enige, nie-heelgetal kern groottes vir Gauss filter. - Óf 'n wiskundig korrekte manier om die skep van Kawase gaan vir enige gegewe Gauss kern, of 'n brute krag stelsel 'n pre-genereer hierdie presets, saam met die hantering van nie-heelgetal kern groottes. - Implementeer nie-heelgetal ondersteuning vir Bewegende Gemiddeldes filter. - Moontlik implementeer 'n eenvoudige DOF / HDR Bloom uitwerking met behulp van die Kawase filter vir toetsdoeleindes. Meer optimale bewegende gemiddelde bereken shader implementering: moet meer optimale toegang geheue patrone en GPU draad skedulering 'n beter Gauss filter implementering Enige idees te ondersoek - stuur hulle my pad (ek 'n goeie een wat Im ondersoek reeds ontvang). ) Kode te proe Die kode monster gebou met behulp van OpenGL vir Windows platform en OpenGL ES vir Android-platform (NDK) en toon Gauss, Kawase en Bewegende Gemiddeldes (Bereken Shader) vervaag filters, en bied benchmarking ondersteuning vir elke oor verskeie kern groottes en skerm resolusies . Wanneer OpenGL ES 3.1 ondersteuning bespeur (soos op Intel Bay Trail Android-tablette), sal die bewegende gemiddelde bereken shader pad aangesit wees. 'N pakket met die bronkode en binêre word hieronder aangeheg. Terwyl ek in staat was om die tweede paaiement van die blog nog skryf havent het, sou ek raai almal wat belangstel in die onderwerp om te kyk na Bandwydte-doeltreffende lewering aanbieding deur Marius Bjrge, ARM (community. arm / Servlet / JiveServlet / aflaai / 96891546- 19462 / siggraph2015-MMG-Marius-notes. pdf) van die Moving Mobile Grafiese SIGGRAPH 2015 Course (community. arm / gebeure / 1155). Dit bied 'n baie cool Dual filter benadering wat 'n kombinasie multi-pass Kawase met downsampling / sampling by elke stap vir nog meer prestasie wins in vergelyking met gereelde (volle resolusie) Kawase filter. Ek didnt nog genoeg tyd het om die kode (wat die outeur bied vriendelik in die aanbieding notas, gekoppel in die vorige paragraaf) om seker te maak hoe dit vergelyk word met die half-resolusie Kawase wat in hierdie artikel te implementeer, maar ek sou verwag dat dit verrig beter vir almal, maar kleinste vervaag kern groottes, want dit sal 'n beter skaal met 'n toenemende pitgrootte. David c. gesê op Woensdag, 2015/07/29 - 06:24 Hi Filip Dankie vir so vinnig antwoord, in opsomming Im op soek na implementeer jou Gauss-kode in C in 'n Android Java program wat dit kan gebruik vir 'n drywende oog en 'n real-time vervaag-scrolling oog Dankie vir jou hulp Hi David, dankie vir die belangstelling Ongelukkig het ek nie eens weet wat Android-customView is, so ek dont dink Siek in staat wees om hier te help, maar ek sal vra om in die geval iemand anders met meer Android-ervaring het 'n paar idees :) Dawid c. gesê Tue, 2015/07/28 - 20:55 Baie dankie vir so 'n groot post, my naam is David Coronel, Im n Colombiaanse Android ontwikkelaar-fanatikus, tans im werk in 'n program wat real-time vervaag gebruik met 'n paar boek ui beheer, sodat die vervaag bo sommige beelde verskuif kan word, Ive gedoen met 'n paar renderScript, maar ek kan nie dit kry werk in 'n gladde pad, becouse na 'n tyd met behulp van die app dit stadig en laggy word as gevolg van die hoë bedrag van geheue wat gebruik word om die vervaag Ek dink dit sal beter wees om 'n paar inheemse kode gebruik te maak, so ek het 'n web navorsing oor die mees gebruikte en vinnigste vervaag tecniques, en beland met jou blog post, Ive donloaded jou super-projek van vinnige vervaagt en kry heeltemal stomgeslaan deur die gladheid van die werklike tyd vervaag jy het na 'n ruk na die kode, het ek besef ek is nie so gevorderd om die inheemse kode verstaan, en het besluit om jou gevra om te help met 'n spesifieke punt Kan jy asseblief verduidelik vir my hoe kan ek doen 'n Android-customView wat jou vinnig vervaag basis-kode gebruik en optree soos 'n RelativeLayout Jammer om jou pla en dankie vir jou hulp, sal dit hoog op prys gestel word

Comments

Popular Posts