LED LYT Meter LED, PIC Microcontroller och Moving Average Code. Hello alla tack för att du kollade in min första instruktör Jag har haft glädje att se dina skapelser genom åren och älska vad du alla bidrar med. Detta projekt är en snurrning av en som Jag såg nyligen här och jag måste skrika ut till Bot1398 eftersom han visade mig i sin instruktör att du kan använda en LED för att upptäcka förändringar i ljusintensitet i miljön och använd detta för att slå en annan lysdiod på eller av jag visste att om du levererade lite ström till en LED-lampa skulle det avge ljus Jag trodde aldrig att det skulle kunna användas tvärtom Efter att jag såg LED-lamporna med LED-givare var det meningsfullt men jag ville se att detta faktiskt fungerar för mig själv. Jag är skriver detta instruerbart eftersom Bot1398 använde en Arduino och jag har aldrig använt dem, men jag har inget emot dem, men när jag började använda mikrokontroller för ungefär 3 år sedan letade jag efter fart och kraft för en specifik applikation som jag avgjorde PIC Microcontroller-serien av Microchip Det är fantastiskt vad du kan göra med mikrokontroller, du kan låta fantasin springa vild och med lite kreativ programmering uppnå exakt vad du vill. Det finns ett antal programmeringsspråk där ute, men när jag började jag önskad hastighet och att veta exakt vad som hände vid varje steg därför valde jag Assembly Language eftersom det verkade mycket som BASIC som jag lärde mig på IBM PC Jr tillbaka på 1980-talet när jag växte upp Det är vad Denna instruktionsbok innebär att PIC Microcontrollers och Assembly Language använder en LED-ljusemitterande diod för att detektera mängden omgivande ljus och visa numeriskt mått på detta ljus tillsammans med en bargraph på en LCD-skärm. Jag producerade den första versionen av denna LED-baserade Light Sensing Device som fungerade, det problem jag märkte var att värdena hoppade runt ganska. Därför letade jag efter en lösning på det här problemet, jag tänkte på att värdera värdena, men hur binär matte gör är svårt men det finns alltid ett sätt att få det gjort När jag letade efter lösningar kom jag över en bra sida om rörliga medelvärden och hur man gör det mest effektivt så att även de 8-bitars mikrokontrollerna kan hantera det med lätthet Länken till sidan är här Computationally Effective Moving Averages och det fungerar väldigt bra Denna implementering visar det rörliga genomsnittet av de senaste 256 ljusavläsningarna och visar det värdet tillsammans med en bargraph på LCD-skärmen. Den rörliga genomsnittskoden förhindrar värdena Läs från LED-lampan från att hoppa runt mycket och ge dig ett bättre, mycket mer exakt resultat. När vi ansluter en LED till en mikrocontroller gör vi vanligtvis det för att tända det. I det här fallet använder vi emellertid en positiv spänning till den negativa änden av elektroden Det här är så att vi kan dra nytta av något som kallas parasitisk kapacitans. Genom att använda denna positiva spänning kommer vi att bygga upp en liten laddningsresurs på internet, säger wi Tunn om 100-200 nanosekunder inom denna parasitära kapacitans hos LED-lampan som vi använder Den faktiska kapacitansen är inte så viktig, men online resouces säger att den är omkring 10-15 pF Vi kommer då att byta pin på mikrokontrollen kopplad till den negativa änden av elektroden från en OUTPUT till en INPUT och vänta på att laddningen ska tömmas När laddningsavloppet räcker, läser stiftet nu ett logiskt nivå 0 eller lågt tillstånd där vi stänger av timern och använder det här värdet för att beräkna det glidande medelvärdet och displayen Resultaten på skärmen Vi tar sedan mer avläsningar och visar dem på skärmen vid det intervall som skrivs i monteringskoden. I den färdiga koden har jag det inställt att ta en läsning om var 20 eller så mikrosekunder. Detta inträffar 50 gånger så att ett uppdaterat resultat visas på skärmen ungefär varje sekund eller så. Den tid det tar för att läsa kommer att variera lite eftersom det tar längre tid för laddningen att tömma i mörk miljö och detta occu Rs snabbare i ljusmiljöer Utgångshastigheten för LED-kapacitansen är på något sätt direkt relaterad till antalet fotoner eller mängden ljus som slår på LED-ljusgenereringselementen. Trevligt är det inte. Nu när vi vet hur det fungerar, låt oss gå vidare till steg 1.Step 1 Samla komponenter och montera kretskortet. Först samla in följande objekt måste du bygga LED LYT METER. PIC Mikrokontroller Jag använde 18F4550 LCD-skärm 2x20 eller 2x16 lysdioder Breadboard Wires Power Source. Now bör du kunna följa Den schematiska att montera kretsen på ett brödbräda eller något annat sätt som du gillar att sätta samman dina kretsar Den här är ganska lätt och har minsta delar Jag bifogade två olika scheman, den har ljusmätningsdioden ansluten till två olika mikrokontroller och den andra har denna LED med katoden eller det negativa ändet anslutet till en mikrokontrollerstift och anoden eller den positiva änden av LED-lampan ansluten till marken. Detta verkar bakåt men remeber är vi n ot använder LED för att producera ljus, men att mäta det istället Det är därför det är anslutet på detta sätt I mina bilder ser du att LED-lampan är ansluten till två kontroller av mikrokontroller Detta beror på att jag ville kunna använda LED för att producera ljus också för att kontrollera att det fungerar när programmet startas. Om du väljer att ansluta LED-lampan till 2 stift av mikrokontroller måste du komma ihåg det för att det ska fungera kunde jag inte hitta det här dokumentationen någonstans så det tog lite experiment för att få det att fungera För att kunna tända LED måste båda mikrokontrollerna stifta som OUTPUTS Så för att lysdioden ska lysa ställer du in anoden eller den positiva änden av LED högt så att strömmen flyter genom LED för att producera ljus Vid första trodde jag att jag skulle behöva ställa in katod eller negativa änden av LED-lampan som en INPUT men det fungerade inte. Nu när du har komponenets, sätt dem Tillsammans på breadboard genom att följa den schematiska du vill ha att följa När monteras ska det se lite liknar bilderna nedan Jag använder en 5 Volt Regulator för att leverera 5 volt för att driva kretsen Jag använder en väggvarta som levererar ca 9 volt till regulatorn. LCD-skärmen som jag använder är en Newhaven Display NHD C0220AZ FSW FTW COG Chip på Glas Vätskekristall Display Module Jag brukade använda HD44780 LCD-skärmar som många andra människor använder Du kan definiert använda HD44780-skärmarna utan problem och det finns mycket mer källkod där ute för att få dem att köra Newhaven-displayen hade ingen källkod men satt ned med databladet och med hjälp av källkoden HD44780 kom jag upp med koden för att få det att fungera perfekt Jag gillar displayen av några skäl Kontrasten är väldigt lätt att ställa in Och hittills har jag inte behövt ändra det alls under de olika årstiderna, det är alltid klart och väldigt lätt att läsa. Det har också ett mindre fotavtryck och var precis vad jag behövde för ett stort projekt som jag jobbar med där det finns s takten är på ett premium Det är mindre än HD44780-skärmarna och visar fortfarande 20 tecken på var och en av de två linjerna. Slutligen är det billigare än HD44780-skärmarna och jag valde ett par av dessa från Digikey och till ett pris av 10 25 vardera Kontrollera dem här Newhaven LCD-skärm på Digikey Tänk på att den här skärmen kräver 3 3 till 5 5 volt så kom ihåg när du väljer din strömkälla. Källkoden som levereras bör också köra HD44780-skärmarna utan några problem. Det här är bara det sätt jag har på att ställa in. Du kan placera komponenterna till diffenta stiften på din mikrokontroller. Tänk bara på vilka stift av mikrokontroller du ansluter till den positiva och negativa änden av ljuskänslingsdioden. Du kan också koppla in din LCD-skärm för att fungera i 4-bitarsläge istället för 8-bitarsläge som illustrerat. Det skulle kräva fyra mindre anslutningar i kretsen men gör programmeringen lite mer komplicerad. Till nästa steg Skriva Pr ochram. En av de viktigaste applikationerna för Arduino-kortet är läsning och loggning av sensordata. Exempelvis övervakar man trycket varje sekund av dagen. Eftersom höga samplingsfrekvenser ofta genererar spikar i diagrammen, vill man också ha ett genomsnitt av mätningarna. Mätningar är inte statiska i tid Det som vi ofta behöver är ett löpande medelvärde. Detta är medelvärdet av en viss period och mycket värdefull när vi gör trendanalys. Enklaste form av ett löpande medelvärde kan göras med kod som bygger på tidigare löpande medelvärde. Om Man vill inte använda flytande punktmatematik - eftersom detta tar upp minne och minskar hastigheten - man kan göra detsamma helt i heltalsdomen. Divisionen med 256 i provkoden är en shift-right 8, vilket är snabbare än en division av t. ex. 100 Detta är sant för varje kraft av 2 som delare och en måste bara ta hand om summan av vikterna är lika med kraften av 2 Och förstås man bör ta hand om det finns inget mellanliggande överskott överväga att använda osignerad lon g. Om du behöver ett mer exakt löpande medelvärde, i konkreto från de senaste 10 mätningarna, behöver du en array eller länkad lista för att hålla dem. Denna array fungerar som en cirkulär buffert och med varje ny mätning avlägsnas den äldsta. Beräknad som summan av alla element dividerat med antalet element i matrisen Koden för löpande medelvärdet kommer att vara något som här. Drawback av denna kod är att matrisen för att hålla alla värden kan bli ganska stor Om du har en mätning per Andra och du vill ha ett löpande medel per minut behöver du en uppsättning av 60 i genomsnitt per timme skulle behöva en uppsättning av 3600 som inte kunde göras på detta sätt på en Arduino eftersom den bara har 2K RAM, men genom att bygga ett 2-stegs medelvärde kan närmar sig ganska bra ansvarsfriskrivning inte för alla mätningar I psuedo code. As en ny intern statisk matris behövs för varje runningAverage-funktion, skriker detta för att implementeras som en klass. RunningAverage-biblioteket. RunAverage-biblioteket gör en Klass av funktionen ovan så att den kan användas flera gånger i en skiss Det avvecklar tillägget och avg-funktionen för att vara lite mer flexibel, t ex man kan ringa medelvärdet flera gånger utan att lägga till en sak. Observera att varje instans av klassen lägger till sin egen matris för att hålla mätningar och att detta bidrar till minnesanvändningen Klassens gränssnitt hålls så liten som möjligt. Notera med version 0 2 görs namnen på metoderna mer beskrivande. En liten skiss visar hur det kan användas En slumpgenerator används för att efterlikna en sensor. I inställningen rensas myRA så att vi kan börja lägga till nya data. I loop först genereras ett slumptal och omvandlas till en float som läggs till i minRA Till seriell port En kan också visa den på vissa LCD-skärmar eller skicka över Ethernet osv. När 300 objekt läggs till, raderas minRA för att starta om igen. För att använda biblioteket, skapa en mapp i dina SKETCHBOOKPATH-libaries med namnet RunningAverage och sätt h och den re Gör eventuellt en exemplar underkatalog för att placera provet app.2011-01-30 första versionen 2011-02-28 fixad saknad destructor i h file.2011-02-28 borttagen default constructor.2012- - trimValue Yuval Naveh lagt till trimValue hittades På web.2012-11-21 refactored.2012-12-30 added fillValue refactored för publishing.2014-07-03 lagt till minneskyddskod - om intern array inte kan tilldelas storlek blir 0 Detta är för att lösa problemet som beskrivs här. Test utförligt. Template class. RunningAverage h. RunningAverage. As andra har nämnt bör du överväga ett IIR-oändligt impulssvarningsfilter i stället för det FIR-ändamål för reaktionsfilter du använder nu. Det finns mer till det, men vid första anblicken implementeras FIR-filter som uttryckliga omvälvningar och IIR-filter med ekvationer. Det speciella IIR-filtret som jag använder mycket i mikrokontroller är ett enkelpoligt lågpassfilter. Detta är den digitala motsvarigheten till ett enkelt RC-analogfilter. För de flesta applikationer kommer dessa att ha bättre characteristi cs än det lådfilter som du använder De flesta användningarna av ett lådfilter som jag har stött på är resultatet av att någon inte uppmärksammar sig i den digitala signalbehandlingsklassen, inte som ett resultat av att de behöver sina speciella egenskaper. Om du bara vill dämpa högfrekvenser Som du vet är buller, är ett enkelspalt lågpassfilter det bästa sättet att implementera en digitalt i en mikrokontroller är vanligtvis. FILT - FILT FF NEW - FILT. FILT är en bit av beständig stat Detta är den enda beständiga variabeln du behöver beräkna detta filter NYTT är det nya värdet som filtret uppdateras med denna iteration. FF är filterfraktionen som justerar filterets tyngd. Se på denna algoritm och se till att för FF 0 är filtret oändligt tungt eftersom utdata aldrig ändringar För FF 1 är det verkligen inget filter alls eftersom utmatningen bara följer ingången. Användbara värden är emellan På små system väljer du FF att vara 1 2 N så att multiplikationen med FF kan utföras som ar Ight shift by N bits Exempelvis kan FF vara 1 16 och multiplicera med FF därför ett rätt skift på 4 bitar. Annars behöver det här filtret endast en subtrahera och en tillägg, även om siffrorna vanligtvis behöver vara bredare än ingångsvärdet mer på numerisk precision i en separat sektion nedan. Jag brukar ta AD-avläsningar betydligt snabbare än de behövs och tillämpa två av dessa filter kaskadade Detta är den digitala motsvarigheten till två RC-filter i serie och dämpas med 12 dB oktav över rullningsfrekvensen. För AD-avläsningar är det vanligtvis mer relevant att titta på filtret i tidsdomänen genom att överväga sitt stegsvar. Detta berättar hur snabbt ditt system kommer att se en förändring när den sak du mäter förändringar. För att underlätta utformningen av dessa filter, vilket bara innebär att plocka FF och bestämmer hur många av dem som ska kaskad använder jag mitt program FILTBITS Du anger antalet skiftbitar för varje FF i den kaskade serien av filter och det beräknar stegsvaret och o värden Faktum är att jag brukar köra det här via mitt wrapper-script PLOTFILT Detta kör FILTBITS, vilket gör en CSV-fil, sedan plottar CSV-filen. Till exempel här är resultatet av PLOTFILT 4 4.De två parametrarna till PLOTFILT betyder att det kommer att finnas två filter Kaskad av den ovan beskrivna typen Värdena på 4 anger antalet skiftbitar för att inse multipliceringen med FF De två FF-värdena är därför 1 16 i det här fallet. Det röda spåret är enhetens stegsvar och är det viktigaste att se vid Exempel här berättar du att om ingången ändras omedelbart, kommer utmatningen av det kombinerade filtret att lösa sig till 90 av det nya värdet i 60 iterationer Om du bryr dig om 95 avvecklingstid måste du vänta på 73 iterationer och för 50 Avvecklingstiden endast 26 iterationer. Det gröna spåret visar dig utgången från en enda full amplitudspik Detta ger dig en uppfattning om slumpmässigt brusundertryck Det verkar som om inget enda prov kommer att orsaka mer än en 2 5 förändring i utgången. Det blå spåret Är att ge Jag är en subjektiv känsla av vad det här filtret gör med vitt brus Detta är inte ett strikt test eftersom det inte finns någon garanti för vad exakt innehållet i slumpmässiga nummer valts som den vita brusinmatningen för denna körning av PLOTFILT Det är bara för att ge dig en grov känsla av hur mycket det kommer att bli squashed och hur smidig det är. PLOTFILT, kanske FILTBITS, och många andra användbara saker, särskilt för PIC-programvaruutveckling finns tillgänglig i programvarulicens för PIC Development Tools på min nedladdningssida. Precision. Jag ser från kommentarerna och nu ett nytt svar att det finns intresse att diskutera antalet bitar som behövs för att implementera detta filter Observera att multiplikationen med FF kommer att skapa logg 2 FF nya bitar under binärpunkten På små system är FF vanligtvis valda för att vara 1 2 N så att denna multiplicering faktiskt realiseras med en rättväxling av N bitar. FILT är därför vanligtvis ett fastpunkts heltal Observera att detta inte ändrar någon av matematiken från processorns punkt i visning Om du till exempel filtrerar 10 bitars AD-avläsningar och N 4 FF 1 16 behöver du 4 fraktion bitar under 10 bitars heltal AD-läsningar. En processorer, du d gör 16 bitars heltalstransaktioner på grund av 10 bit AD avläsningar I det här fallet kan du fortfarande göra exakt samma 16 bitars heltalsoperationer, men börja med AD-läsningarna vänster förskjutna med 4 bitar Processorn känner inte till skillnaden och behöver inte göra Om matematiken fungerar på hela 16 bitars heltal fungerar det om Du anser att de är 12 4 fasta eller äkta 16 bitars heltal 16 0 fast punkt. I allmänhet måste du lägga till N bitar varje filterpol om du inte vill lägga till ljud på grund av den numeriska representationen. I exemplet ovan andra filter av två skulle behöva ha 10 4 4 18 bitar för att inte förlora information I praktiken på en 8-bitars maskin betyder det att du använder 24 bitars värden. Tekniskt sett skulle den andra polen av två behöva det bredare värdet Brukar använda samma representation, och därmed Y samma kod för alla poler i ett filter. Normalt skriver jag en subrutin eller ett makro för att utföra en filterpoleoperation och applicera sedan den på varje pol Om en subrutin eller ett makro beror på huruvida cykler eller programminnet är viktigare i det specifika projekt Hur som helst använder jag något repetillstånd för att skicka NEW till subrutinen makro, som uppdaterar FILT, men laddar också in i samma repetillstånd NYHET var i Detta gör det enkelt att tillämpa flera poler eftersom den uppdaterade FILT av en pol är den NYHET av nästa När en subrutin är det användbart att få en pekare till FILT på vägen in, som uppdateras till strax efter FILT på väg ut. På så sätt fungerar subrutinen automatiskt på efterföljande filter i minnet om det kallas flera gånger Med ett makro behöver du inte en pekare eftersom du skickar in adressen för att fungera på varje iteration. Code Examples. Here är ett exempel på ett makro som beskrivits ovan för en PIC 18. Och här är ett liknande makro för en PIC 24 eller DsPIC 30 eller 33.Both th ese exempel implementeras som makron med min PIC assembler preprocessor som är mer kapabel än någon av de inbyggda makroanläggningarna. clabacchio Ett annat problem som jag borde ha nämnt är implementering av fast programvara. Du kan skriva en enkelpolig lågpassfilter subrutin en gång och sedan applicera den flera gånger. Faktum är att jag vanligtvis skriver en sådan subrutin för att peka i minnet till filtertillståndet, sedan ha det förskott Pekaren så att den kan kallas i följd lätt för att realisera flera poliga filter Olin Lathrop Apr 20 12 på 15 03.1 Tack så mycket för dina svar - alla bestämde jag för att använda det här IIR-filtret, men det här filtret används inte som ett Standard LowPass-filter eftersom jag behöver genomsnittliga räknevärden och jämför dem för att upptäcka ändringar i en viss räckvidd eftersom de här värdena har mycket olika dimensioner beroende på maskinvara jag ville ta ett genomsnitt för att kunna reagera på dessa hårdvaror specifika ändringar automatiskt senselen 21 maj 12 på 12 06. Om du kan leva med begränsningen av en kraft av två antal objekt i genomsnitt dvs 2,4,8,16,32 etc så kan delningen enkelt och effektivt ske på en Lågpresterande mikro med ingen dedikerad delning eftersom det kan ske som en bitskift. Varje växlingsrätt är en kraft av två. OP-enheten trodde att han hade två problem, delade i en PIC16 och minne för hans ringbuffert. Detta svar visar att delningen Det är inte svårt Visserligen behandlar det inte minnesproblemet, men SE-systemet tillåter partiella svar, och användarna kan ta något från varje svar för sig själva, eller till och med redigera och kombinera andra svar. Eftersom några av de andra svaren kräver en delning, är likaledes ofullständiga eftersom de inte visar hur man effektivt kan uppnå detta på en PIC16 Martin 20 april 12 på 13 01. Det finns ett svar på ett riktigt glidande medelfilter aka boxcar filter med mindre minne krav, om du inte har något att tänka på. Kallas ett kaskadintegrator-comb filter CIC Tanken är att du har en integrator som du tar skillnader över en tidsperiod, och den viktigaste minnesbesparande enheten är att genom downsampling behöver du inte lagra eve Ry-värdet på integratorn Det kan implementeras med följande pseudokod. Din effektiva glidande medellängd är decimationFactor stateize men du behöver bara behålla statusprover självklart. Du kan självklart få bättre prestanda om din stateize och decimationFactor är krafter på 2, så att divisions - och återstående operatörer ersättas av skift och mask-ands. Postscript Jag håller med Olin om att du alltid bör överväga enkla IIR-filter före ett glidande medelfilter Om du inte behöver frekvens-nollarna hos ett boxcarfilter, en 1-polig Eller 2-poligt lågpassfilter kommer antagligen att fungera bra. Om du filtrerar i syfte att decimera med en högprovsränta inmatning och med medelvärdet för användning med en lågprocess, då ett CIC-filter Kan vara precis vad du letar efter speciellt om du kan använda stateize 1 och undvika ringbufferten helt och hållet med bara ett enda tidigare integratorvärde. Det finns en djupgående analys av matematiken bakom användandet av de första orden er IIR-filter som Olin Lathrop redan har beskrivit på Digital Signal Processing-stackutbytet innehåller massor av vackra bilder Ekvationen för detta IIR-filter är. Detta kan implementeras med hjälp av heltalserier och ingen delning med följande kod kan behöva lite felsökning som jag Skrivte från minnet. Detta filter approximerar ett glidande medelvärde av de sista K-proven genom att ställa in värdet av alfa till 1 K Gör det här i föregående kod genom att definiera BITS till LOG2 K, dvs för K 16 set BITS till 4, för K 4 sätta BITS till 2 osv. Jag ska verifiera koden som anges här så snart jag får en ändring och rediger detta svar om det behövs. Svarade 23 juni 12 kl 04 04. Här är ett poligt lågpassfilter glidande medelvärde med Cutoff frekvens CutoffFrequency Mycket enkel, mycket snabb, fungerar bra och nästan inget minne överhead. Notera Alla variabler har räckvidd bortom filterfunktionen, utom det som passerade i newInput. Note Detta är ett enda stegsfilter Flera steg kan kaskadas tillsammans för att öka Skärpa av Filtret Om du använder mer än ett steg måste du justera DecayFactor som relaterar till Cutoff-Frequency för att kompensera. Och självklart allt du behöver är de två linjerna placerade någonstans, de behöver inte egen funktion. Detta filter har en uppstartstid innan det rörliga genomsnittet representerar det för ingångssignalen Om du behöver kringgå den här uppstartstiden kan du bara initiera MovingAverage till det första värdet av newInput istället för 0, och hoppas att den första newInput inte är en outlier. CutoffFrequency SampleRate har ett intervall mellan 0 och 0 5 DecayFactor är ett värde mellan 0 och 1, vanligen nära 1.Single-precision floats är tillräckligt bra för de flesta saker, jag föredrar bara dubbelar. Om du behöver hålla fast med heltal kan du konvertera DecayFactor och Amplitude Factor till fraktionella heltal, där täljaren lagras som heltalet och nämnaren är ett heltalseffekt på 2 så att du kan bitskiftas till höger som nämnaren i stället för att dela upp under filterslingan För Exempel om DecayFactor 0 99, och du vill använda heltal, kan du ställa DecayFactor 0 99 65536 64881 och sedan när du multiplicerar med DecayFactor i din filterslinga, skiftar du bara resultatet 16. För mer information om detta, en utmärkt bok som S online, kapitel 19 om rekursiva filter. PS För det Moving Average-paradigmet, kan ett annat sätt att ställa in DecayFactor och AmplitudeFactor som kan vara mer relevant för dina behov, låt oss säga att du vill ha föregående, ca 6 poster i genomsnitt tog Eter, gör det diskret, du lägger till 6 föremål och delas med 6, så du kan ställa in AmplitudeFactor till 1 6 och DecayFactor till 1 0 - AmplitudeFactor. answered 14 maj 12 på 22 55. Alla andra har kommenterat noggrant på verktyget Av IIR vs FIR, och på power-of-two-division Jag vill bara ge några detaljer om genomförandet Nedan fungerar det bra på små mikrokontroller utan FPU Det finns ingen multiplicering, och om du håller N en kraft av två delar hela divisionen Är encyklisk bitskiftning. Baskisk FIR-ringspuffbuffert håller en löpbuffert med de sista N-värdena och ett löpande SUM av alla värden i bufferten Varje gång ett nytt prov kommer in, subtrahera det äldsta värdet i bufferten från SUM , Ersätt det med det nya provet, lägg till det nya provet till SUM och mata ut SUM N. Modified IIR-ringbufferten, fortsätt SUM av de sista N-värdena Varje gång ett nytt prov kommer in, lägg till SUM-SUM N, lägg till det nya Prov och output SUM N. answered 28 aug 13 på 13 45. Om jag läser dig rätt beskriver du en första order IIR filtrera det värde du subtraherar är det t äldsta värdet som faller ut, men istället är det genomsnittet av tidigare värden Första ordningens IIR-filter kan säkert vara användbart men jag är inte säker på vad du menar när du föreslår att utgången är samma för alla periodiska signaler Vid en provkvot på 10 kHz matas en 100 Hz kvadratvåg i ett 20-stegs filter med en signal som stiger jämnt för 20 prover, sitter högt för 30, sjunker jämnt för 20 prover och sitter lågt för 30 En första ordning IIR filter supercat aug 28 13 vid 15 31. kommer att ge en våg som kraftigt börjar stiga och gradvis nivåer nära men inte vid ingångens maximala nivå, börjar sedan kraftigt falla och gradvis nivåer av nära men inte vid ingången minimum Mycket annorlunda beteende supercat Aug 28 13 på 15 32. Ett problem är att ett enkelt glidande medel kan eller inte kan vara användbart Med ett IIR-filter kan du få ett fint filter med relativt få beräkningar. Den FIR du beskriver kan bara ge dig en rektangel i tid - en sync i Freq - och du kan inte hantera sidloberna Det kan vara väl värt att kasta in ett fåtal heltal multipliceras för att göra det till en fin symmetrisk avstämningsbar FIR om du kan spara klockan ticks Scott Seidman Aug 29 13 på 13 50. ScottSeidman Nej behöver multipliceras om man helt enkelt har varje steg i FIR-enheten antingen mata in medelvärdet av inmatningen till det aktuella läget och dess tidigare lagrade värde och lagra sedan inmatningen om man har numeriskt område, man kan använda summan snarare än genomsnittet Oavsett om det S bättre än ett lådfilter beror på applikationen stegresponsen hos ett lådfilter med en total fördröjning på 1ms, till exempel, kommer att ha en otäck d2 dt spik när ingången ändras och igen 1ms senare men kommer att ha det minsta möjliga d dt för ett filter med totalt 1ms fördröjning supercat aug 29 13 på 15 25.As mikeselektronik sagt, om du verkligen behöver minska dina minnesbehov, och du tänker inte på att ditt impulsrespons är en exponentiell istället för en rektangulär puls, jag skulle gå för en exponentiell rörlig ave raser filter Jag använder dem i stor utsträckning Med den typen av filter behöver du inte någon buffert. Du behöver inte lagra N tidigare prover. Bara en Så, dina minneskrav skärs med en faktor N. Även du behöver inte någon division för det Endast multiplikationer Om du har tillgång till flytande punkträkning, använd flytande punktmultiplikationer Annars gör vi multipelantal och ändringar till höger Vi är dock 2012 och jag rekommenderar dig att använda kompilatorer och MCU som tillåter dig För att arbeta med flytande punkter. Förutom att vara mer minneseffektivt och snabbare behöver du inte uppdatera objekt i någon cirkulär buffert. Jag skulle säga att det också är mer naturligt eftersom ett exponentiellt impulsrespons matchar bättre hur naturen beter sig, i de flesta fall. ansvarad 20 april 12 på 9 59. Ett problem med IIR-filtret som nästan berört av olin och supercat men tydligen ignoreras av andra är att avrundningen introducerar en viss oriktighet och eventuellt bias trunkering förutsatt att N i en kraft av två och enbart heltalsräkningar används, växlingen höger eliminerar systematiskt LSB: erna i det nya provet. Det betyder att hur lång serien någonsin kan vara, kommer genomsnittsvärdet aldrig att ta hänsyn till dem. För exempel, anta en långsammare minskande serie 8,8,8 8,7,7,7 7,6,6 och antar att medelvärdet verkligen är 8 i början Fist 7-provet kommer att ge genomsnittet till 7, oavsett filterstyrkan Bara för ett prov Samma berättar för 6 osv. Tänk på motsatsen går serien upp. Medelvärdet kommer att förbli på 7 för alltid tills provet är stort nog för att få det att ändras. Naturligtvis kan du korrigera för bias genom att lägga till 1 2 N 2, men som vann t verkligen lösa precisionsproblemet i så fall kommer den minskande serien att stanna för alltid vid 8 tills provet är 8-1 2 N 2 För N 4 till exempel kommer något prov över noll att hålla medeltalet oförändrat. Jag tror en lösning för Det skulle innebära att man höll en ackumulator av de förlorade LSB: erna men jag gjorde inte det tillräckligt långt för att få kod redo, Och jag är inte säker på att det inte skulle skada IIR-strömmen i några andra fall av serier, till exempel om 7,9,7,9 skulle vara genomsnittliga till 8 då. Olin, din tvåstegskaskad skulle också behöva någon förklaring. Menar du att du håller två genomsnittsvärden med resultatet av den första matas in i den andra i varje iteration Vad är fördelen med detta.
Kalkylbladsimplementering av säsongjustering och exponentiell utjämning. Det är enkelt att utföra säsongsjustering och passa exponentiella utjämningsmodeller med Excel. Skärmbilderna och diagrammen nedan tas från ett kalkylblad som har ställts in för att illustrera multiplikativ säsongsjustering och linjär exponentiell utjämning på efter kvartalsvisa försäljningsdata från Outboard Marine. För att få en kopia av kalkylarkfilen själv, klicka här. Den version av linjär exponentiell utjämning som används här för demonstration är Brown s-versionen, bara för att den kan implementeras med en enda kolumn Av formler och det finns bara en utjämningskonstant för att optimera. Det är oftast bättre att använda Holt s-versionen som har separata utjämningskonstanter för nivå och trend. Prognosprocessen fortskrider enligt följande. Första gången är data säsongrensade ii, sedan genereras prognoser för Säsongsrensade data via linjär exponentiell utjämning och iii fin allierade är de säsongsrensade progn...
Comments
Post a Comment