Thursday, 3 August 2017

Efficiente Mobile Media Filtro


Attualmente sto sviluppando un sistema grafico LCD per visualizzare temperature, flussi, tensioni, potenza ed energia in un sistema a pompa di calore L'uso di un LCD grafico significa che metà del mio SRAM and.75 del mio flash sono stati utilizzati da un buffer di schermo e strings. I sto attualmente visualizzando minimo massimo valori medi per l'energia a mezzanotte quando il reset figura quotidiane, il sistema controlla se il consumo per il giorno è al di sopra o al di sotto del minimo precedente o al massimo, e memorizza il valore la media è calcolata dividendo il consumo di energia cumulativa per il numero di days. I vorrebbe visualizzare la media giornaliera nel corso dell'ultima settimana e il mese di 4 settimane per semplicità IEA media mobile Attualmente questo comporta il mantenimento di una matrice di valori per gli ultimi 28 giorni e calcolando una media sopra il tutta una serie di mensili e ultimi 7 giorni per weekly. Initially stavo facendo questo utilizzando una matrice di carri come l'energia è in forma 12 12kWh, ma questo è stato utilizzato 28 4 byte 112 byte 5 4 di SRAM I don t mente avendo solo un solo punto decimale di risoluzione, così ho cambiato usando uint16t e moltiplicando la cifra per 100 Ciò significa che 12 12 è rappresentato come 1212, e io dividere per 100 per dimensione del display purposes. The della matrice è ora fino a 56 byte molto better. There c'è modo banale per ridurre la cifra verso il basso per un uint8t che posso vedere che potrei tollerare la perdita di una posizione decimale 12 1 kWh invece di 12 12kWh, ma il consumo è spesso superiore al 25 5 kWh 255 rappresenta il valore più alto rappresentato dalla un intero senza segno Consumo 8 bit non è mai stata sotto i 10 0kWh o superiore a 35 0kWh, quindi in teoria potrei sottrarre 10 dalle cifre memorizzate, ma so che un giorno saremo superare questi limits. I poi testato il codice per il confezionamento di 9 bit I valori in un array questo dà una gamma di 0-51 2KWH e utilizza 32 byte in totale Tuttavia, l'accesso a una serie come questo è piuttosto lento, soprattutto quando si ha a iterare su tutti i valori per calcolare un average. So la mia domanda è - IS c'è un modo più efficiente di calcolare una media mobile con tre finestre - vita, 28 giorni e 7 giorni efficienza significa più piccolo in termini di utilizzo SRAM, ma senza la penalità di codice enorme Posso evitare di memorizzare tutti values. asked 7 marzo 14 a 8 32.I ve pensato e si è destra in modo che tecnicamente fa la mia risposta non corretta I m investire un po 'di tempo e pazienza in esso Forse qualcosa fuori dalla scatola mi farò sapere se vengo con qualcosa che facciamo qualcosa di simile a molto al mio posto di lavoro permettetemi di chiedere intorno ci scusiamo per la confusione Aditya Somani mar 8 14 a 17 15.is Esiste un modo più efficiente di calcolare una media mobile a 28 giorni e 7 giorni che hanno bisogno di ricordare 27 giorni di history. You potrebbe avvicinarsi sufficiente la memorizzazione di 11 valori anziché 28 valori, forse qualcosa like. In altre parole, invece di memorizzare ogni dettaglio di ogni giorno negli ultimi 27 giorni, un negozio di 7 o giù di lì valori di informazione quotidiana dettagliate per gli ultimi 7 giorni o giù di lì, e anche B Store 4 o giù di lì valori di informazioni totale o medio riassunto per ciascuno degli ultimi 4 o giù di lì weeks. I essenzialmente hanno una matrice di valori come this. The serie di cui sopra è semplificato, io sto raccogliendo 1 valore per millisecondo nel mio codice reale e ho bisogno di elaborare l'uscita su un algoritmo che ho scritto per trovare il picco più vicino prima di un punto nel tempo la mia logica non è riuscito perché nel mio esempio di cui sopra, 0 36 è il vero picco, ma il mio algoritmo sarebbe guardare indietro e vedere l'ultimo numero 0 25 come il picco, in quanto non vi SA riduce a 0 24 prima it. The obiettivo è quello di prendere questi valori e applicare un algoritmo per loro che li appianare un po 'in modo da avere i valori più lineari cioè mi piacerebbe miei risultati a essere sinuosa, non jaggedy. I già stati detto di applicare un filtro a media mobile esponenziale a miei valori Come posso fare questo E 'davvero difficile per me leggere equazioni matematiche, ho a che fare molto meglio con code. How faccio ad elaborare i valori nel mio array, l'applicazione di un calcolo della media mobile esponenziale a addirittura out. asked 8 febbraio 12 a 20 27.To calcolare una media mobile esponenziale è necessario mantenere uno stato in giro e avete bisogno di un parametro di sintonia Questo richiede un po 'di classe supponendo che si sta utilizzando Java 5 o later. Instantiate con il parametro di decadimento che si desidera può richiedere la sintonizzazione dovrebbe essere compreso tra 0 e 1 e quindi utilizzare media per filter. When la lettura di una pagina su qualche ricorrenza mathmatical, tutti si ha realmente bisogno di sapere quando trasformandolo in codice è che matematici come scrivere gli indici in array e sequenze con gli indici Essi ve poche altre notazioni pure, che doesn t aiuto Tuttavia, l'EMA è piuttosto semplice come avete solo bisogno di ricordare un valore vecchio non elementi di superfici sensibile complicate required. answered 8 febbraio 12 a 20 42. TKKocheran Praticamente Isn t è bello quando le cose possono essere semplici oppure con la nuova sequenza, ottenere un nuovo averager nota che i primi termini della sequenza media salteranno in giro un po 'a causa di effetti di bordo, ma si ottiene quelli con altre medie mobili troppo Tuttavia, un buon vantaggio è che si può avvolgere la logica di media mobile nel averager e sperimentare senza disturbare il resto del programma troppo Donal Fellows 9 febbraio 12 a 0 06.I sto avendo un momento difficile comprensione le vostre domande, ma cercherò di rispondere anyway.1 Se l'algoritmo trovato 0 25 invece di 0 36, allora è sbagliato è sbagliato perché presuppone un aumento o una diminuzione monotona che sta andando sempre verso l'alto o verso il basso andando sempre meno che non si media tutti i dati, i punti dati --- come li presenti --- non sono lineari Se davvero si vuole trovare il valore massimo tra due punti nel tempo, poi tagliare la matrice da Tmin a tmax e trovare il massimo di tale sottoarray. 2 Ora, il concetto di medie mobili è molto semplice immaginare che ho la seguente lista 1 4, 1 5, 1 4, 1 5, 1 5 posso liscia fuori prendendo la media di due numeri 1 45, 1 45, 1 45, 1 5 si noti che il primo numero è la media di 1 5 e 1 a 4 secondi e primi numeri della seconda nuova lista è la media di 1 a 4 e 1 5, terzo e secondo elenco vecchio terzo nuova lista la media di 1 5 e 1 4 quarto e terzo, e così via mi avrebbero reso periodo di tre o quattro, o n notare come il dato è molto più agevole un buon modo di vedere medie mobili sul posto di lavoro è quello di andare a Google Finance, selezionare un magazzino provare Tesla motori piuttosto volatili TSLA e cliccare su fattori tecnici in fondo grafico Select media mobile con un determinato periodo, e media mobile esponenziale a confrontare la loro media mobile differences. Exponential è solo un altro elaborazione di questo, ma pesi il più vecchio dei dati in meno rispetto alla nuova dati questo è un modo per polarizzare il livellamento verso il retro si prega di leggere la Wikipedia entry. So, questo è più di un commento di una risposta, ma la piccola casella di commento era solo per piccola buona luck. If si ri problemi con la matematica, si potrebbe andare con una media mobile semplice anziché esponenziale Così l'uscita si ottiene sarebbe stata l'ultima x termini diviso per x pseudocode. Note testato che sarà necessario per gestire le parti iniziali e finali dei dati poiché si può chiaramente t media il ultimi 5 termini quando si è sulla 2 ° dati indicano anche, ci sono modi più efficaci di calcolo di questo movimento importo medio somma - più antica più recente, ma questo è quello di ottenere il concetto di ciò che sta accadendo across. answered 8 febbraio 12 a 20 41. recentemente ho imparato a conoscere i progressi nella risposta a questo post e chiedevo come ho potuto usare per calcolare un movimento filtro di media in modo più efficiente di quello che ho proposto in questo post con filters. This spira è quello che ho finora Ci vuole una vista la matrice originale poi rotola nella misura necessaria e somma i valori kernel per calcolare la media sono consapevole che i bordi non vengono gestiti correttamente, ma posso prendersi cura di questo è seguito c'è un modo migliore e più veloce l'obiettivo è quello di filtrare grandi array in virgola mobile fino a 5000x5000 x 16 strati in dimensioni, un compito che è abbastanza lento at. Note che sto cercando per la connettività 8-vicino di casa, che è un filtro 3x3 prende la media di 9 pixel 8 attorno al pixel focale e cessionari tale valore al pixel nel nuovo Chiarimento image. EDIT su come vedo questo working. use stridetricks per generare una matrice come 0,1,2, 1,2,3, 2,3,4, che corrisponde alla riga superiore del il filtro kernel. Roll lungo l'asse verticale per ottenere la riga centrale del kernel 10,11,12, 11,12,13, 13,14,15 e inserirlo alla matrice mi sono messa in 1.Ripetere per ottenere il fondo fila del kernel 20,21,22, 21,22,23, 22,23,24 a questo punto, prendo la somma di ogni riga e dividerlo per il numero di elementi nel filtro, dandomi la media per ogni pixel, spostata di 1 riga e 1 Col, e con alcune stranezze intorno ai bordi, ma posso prendere cura di questo later. What speravo in un migliore utilizzo delle stridetricks per ottenere i valori 9 o la somma degli elementi del kernel direttamente , per l'intero array, o che qualcuno mi può convincere un altro più efficiente method. asked 8 febbraio 11 a 18 05.For quello che s vale la pena, qui s come si d fare usando trucchi Camminare a grandi passi fantasia stavo per pubblicare questo ieri , ma sono distratto dal lavoro effettivo. Paul mangiare entrambi hanno implementazioni belle utilizzando vari altri modi di fare questo solo per continuare a cose dalla domanda precedente, ho pensato che la d inserisco la N-dimensionale equivalent. You non sta andando ad essere in grado di battere in modo significativo funzioni per gli array 1D, tuttavia dovrebbe battere though. Moreover, se si sta cercando di ottenere una finestra mobile multidimensionale, si rischia di avere l'utilizzo della memoria saltare in aria ogni volta che inavvertitamente fare una copia della matrice mentre la serie di laminazione iniziale è solo una vista nella memoria della vostra matrice originale, qualsiasi passaggi intermedi che copiano la matrice farà una copia che è ordini di grandezza superiore a quella del matrice originale cioè Let s dire che si ri lavorando con un array originale 100x100 la vista in esso per una dimensione del filtro di 3,3 sarà 98x98x3x3 ma l'uso la stessa memoria come l'originale, tuttavia, tutte le copie utilizzerà la quantità di memoria che un allineamento completo 98x98x3x3 would. Basically, utilizzando trucchi Camminare a grandi passi folli è grande per quando si desidera vettorizzare le operazioni di movimentazione delle finestre su un unico asse di un ndarray rende davvero facile calcolare le cose come una deviazione standard in movimento, ecc con molto poco in testa Quando si desidera iniziare a fare questo lungo più assi, s possibile, ma si ri solito meglio con le funzioni più specializzate come etc. At ogni modo, qui s come si fa it. So ciò che otteniamo quando facciamo B rollingwindow una, filtsize è un array 8x8x3x3, che realtà è una vista nella stessa memoria, come la matrice 10x10 originale avremmo potuto utilizzare la stessa facilità dimensione del filtro diversa lungo diversi assi o gestito solo lungo gli assi selezionati di un array N-dimensionale cioè filtsize 0,3,0,3 su un array a 4-dimensionale ci darebbe un 6 view. we dimensionale possono quindi applicare una funzione arbitraria per l'ultimo asse più volte per calcolare in modo efficace le cose in un window. However in movimento, perché abbiamo ri memorizzare array temporanei che sono molto più grande della nostra matrice originale su ogni passo di media o std o qualsiasi altra cosa, questo non è affatto efficiente della memoria e 's anche non andare a essere terribilmente veloce, sia. la equivalente per ndimage è just. This sarà gestire una serie di condizioni al contorno, fare la sfocatura sul posto senza richiedere una copia temporanea dell'array, ed essere molto veloce a grandi passi trucchi sono un buon modo per applicare una funzione a una finestra in movimento lungo un asse, ma non sei un buon modo per farlo lungo più assi, usually. Just mia 0 02, in qualsiasi rate. Very ben messo a grandi passi trucchi sono un buon modo per applicare una funzione a una finestra si muove lungo un asse, ma non sei un buon modo per farlo lungo più assi, di solito E, naturalmente, la tua spiegazione della memoria saltare in aria è importante una sorta di riassunto dalla tua risposta, almeno per me, è don t andare a pescare troppo lontano, il fermo quarenteed è giá in SciPy Grazie mangiare 9 febbraio 11 a 16 37.Thanks, Joe, per questa risposta nel rollingwindow dovrebbe, se non il hasattr essere tornare rollingwindowlastaxis piuttosto che rollingwindow unutbu 12 febbraio 11 al 16 47.I non m familiarità sufficiente con Python di scrivere il codice per questo, ma i due migliori modi per accelerare circonvoluzioni è a uno separato filtro o di utilizzare il Fourier transform. Separated filtro di convoluzione è OMN, dove M ed N sono certo numero di pixel dell'immagine e il filtro, rispettivamente, dal medio filtraggio con un kernel a 3-by-3 è equivalente a filtraggio prima con un kernel a 3-by-1 e poi un kernel 1-by-3, è possibile ottenere 3 3 3 3,30 miglioramento della velocità da convoluzione consecutivi con due 1-d kernel questo ovviamente migliora come il kernel diventa più grande si può ancora essere in grado di usare i trucchi falcata qui, di course. Fourier Transform conv a, B equivale a IFFT FFT a convoluzione FFT B iea nello spazio diretto diventa una moltiplicazione nello spazio di Fourier, dove una è la vostra immagine e B è il filtro Dal momento che la moltiplicazione elemento-saggio del trasformate di Fourier richiede che a e B sono le stesse dimensioni, B è un array di dimensioni a con il kernel al centro dell'immagine e zeri in qualsiasi altro luogo per inserire un kernel 3-by-3 al centro di un array, potrebbe essere necessario pad a alla dimensione dispari seconda della implementazione della trasformata di Fourier, questo può essere molto più veloce rispetto alla convoluzione e se si applica lo stesso filtro più volte, è possibile pre-elaborazione FFT B risparmiando altri 30 di computazione time. answered 9 febbraio 11 a 15 27.For quello che s vale la pena, in pitone, questi sono implementate e, rispettivamente, Joe Kington 9 febbraio 11 a 15 44. Jonas raffreddare il metodo del filtro separati funziona bene, come dici tu fa risparmiare più tempo come la dimensione del kernel aumenta per un array 5000x5000, in una dimensione del kernel 11x11, io sono sempre 7 7s per convoluzione 2D utilizzando e 2 0s per due circonvoluzioni 1d utilizzando per la vostra seconda soluzione è quello B Benjamin 9 febbraio 11 al 16 02.One cosa che sto esigenze fiducioso da fissare è la sua opinione serie b. It ha pochi elementi dalla memoria allocato, quindi si otterrà crashes. Given la nuova descrizione del vostro algoritmo , la prima cosa che ha bisogno di fissaggio è il fatto che si sta a grandi passi al di fuori l'assegnazione di a. Because I m ancora non del tutto afferrare il metodo e non ci sembra essere modi più semplici per risolvere il problema, mi sto solo andando a mettere questo qui. che sembra proprio come l'approccio diretto l'unica operazione estranea è che ha allocare e popolare B solo una volta tutto l'aggiunta, la divisione e l'indicizzazione deve essere fatto a prescindere se si sta facendo 16 bande, è ancora solo necessario allocare B una volta se il vostro intento è quello di salvare un'immagine Anche se questo non è di aiuto, potrebbe chiarire il motivo per cui i don t capire il problema, o almeno servire come punto di riferimento per tempo gli incrementi nella velocità di altri metodi questo viene eseguito in 2 6 secondi sul mio computer portatile su una 5k x 5k serie di float64 s, 0 5 dei quali è la creazione di B. answered 8 febbraio 11 al 19 31.It non è forma così chiara alla sua domanda, ma io m assumendo ora che si ll piace a migliorare in modo significativo questo tipo di media. Ora, che tipo di miglioramenti delle prestazioni si sarebbe effettivamente expect. Update Prima di tutto, un avvertimento il codice in esso s stato attuale non adattarsi correttamente alla forma kernel però che non ci è la mia principale preoccupazione in questo momento in ogni caso l'idea è giá come adattare properly. I hanno appena scelto la nuova forma di 4D un intuitivo, per me è davvero senso pensare a un centro di kernel 2D essere centrato per ciascuna posizione della griglia di 2D originale A. But che shaping 4D non può in realtà essere il migliore credo che il vero problema qui è la performance di riassumere uno dovrebbe essere in grado di trovare migliore ordine del 4D a inorder di utilizzare pienamente le vostre macchine cache di architettura Tuttavia che l'ordine non può essere lo stesso per i piccoli array quale tipo di collabora con le vostre macchine cache e quelli più grandi, che don t almeno non così semplice manner. Update 2 Ecco una versione leggermente modificata di mf Chiaramente c'è di meglio per rimodellare a un array 3D e poi, invece di sommare solo fare prodotto scalare questo ha il vantaggio tutti così, che il kernel può essere arbitrario Tuttavia esso s ancora un po 'più lento 3x sulla mia macchina di Pauls aggiornato function. answered 8 febbraio 11 a 19 33.

No comments:

Post a Comment