Moving Media Class C ++


Nella mia applicazione di trading ho zecche dal vivo di prezzi delle azioni ho bisogno di mantenere SMA Sia s supporre che voglio SMA di 20 candele, dove la durata di ogni candela è di 10 secondi Questo significa that. Every 10 secondi ho checkpoint where. I vicino candela corrente e memorizzare prezzo medio per gli ultimi 10 secondi medio è di max - min 2.I avviare nuove candele e memorizzare ultimi price. I clean-up di aggiornamento candle. I obsoleto ultimo prezzo di corrente candela formare e ricalcolare SMA. So su ogni tick ho bisogno ricalcolare SMA Nella maggior parte dei casi solo prezzo dell'ultima candela è cambiato perché noi utilizzando ultimo prezzo una volta per 10 secondi ho bisogno di lavorare un po 'di più in più - ho bisogno di dimenticare media della candela obsoleto, e memorizzare media di candela appena creato. si può suggerire come implementare questo con minore latenza bassa latenza è primario requirement. asked 28 apr 14 ad 10 21.I non sono sicuro se questo è l'approccio si è alla ricerca di, ma qui è la pseudocodice per SMAs. Simple molto veloci media mobile. I supporre che i dati sono in arrivo sotto forma di un certo flusso e memorizzato nella locazione di memoria continuo almeno con continuamente modo addresses. That mappabili con due aggiunte e una moltiplicazione con 1 2000 è possibile generare successivi medie mobili per il nuovo ticks. Exponential media mobile Questa è una buona alternativa, come detto above. Here non davvero un N-giorni di media mobile E 'solo una ponderata in movimento weightage media with.87 agli ultimi N-giorni, in modo quasi N-giorni è più simile. Nota il compilatore optimizations. Do notare che attivando le opzioni di SSE o AVX se disponibili consentirà massiccio aumento di velocità di questi algoritmi come più calcoli possono essere sfornato in un unico cycle. I CPU che questo è realizzabile con boost come per. But ho davvero vorrebbe evitare l'uso di spinta googled e non trovato alcuna idonea o leggibile examples. Basically voglio monitorare la media mobile di un flusso continuo di un flusso di numeri in virgola utilizzando i più recenti numeri 1000 come un sample. What di dati è flottante il modo più semplice per raggiungere this. I sperimentato con l'utilizzo di un array circolare, media mobile esponenziale e una più semplice media mobile e ha scoperto che i risultati dalla matrice circolare adatta alle mie esigenze best. asked 12 giugno 12 a 4 38.If vostre esigenze sono semplice, si potrebbe anche provare a utilizzare un mobile esponenziale average. Put semplicemente, si effettua una variabile di accumulatori, e come il codice sia in ogni campione, il codice aggiorna l'accumulatore con il nuovo valore si sceglie un alpha costante che è compreso tra 0 e 1 , e calcolare this. You solo bisogno di trovare un valore di alfa in cui l'effetto di un determinato campione dura solo per circa 1000 samples. Hmm, io non sono sicuro che questo in realtà è adatto per voi, ora che io ho messo qui il problema è che 1000 è un piuttosto lunga finestra per una media mobile esponenziale io non sono sicuro che ci sia un alfa che avrebbe diffuso la media degli ultimi 1000 numeri, senza underflow nel calcolo in virgola mobile, ma se si voleva una media più piccolo, come 30 numeri o giù di lì, questo è un modo molto semplice e veloce da fare it. answered 12 giugno 12 alle 4 del 44. 1 sul tuo post la media mobile esponenziale può permettere l'alfa di essere variabile quindi questo permette di essere utilizzato per calcolare le medie di base volta ad esempio, byte per secondo Se il tempo dall'ultimo aggiornamento accumulatore è più di 1 secondo, si lascia alfa essere 1 0 in caso contrario, si può lasciare alfa essere usecs dall'ultimo aggiornamento 1000000 JXH 12 giugno 12 alle 6 del 21.Basically voglio tracciare il movimento media di un flusso continuo di un flusso di numeri in virgola utilizzando le più recenti 1000 numeri come sample. Note dati che il sotto aggiorna il totale come elementi come galleggiante aggiunto sostituito, evitando costose ON attraversamento per calcolare la somma - necessaria per la media - su demand. Total è fatto un parametro diverso da T a sostenere ad esempio con un lungo lungo quando per un totale di 1000 s lunga, un int per char s, o una doppia al totale galleggiante s. This è un po 'viziata in quel numsamples potrebbe andare passato INTMAX - se vi interessa si potrebbe usare un lungo unsigned long o utilizzare un membro di dati bool in più per registrare quando il contenitore viene prima riempita mentre numsamples ciclabili intorno la matrice miglior poi rinominato qualcosa di innocuo come pos. answered 12 giugno 12 alle 5 19.one assume quel campione operatore void T è in realtà vuoto oPless campione T operatore 8 14 giugno alle ore 11 52. oPless ahhh bene notato in realtà volevo dire per essere campione vuoto operatore T ma naturalmente si potrebbe usare qualsiasi notazione ti è piaciuto risolverà, grazie Tony D 8 14 giugno al 14 27.As altri hanno detto, si dovrebbe considerare un infinito filtro di risposta all'impulso IIR piuttosto che il filtro FIR risposta all'impulso finita si sta utilizzando ora c'è di più ad esso, ma a prima vista filtri FIR sono implementate come circonvoluzioni espliciti e IIR filtri con equations. The particolare filtro IIR io uso molto in microcontrollori è un unico polo filtro passa-basso Questo è l'equivalente digitale di un semplice filtro analogico RC Per la maggior parte delle applicazioni, questi avranno caratteristiche migliori rispetto al filtro di dialogo che si è con maggior uso di un filtro scatola che ho incontrato sono il risultato di qualcuno non prestare attenzione in classe elaborazione del segnale digitale, non come risultato di aver bisogno di loro particolari caratteristiche Se si desidera solo per attenuare le alte frequenze che si sa essere il rumore, un unico pole filtro passa-basso è meglio il modo migliore per attuare una digitalmente in un microcontrollore è usually. FILT - FILT FF NUOVO - FILT. FILT è un pezzo di stato persistente questa è l'unica variabile persistente è necessario calcolare questo filtro nuovo è il nuovo valore che il filtro viene aggiornato con questa iterazione FF è la frazione filtro che regola la pesantezza del Guardate filtro questo algoritmo e vedere che per FF 0 il filtro è infinitamente pesante dal momento che l'uscita non cambia mai per 1 FF, è davvero nessun filtro del tutto poiché l'uscita solo segue l'ingresso valori utili sono tra su piccoli sistemi si sceglie FF sia 1 2 N in modo che il moltiplicare per FF può essere realizzato come uno spostamento a destra di n bit per esempio, FF potrebbe essere 1 16 e moltiplicare per FF quindi un diritto spostamento di 4 bit, altrimenti questo filtro ha bisogno di un solo sottrarre e uno aggiuntivo, anche se i numeri di solito bisogno di essere più ampio rispetto al valore di input più precisione numerica in una sezione separata below. I solito prendere dC letture significativamente più veloci di quanto non sono necessari e applicare due di questi filtri in cascata Questo è l'equivalente digitale di due filtri RC in serie, e attenua di 12 dB ottava al di sopra della frequenza di rolloff Tuttavia, per le letture aD è di solito è più rilevante per guardare il filtro nel dominio del tempo, considerando la sua risposta al gradino Questo ti dice quanto velocemente il sistema vedrà un cambiamento quando la cosa si sta misurando changes. To facilitare la progettazione di questi filtri che significa solo raccogliere FF e decidere come molti di loro a cascata, che uso il mio programma FILTBITS di specificare il numero di bit di spostamento per ogni FF nella serie cascata di filtri, e si calcola la risposta al gradino e di altri valori in realtà io di solito eseguire questo tramite il mio PLOTFILT script wrapper questo viene eseguito FILTBITS, il che rende un file CSV, quindi traccia il file CSV, ad esempio, ecco il risultato di PLOTFILT 4 4. due parametri per PLOTFILT significa che ci saranno due filtri in cascata del tipo descritto sopra dei valori del 4 indicano il numero di bit di spostamento per realizzare il moltiplicare per FF il due valori FF sono quindi 1 16 in questo case. The traccia rossa è la risposta al gradino unità, ed è la cosa più importante da guardare ad esempio, questo indica che se l'ingresso cambia istantaneamente, l'uscita del filtro combinato si depositano 90 del nuovo valore in 60 iterazioni se vi interessa circa il 95 tempo di assestamento, allora si deve attendere circa 73 iterazioni, e per il 50 tempo di assestamento solo il 26 iterations. The traccia verde vi mostra l'output da un unico picco di piena ampiezza Questo ti dà un po ' idea della soppressione del rumore casuale sembra che nessun singolo campione causerà più di un 2 5 cambiamento nel blu traccia output. The è quello di dare una sensazione soggettiva di ciò che questo filtro fa con rumore bianco questo non è un test rigorosi poiché non vi è nessuna garanzia che cosa esattamente il contenuto era dei numeri casuali scelto come ingresso rumore bianco per questa esecuzione di PLOTFILT e 's solo per dare una sensazione di massima di quanto verrà schiacciata e come liscia is. PLOTFILT, forse FILTBITS, e un sacco di altra roba utile, in particolare per lo sviluppo del firmware PIC è disponibile in Strumenti di sviluppo PIC versione del software al download di software page. Added circa precision. I numerici vedere dai commenti e ora una nuova risposta che non vi è interesse a discutere del numero di bit necessari per implementare questo filtro nota che il moltiplicare per FF creerà Log 2 FF nuovi bit di sotto del punto binario su piccoli sistemi, FF è generalmente scelto come 1 2 N in modo che questo si moltiplicano sia effettivamente realizzato da uno shift verso destra di N bits. FILT è quindi di solito un punto fisso intero si noti che questo doesn t cambiare una delle matematica dal punto di vista, ad esempio il processore s, se si sta filtrando 10 letture AD bit e N 4 FF 1 16, allora avete bisogno di 4 bit di frazione al di sotto dei 10 bit letture intero aD quello più processori, si d essere facendo 16 le operazioni di interi bit a causa delle letture aD 10 bit in questo caso, si può ancora fare esattamente le stesse 16 opertions bit integer, ma iniziare con le letture aD sinistra spostato da 4 bit il processore doesn t conosce la differenza e doesn t bisogno di fare i calcoli su interi numeri interi a 16 bit funziona se li si considera di essere 12 4 punto fisso o veri e propri 16 numeri interi bit 16 0 fisso point. In generale, è necessario aggiungere N bit ciascuno dei poli filtro se don t desidera aggiungere rumore dovuto alla rappresentazione numerica nell'esempio precedente, il secondo filtro di due avrebbe dovuto avere 10 4 4 18 bit per non perdere le informazioni In pratica su un computer a 8 bit che significa che d usare i valori a 24 bit Tecnicamente solo il secondo polo di due avrebbe bisogno il valore più ampio, ma per semplicità firmware io di solito uso la stessa rappresentazione, e quindi lo stesso codice, per tutti i poli di un filter. Usually scrivo una subroutine o macro per eseguire l'operazione palo un filtro, quindi applicare che per ogni polo si tratti di una subroutine o una macro dipende dal fatto che i cicli o memoria di programma sono più importanti in quel particolare progetto in entrambi i casi, io uso uno stato zero per passare NEW nella macro subroutine, che aggiornamenti FILT, ma carica anche che nello stesso stato zero NUOVO era in questo modo è facile da applicare poli multipli in quanto la FILT aggiornata di un polo è il NUOVO del successivo Quando una subroutine, è utile avere un punto puntatore a FILT sul modo in, che viene aggiornata a poco dopo FILT sulla via d'uscita in questo modo la subroutine funziona automaticamente su filtri consecutivi in ​​memoria se chiamato più volte con una macro è don t bisogno di un puntatore da quando si passa l'indirizzo di operare su ogni iteration. Code Examples. Here è un esempio di una macro come descritto sopra per un PIC 18.And ecco un macro simile per un pic 24 o dsPIC 30 o 33.Both questi esempi sono implementate come macro utilizzando il mio PIC assemblatore preprocessore che è più capace di una delle strutture macro incorporati. clabacchio Un altro problema Avrei detto è l'implementazione del firmware È possibile scrivere un unico polo passa-basso filtro subroutine una volta, poi applicarlo più volte in realtà io di solito scrivere un tale subroutine per prendere un puntatore in memoria allo stato del filtro, poi lo hanno avanzare il puntatore in modo che possa essere chiamato in successione facilmente per realizzare multipolare filtra Olin Lathrop 20 apr 12 in 15 03.1 grazie mille per le vostre risposte - tutti loro ho deciso di utilizzare questo filtro IIR, ma questo filtro non viene utilizzato come un filtro standard LowPass, dal momento che ho bisogno di valori medi del contatore e confrontarli per rilevare i cambiamenti in un certo intervallo poiché questi valori van essere di dimensioni molto diverse a seconda dell'hardware ho voluto prendere una media in modo da essere in grado di reagire a questi Hardware cambiamenti specifici sensslen automaticamente 21 maggio 12 a 12 06.If si può vivere con la restrizione di una potenza di due serie di elementi a media cioè 2,4,8,16,32 ecc quindi il divario può facilmente ed efficacemente essere fatto su una bassa micro prestazioni senza divisione dedicata, perché può essere fatto come un scorrimento di bit ogni turno a destra è una potenza di due eg. The OP pensava di avere due problemi, che divide in un PIC16 e memoria per il suo anello di buffer Questa risposta dimostra che la divisione non è difficile Bisogna ammettere che non affronta il problema di memoria, ma il sistema SE permette risposte parziali, e gli utenti possono prendere qualcosa da ogni risposta per se stessi, o anche modificare e combinare altri s risposte Poiché alcune delle altre risposte richiedono un'operazione di divisione, hanno sono allo stesso modo incompleto in quanto non mostrano come realizzare in modo efficiente questo su un PIC16 Martin 20 aprile 12 al 13 01.There è una risposta per un vero e proprio movimento filtro a media filtro aka carro merci con requisiti di memoria meno, se don t mente downsampling E 's chiamato in cascata filtro integratore d'ape CIC l'idea è che si dispone di un integratore che si prende le differenze di un periodo di tempo, e il dispositivo di memoria di risparmio chiave è che da downsampling, è don t devono memorizzare ogni valore dell'integratore e ' può essere implementato usando la seguente pseudocode. Your efficace in movimento lunghezza media è di decimationFactor statesize ma avete solo bisogno di mantenere intorno campioni statesize Ovviamente è possibile ottenere prestazioni migliori se il statesize e decimationFactor sono potenze di 2, in modo che gli operatori di divisione e resto vengono sostituiti da turni e maschera-ands. Postscript sono d'accordo con Olin che si dovrebbe sempre prendere in considerazione semplici filtri IIR prima di un filtro a media mobile Se don t bisogno le frequenze-null di un filtro vagone, un 1-palo o basso 2 poli filtro passa probabilmente funzionerà fine. On d'altra parte, se si sta filtrando ai fini della decimazione prendendo un ingresso ad alta frequenza di campionamento e una media per l'utilizzo da parte di un processo a basso tasso di allora un filtro CIC può essere solo quello che stai cerca soprattutto se è possibile utilizzare statesize 1 ed evitare il ringbuffer tutto con un solo integratore precedente value. There s alcune analisi approfondita della matematica dietro utilizzando il filtro IIR del primo ordine che Olin Lathrop ha già descritto sopra sulla Digital Signal Processing scambio pila comprende un sacco di belle immagini l'equazione per questo IIR is. This filtro può essere implementato usando solo numeri interi e nessuna divisione utilizzando il seguente codice potrebbe essere necessario un po 'di debugging come stavo scrivendo da memory. This filtro approssima una media mobile delle ultime K campioni impostando il valore di alfa per 1 K fare questo nel codice precedente per definire ing BITS per LOG2 K, cioè per K 16 bit impostati a 4, per K 4 bit impostato su 2, ecc I ll verificare il codice elencato qui non appena ottengo un cambiamento e modificare questa risposta se needed. answered 23 giugno 12 alle 4 del 04.Here sa media unipolare filtro passa-basso in movimento, con CutoffFrequency frequenza di taglio molto semplice, molto veloce, grandi opere, e quasi nessuna memoria overhead. Note Tutte le variabili hanno portata al di là della funzione di filtro, ad eccezione del passato in newInput. Note si tratta di un unico filtro fase fasi multiple possono essere collegati in cascata insieme per aumentare la nitidezza del filtro Se si utilizza più di una fase, è ll essere necessario regolare DecayFactor quanto riguarda la Cutoff frequenza per compensate. And, ovviamente, tutto ciò che serve è quelle due righe posizionati ovunque, don t bisogno la propria funzione Questo filtro non hanno un tempo di ramp-up prima della media mobile rappresenta quella del segnale di ingresso Se è necessario bypassare quel tempo di accelerazione, si può solo inizializzare media mobile per il primo valore di newInput invece di 0, e spero che il primo isn t newInput un outlier. CutoffFrequency SampleRate ha una gamma compresa tra 0 e 0 5 DecayFactor è un valore compreso tra 0 e 1, di solito vicino ai carri 1.Single precisione sono abbastanza buono per la maggior parte delle cose, ho appena preferisco doppie Se avete bisogno di attaccare con numeri interi, è possibile convertire DecayFactor e ampiezza Factor in numeri interi frazionari, in cui il numeratore viene memorizzato come numero intero, ed il denominatore è una potenza intera di 2 in modo da poter bit-shift verso destra come denominatore piuttosto che dover dividere durante l'anello filtrante per esempio, se DecayFactor 0 99, e si desidera utilizzare gli interi, è possibile impostare DecayFactor 0 99 65536 64881 e poi ogni volta che moltiplicare per DecayFactor nel loop filtro, basta spostare il risultato più 16.For informazioni su questo, un ottimo libro che s on-line, il capitolo 19 sulla filters. PS ricorsive per lo spostamento di paradigma media, un approccio diverso per impostazione DecayFactor e AmplitudeFactor che può essere più rilevante per le vostre esigenze, lasciare s dire si desidera che i precedenti, circa 6 articoli in media insieme, facendo in modo discreto , si d aggiungere 6 articoli e dividere per 6, in modo da poter impostare la AmplitudeFactor a 1 6, e DecayFactor a 1 0 - AmplitudeFactor. answered 14 maggio 12 alla 22 55.Everyone altro ha commentato a fondo l'utilità di IIR vs FIR, e sul potere di due figli divisione I d appena piace dare dettagli un po 'implementazione il funziona bene su piccoli microcontrollori senza FPU ci s alcuna moltiplicazione di seguito, e se si mantiene N una potenza di due, tutta la divisione è po' a ciclo unico buffer circolare - shifting. Basic FIR tenere un tampone di corsa degli ultimi valori N, e una somma parziale di tutti i valori nel buffer Ogni volta che un nuovo campione entra, sottrarre il valore più vecchio nel buffer da SUM, sostituirlo con il nuovo campione, aggiungere il nuovo campione di SUM, e l'uscita SUM N. Modified IIR ring buffer mantenere una somma parziale degli ultimi N valori Ogni volta che un nuovo campione entra, SUM - SUM N, aggiungere il nuovo campione, e SUM uscita N. answered 28 agosto 13 al 13 45.If io vi sto leggendo in questo, si ri descrivendo un primo ordine IIR filtrare il valore si ri sottraendo isn t il valore più vecchio che sta cadendo fuori, ma è invece la media dei valori precedenti primo ordine filtri IIR possono certamente essere utili, ma non sono sicuro di cosa si intende quando si suggerisce che l'uscita è la stessa per tutti i segnali di questa in una frequenza di campionamento 10KHz, alimentando un onda quadra a 100Hz in un filtro casella 20-tappa produrre un segnale che aumenta in modo uniforme per 20 campioni, si trova in alto a 30, scende in modo uniforme per 20 campioni, e si siede basso per 30 a supercat filtro IIR del primo ordine 28 agosto 13 al 15 31.will produrre un'onda che inizia forte aumento e gradualmente stabilizza vicino ma non al massimo in ingresso, poi inizia bruscamente cadere e gradualmente livelli fuori vicino ma non al minimo ingresso in diverso comportamento Supercat 28 ago 13 ad 15 32.One problema è che una semplice media mobile può o non può essere utile con un filtro IIR, è possibile ottenere un bel filtro con relativamente pochi Calcoli La FIR si descrive può solo dare un rettangolo nel tempo - un sinc in freq - e si può t gestire i lobi laterali può essere valsa la pena di gettare in un paio di moltiplica interi per rendere un bel FIR sintonizzabile simmetrica se si può risparmiare l'orologio zecche Scott Seidman 29 agosto 13 al 13 50. ScottSeidman Non c'è bisogno di moltiplica se uno ha semplicemente ogni fase della FIR sia uscita la media del ingresso a tale fase e il suo valore memorizzato precedente, e quindi memorizzare l'ingresso se si ha la gamma numerica, si potrebbe utilizzare la somma piuttosto media Sia che s meglio di una scatola filtro dipende dall'applicazione la risposta di un filtro scatola con un ritardo totale di 1 ms, per esempio, avrà una brutta picco d2 dt quando il cambiamento di ingresso, e di nuovo 1ms tardi, ma avrà la minima possibile d dt per un filtro con un totale di 1ms Tempo Supercat 29 ago 13 ad 15 25. come ha detto mikeselectricstuff, se si ha realmente bisogno di ridurre le esigenze di memoria, e don t mente il tuo risposta all'impulso essere un esponenziale, invece di un impulso rettangolare, vorrei andare per un movimento filtro di media esponenziale li uso a lungo con quel tipo di filtro, don t bisogno di alcun tampone È don t devono conservare N passato campioni Solo uno Quindi, i tuoi requisiti di memoria vengono abbattuti da un fattore di N. Also, è don t bisogno di alcuna divisione per che solo moltiplicazioni Se si ha accesso a floating punto di aritmetica, utilizzare moltiplicazioni in virgola mobile in caso contrario, fare moltiplicazioni interi e turni a destra Tuttavia, siamo nel 2012, e vi consiglierei di usare compilatori e MCU che consentono di lavorare con numbers. Besides in virgola mobile essendo più memoria efficiente e più veloce è don t devono aggiornare gli elementi in ogni buffer circolare, direi che è anche più naturale perché una risposta all'impulso esponenziale corrisponde meglio il modo in cui la natura si comporta, nella maggior parte cases. answered 20 apr 12 in 9 59.One questione con il filtro IIR come quasi toccato da Olin e supercat ma apparentemente ignorato da altri è che l'arrotondamento introduce una certa imprecisione e potenzialmente polarizzazione troncamento supponendo che N è una potenza di due, e solo aritmetica intera viene utilizzato, lo spostamento a destra non elimina sistematicamente LSB del nuovo campione Ciò significa che per quanto tempo la serie potrebbe mai essere, la media non potrà mai prendere quelle in account. For esempio, si supponga una serie lentamente diminuendo 8,8,8 8,7,7,7 7,6,6 , e assumere la media è infatti 8 all'inizio il campione pugno 7 porterà la media di 7, qualunque sia la forza del filtro Solo per un campione Stessa storia per 6, ecc Ora pensare il contrario della serie va in su la media rimarrà accesa 7 per sempre, fino a quando il campione è abbastanza grande per farlo change. Of Naturalmente, è possibile correggere la distorsione con l'aggiunta di 1 2 N 2, ma che ha vinto t realmente risolvere il problema di precisione in quel caso la serie decrescente rimarrà per sempre a 8 fino a quando il campione è 08-01 FEBBRAIO N 2 per N 4 per esempio, qualsiasi campione sopra lo zero non mancherà di tenere i unchanged. I media ritengono una soluzione per questo implicherebbe tenere un accumulatore di LSB perduta, ma io didn t rendono abbastanza lontano per avere il codice pronto, e io non sono sicuro che non avrebbe danneggiato il potere IIR in alcuni altri casi di serie, per esempio se 7,9,7,9 sarebbe in media di 8 poi. Olin, il vostro cascata a due stadi anche avrebbe bisogno di qualche spiegazione vuoi dire che regge due valori medi con il risultato del primo alimentato nella seconda in ogni iterazione Che s il beneficio di questo.

Comments

Popular posts from this blog

Forex Trading Plattformen Vergleich

Forex Trading Live Profit

Semplice Mobile Media Demand Forecasting