Circolare Buffer Mobile Media


La Guida scienziato e ingegneri per Digital Signal Processing di Steven W. Smith, Ph. D. Capitolo 28: processori di segnali digitali processori di segnali digitali sono progettati per effettuare rapidamente filtri FIR e tecniche simili. Per capire l'hardware. dobbiamo prima comprendere gli algoritmi. In questa sezione faremo un elenco dettagliato dei passi necessari per implementare un filtro FIR. Nella prossima sezione vedremo come DSP sono progettati per eseguire queste operazioni nel modo più efficiente possibile. Per iniziare, abbiamo bisogno di distinguere tra l'elaborazione off-line e l'elaborazione in tempo reale. In elaborazione off-line, l'intero segnale di ingresso risiede nel computer allo stesso tempo. Ad esempio, un geofisico potrebbe utilizzare un sismografo per registrare il movimento terra durante un terremoto. Dopo l'agitazione è finita, le informazioni possono essere lette in un computer e analizzato in qualche modo. Un altro esempio di trasformazione off-line è l'imaging medico, come ad esempio la tomografia computerizzata e la risonanza magnetica. Il set di dati viene acquisita mentre il paziente è all'interno della macchina, ma la ricostruzione dell'immagine può essere ritardata fino un momento successivo. Il punto chiave è che tutte le informazioni sono disponibili contemporaneamente al programma di elaborazione. Questo è comune nella ricerca scientifica e di ingegneria, ma non in prodotti di consumo. Off-line di trasformazione è il regno dei personal computer e mainframe. In elaborazione in tempo reale, il segnale di uscita viene prodotto nello stesso tempo che il segnale di ingresso viene acquisita. Ad esempio, questo è necessario in comunicazione telefonica, apparecchi acustici, e radar. Queste applicazioni devono avere le informazioni immediatamente disponibile, anche se può essere ritardato di un breve periodo. Per esempio, un ritardo di 10 millisecondi in una chiamata di telefono non può essere rilevato dal diffusore o ascoltatore. Analogamente, non fa differenza se un segnale radar è ritardato di alcuni secondi prima di essere visualizzato all'operatore. Real-time input applicazioni un campione, eseguire l'algoritmo, e l'uscita di un campione, over-and-over. In alternativa, possono inserire un gruppo di campioni, eseguire l'algoritmo, e l'uscita di un gruppo di campioni. Questo è il mondo di Digital Signal Processors. Ora guardare indietro a Fig. 28-2 e immaginare che questo è un filtro FIR attuate in tempo reale. Per calcolare il campione di uscita, dobbiamo avere accesso ad un certo numero dei più recenti campioni provenienti dall'ingresso. Ad esempio, supponiamo di utilizzare otto coefficienti in questo filtro, un 0. un 1. hellip un 7. Questo significa che dobbiamo conoscere il valore degli otto più recenti campioni del segnale di ingresso, x n, x n -1, hellip x n -7. Questi otto campioni devono essere conservati nella memoria e continuamente aggiornati nuovi campioni vengono acquisiti. Qual è il modo migliore per gestire questi campioni conservati la risposta è buffer circolare. La figura 28-3 illustra un buffer circolare di otto campioni. Abbiamo messo questo buffer circolare in otto locazioni di memoria consecutive, 20041 a 20048. figura (a) mostra come gli otto campioni provenienti dall'ingresso possono essere conservati a un particolare istante di tempo, mentre (b) mostra le modifiche dopo il campione successivo è acquisita. L'idea di buffer circolare è che la fine di questo array lineare è collegato alla sua posizione di memoria che inizia 20041 è visto come essere accanto a 20048, così come 20044 è vicino al 20045. a tenere traccia della matrice da un puntatore (una variabile il cui il valore è un indirizzo) che indica dove risiede il campione più recente. Per esempio, in (a) il puntatore contiene l'indirizzo 20044, mentre in (b) contiene 20045. Quando un nuovo campione viene acquisito, sostituisce il più vecchio campione nella matrice, e il puntatore viene spostato di un indirizzo avanti. buffer circolari sono efficienti perché solo valore deve essere cambiata quando un nuovo campione viene acquisito. Quattro parametri sono necessari per gestire un buffer circolare. Innanzitutto, ci deve essere un puntatore che indica l'inizio del buffer circolare in memoria (in questo esempio, 20041). In secondo luogo, ci deve essere un puntatore che indica la fine della matrice (ad esempio 20048), o una variabile che tiene la sua lunghezza (ad esempio 8). Terzo, è necessario specificare la dimensione del passo di indirizzamento di memoria. In Fig. 28-3 il passo è uno. per esempio: Indirizzo 20043 contiene un campione, affrontare 20044 contiene il campione successivo, e così via. Questo non è frequente il caso. Per esempio, l'indirizzamento possono riferirsi a byte, e ciascun campione possono richiedere due o quattro byte per contenere il suo valore. In questi casi, la dimensione del passo avrebbe bisogno di essere rispettivamente due o quattro,. Questi tre valori definiscono la dimensione e la configurazione del buffer circolare, e non cambia durante il funzionamento del programma. Il quarto valore, il puntatore al campione più recente, deve essere modificata come ciascun nuovo campione viene acquisito. In altre parole, ci deve essere logica di programma che controlla come questo quarto valore viene aggiornato in base al valore dei primi tre valori. Mentre questa logica è abbastanza semplice, deve essere molto veloce. Questo è il punto centrale di questo DSP discussione dovrebbe essere ottimizzato alla gestione buffer circolari per ottenere la massima velocità di esecuzione possibile. Per inciso, il buffer circolare è anche utile nel trattamento off-line. Si consideri un programma in cui sia l'ingresso ed i segnali di uscita sono completamente contenuti nella memoria. buffer circolare è neanche necessario per un calcolo convoluzione, perché ogni campione può essere immediatamente accessibile. Tuttavia, molti algoritmi sono implementati in fasi. con un segnale intermedio da creare in ciascuna fase. Per esempio, un filtro ricorsivo eseguito come una serie di biquads funziona in questo modo. Il metodo di forza bruta è memorizzare l'intera lunghezza di ciascun segnale intermedio in memoria. buffer circolare fornisce un'altra opzione: Conservare solo quei campioni intermedi necessari per il calcolo a portata di mano. Questo riduce la quantità di memoria richiesta, a scapito di un algoritmo più complesso. L'idea fondamentale è che buffer circolari sono utili per l'elaborazione off-line, ma critico per applicazioni in tempo reale. Ora possiamo guardare i passaggi necessari per implementare un filtro FIR con buffer circolari sia per il segnale di ingresso e dei coefficienti. La lista può sembrare banale e overexamined - la sua non è la gestione efficiente di queste singole attività è ciò che separa un DSP da un microprocessore tradizionale. Per ogni nuovo campione, tutte le seguenti operazioni devono essere prese: l'obiettivo è quello di rendere questi passaggi eseguire rapidamente. Dal momento che passi 6-12 saranno ripetuti più volte (una volta per ogni coefficiente nel filtro), particolare attenzione deve essere data a queste operazioni. microprocessori tradizionali devono in genere effettuare questi 14 passaggi in serie (uno dopo l'altro), mentre DSP sono progettati per eseguire in parallelo. In alcuni casi, tutte le operazioni all'interno del ciclo (punti 6-12) può essere completato in un unico ciclo di clock. Vediamo l'architettura interna che permette questo magnifico performance. I non hanno un indizio circa buffer circolari In termini di linguaggio C nel contesto del tuo incarico: un bufferquot quotcircular è un array. Si inizia mettendo le cose in elemento zero e incrementa l'indice per il prossimo accesso. Quando l'indice diventa maggiore del più grande valore ammissibile (cioè: l'accesso successivo andrebbe oltre la fine dell'array) è sufficiente impostare l'indice a zero. Ciò significa che, dopo che il buffer è pieno (il programma ha scritto qualcosa in ogni elemento dell'array) ulteriori accessi sovrascrive il valore precedente di ciascun indirizzo. Questo ha l'effetto di sostituire il valore più vecchio dal valore più recente ogni volta, e la media di tutti gli elementi della matrice utilizza sempre i valori campione più recenti. Per esempio per un buffer circolare di int: Certo, voi non realmente bisogno di una variabile separata denominata MaxIndex, ma ho scritto fuori per dare enfasi. (Cioè: semplicemente confrontare currentindex con BUFFERSIZE-1.) Originariamente Scritto da tellthatmatt domanda veloce, c'è qualche funzione dedicata di farmi prendere la media di un array o avrei codificare con l'aggiunta di tutti gli elementi insieme amp dividendo . Si chiama un ciclo. (Non una funzione, ma ci sono diverse built-in costrutti di controllo per la creazione di loop). Se si sa che si sta per fare qualcosa di esattamente n volte, poi il ciclo può apparire come segue: Supponiamo di avere una matrice, x, di dieci numeri doppia precisione e si vuole trovare la somma dei loro valori (vale a dire: si desidera che la somma x0 x1 x2 x9.). Poi si potrebbe fare in questo modo: Originalmente inviato da tellthatmatt che cosa è il modo migliore per leggere i numeri interi dal file in questo caso si havnt ancora coperte presente in classe ampli mio libro di testo doesnt spiegare molto bene a tutti. penso che sia qualcosa a che fare con la funzione fgetsc (), ma non sono sicuro. il resto del mio programma funziona bene, ho solo non so come leggere i numeri interi dal file di testo Se il file di testo contiene interi quindi fscanf () è probabilmente il modo più semplice ed è, a mio parere, la più appropriata. (Ma ci sono altri modi.) Quando si utilizza fscanf (), si dà l'indirizzo (i) di qualsiasi variabile (s) che si sta leggendo in. Il valore di ritorno della fscanf è il numero di elementi che sono stati convertiti con successo. Si dovrebbe sempre (sempre) verificare il valore di ritorno. Per esempio, se si desidera leggere il valore in un unico valore: questo è solo un test per mostrare ciò che ha cercato di spiegare. fscanf () non riuscirà (vale a dire, il suo valore sarà pari a zero), se cant convertire roba per un int --- cioè incontra un carattere che non è uno spazio e non è una cifra decimale da 0 a 9. Non riesce anche se tenta di leggere oltre la fine del file. Se si vuole leggere un valore in un elemento di un array, poi basta dare scanf l'indirizzo dell'elemento. Se volete leggere l'intero contenuto dei file in un array intero utilizzato come buffer circolare: segnale buffer circolare flowgraphs rubinetti filettati linea di ritardo auto-regressiva spostando le tre parole di memoria sono messi in un'area organizzata come un buffer circolare. L'ingresso viene scritto la parola evidenziato dall'indice e tre valori precedenti dell'ingresso vengono letti con i tre valori precedenti dell'indice. Ad ogni istante di campionamento, i quattro indici vengono incrementati di uno, con il trucco di inizio dalla posizione 0 quando si supera la lunghezza M del buffer (questo assicura la circolarità del buffer). La freccia indica la direzione in senso antiorario preso dagli indici, mentre la freccia indica il movimento in senso orario che dovrebbe essere fatto dai dati se gli indici sarebbero rimanere in una posizione fissa. In fig. 13 usiamo triangolini per indicare le moltiplicazioni per i coefficienti del filtro. Questa è una notazione comunemente usato per moltiplicazioni nei flowgraphs segnali che rappresentano filtri digitali. È un dato di fatto, un filtro FIR contiene una linea di ritardo poiché memorizza campioni consecutivi N della sequenza di ingresso e utilizza ciascuno con un ritardo di N campioni al massimo. I punti in cui viene letto il buffer circolare vengono chiamati i rubinetti e l'intera struttura è chiamato una linea di ritardo filettato. In generale, un filtro IIR causale è rappresentata da un'equazione differenza in cui il segnale di uscita in un dato istante è ottenuto come combinazione lineare dei campioni di ingresso e segnali di uscita a precedenti istanti di tempo. Inoltre, una dipendenza istantanea dell'uscita sull'ingresso è anche generalmente incluso nel filtro IIR. L'equazione differenza che rappresenta un filtro IIR è Eq. (24) è chiamato anche Auto-regressivo media mobile (ARMA) rappresentazione. Mentre la risposta all'impulso di filtri FIR ha un'estensione tempo finito, la risposta all'impulso di filtri IIR ha, in generale, un'estensione infinita. La funzione di trasferimento è ottenuto applicando il trasformata Z alla sequenza (24). In virtù del teorema di spostamento, la trasformata Z è una semplice sostituzione operatoriale di ogni traduzione per m campioni con una moltiplicazione per z Il risultato è la funzione H razionale (z) che riguarda la Z trasformata di uscita alla Z trasformata della ingresso: l'ordine del filtro è definita come il grado del polinomio in z il filtro IIR Simplest in questa sezione analizziamo le proprietà del semplice filtro IIR banale che si possa concepire: il filtro unipolare avente coefficienti AIM attuazione di un 80-72 -64-48 Multi passaggio in movimento filtro media per un sistema embedded in C e in punto fisso. L'implementazione è un buffer circolare dove im mantenendo una somma parziale e calcolando yn yn-1 xn - xn-M, dove M è la lunghezza di un filtro. Questo viene fatto per ogni sotto filtro con l'uscita da uno che serve come input per un altro. Im scalatura miei coefficienti da 2 che mi dà coefficienti di lunghezza 2 o 2 a seconda della lunghezza del filtro. Poi il risultato è ridotta di nuovo per 2 per ottenere l'output corretto. Ora, tutto sembra a posto su scale temporali brevi ma su tempi lunghi ottengo una deriva. La ragione per l'implementazione ricorsiva è salvare calcoli su un processore incorporato. Ho incluso immagine di alcune funzioni interne del mio filtro, questo è quando viene applicata una risposta al gradino e possiamo vedere le funzioni di trasferimento dei filtri prendendo forma, quadrato, triangolo, allora approssimare una gaussiana modo il filtro funziona come previsto. C'è un modo per risolvere questo problema, e dove è la fonte più probabile di questo. è questa deriva a causa di un po 'perdersi in spostamento o qualcos'altro. La deriva non è presente per ingressi CC, ma per segnali in corrente alternata che scivola lentamente. SOLUZIONE: Il problema era nell'accumulatore come robert suggerito nei commenti. Il problema era che uno degli elementi del calcolo aveva attraversato un turno in più su e giù rispetto al resto, che ha creato compensato un giro che si sono accumulati. ha chiesto 27 aprile 15 al 21:12 è il vostro accumulatore yn essere arrotondato o quantizzati in qualsiasi modo è necessario assicurarsi che il xn-M che viene sottratto è esattamente lo stesso valore di Xn che è stato aggiunto M campioni fa. così si vuole veramente fare una somma in movimento. piuttosto che una media mobile e scalare l'uscita del vostro somma mobile (con 1M) per ottenere la media. questo è abbastanza fattibile e anche meglio fatto a virgola fissa e non a virgola mobile. ndash Robert Bristow-Johnson 27 aprile 15 al 22:52 quotScaling la coefficientsquot presumo che si divide dal M dopo ogni tappa e che è il coefficiente di cui si scala che è probabilmente la causa dello spostamento. Meglio allora dividere per prod Mi alla fine di tutti i filtri. È necessario tenere traccia delle ampiezze interne anche se, come vi troverete infine traboccare gli accumulatori. Tuttavia, questo è facilmente risolto attraverso modulo aritmetica (di cui two39s complemento è un caso speciale). ndash Oscar 28 Aprile 15 alle 7:00 Oscar, questo è un filtro punto fisso. Significato faccio solo l'aritmetica intero. Per una media mobile di lunghezza GT 1 con guadagno 1 le costanti di filtrazione sarà una frazione che non è rappresentabile in numeri interi. Così i coefficienti vengono scalati per farli interi da sinistra spostando loro x molti bit. Per questo motivo l'output finale deve essere spostato e verso destra da altrettanti bits. I non può tenere una somma che attraversa tutti i 4 filtri senza ripristinare l'uscita tra il segnale di ingresso è di 16 bit e con la scala dei coefficienti e lunghezze un singolo filtro utilizza tutto il mio spazio accumulatore di 32 bit ndash user70614 28 Aprile 15 alle 8:20

Comments

Popular Posts