buffer
Convertitore del vettore del segnale in una matrice di frame di dati
Sintassi
Descrizione
Esempi
Crea un buffer contenente 100 frame, ciascuno con 10 campioni.
data = buffer(1:1000,10);
Si considerino i frame (colonne) nella matrice data come le uscite sequenziali di una scheda di acquisizione dati che campiona un segnale fisico: data(:,1) è la prima uscita A/D, contenente i primi 11 campioni del segnale, data(:,2) è la seconda uscita, contenente i successivi 11 campioni del segnale, e così via.
Si desidera ribufferare questo segnale dalla dimensione del frame acquisito di 11 a una dimensione del frame di 4 con una sovrapposizione di 1. Chiamare buffer per operare su ogni frame di input successivo, utilizzando il parametro opt per mantenere la coerenza nella sovrapposizione da un buffer all'altro.
Imposta i parametri del buffer. Specificare un valore di –5 per y(1). Il vettore di riporto è inizialmente vuoto.
n = 4; p = 1; opt = -5; z = [];
Ora chiama ripetutamente buffer, passando ogni volta un nuovo frame di segnale (colonna) da data. I campioni in eccesso (restituiti in z) vengono trasferiti e anteposti all'input nella successiva chiamata a buffer.
Per le prime quattro iterazioni, mostra il frame di input [z;x]', i valori di input e output di opt, il buffer di output y e l'overflow z. La dimensione della matrice di output, y, può variare di una singola colonna da un'iterazione all'altra. Questo è tipico delle operazioni di buffering con sovrapposizione o sottosquadro.
for i = 1:size(data,2) x = data(:,i); [y,z,oppt] = buffer([z;x],n,p,opt); if i <= 4 disp("Iteration " + i) ifrm = [z;x]' opts = [opt oppt] y z disp("-----------") end opt = oppt; end
Iteration 1
ifrm = 1×11
10 1 2 3 4 5 6 7 8 9 10
opts = 1×2
-5 9
y = 4×3
-5 3 6
1 4 7
2 5 8
3 6 9
z = 10
-----------
Iteration 2
ifrm = 1×12
19 20 11 12 13 14 15 16 17 18 19 20
opts = 1×2
9 18
y = 4×3
9 12 15
10 13 16
11 14 17
12 15 18
z = 2×1
19
20
-----------
Iteration 3
ifrm = 1×10
21 22 23 24 25 26 27 28 29 30
opts = 1×2
18 30
y = 4×4
18 21 24 27
19 22 25 28
20 23 26 29
21 24 27 30
z = 0×1 empty double column vector
-----------
Iteration 4
ifrm = 1×11
40 31 32 33 34 35 36 37 38 39 40
opts = 1×2
30 39
y = 4×3
30 33 36
31 34 37
32 35 38
33 36 39
z = 40
-----------
Crea un buffer contenente 100 frame, ciascuno con 9 campioni.
data = buffer(1:900,9);
Prendi data(:,1) come prima uscita A/D, contenente i primi 11 campioni del segnale, data(:,2) come seconda uscita, contenente i successivi 11 campioni del segnale, e così via.
Si desidera ribufferare questo segnale dalla dimensione del frame acquisito di 11 a una dimensione del frame di 4 con un underlap di 2. Per fare ciò, richiamerai ripetutamente buffer per operare su ogni frame di input successivo, utilizzando il parametro opt per mantenere la coerenza nella sovrapposizione tra un buffer e l'altro.
Imposta i parametri del buffer. Specificare una nuova dimensione del frame pari a 4 e una sovrapposizione inferiore di –2. Salta il primo elemento di input, x(1), impostando opt a 1. Il vettore di riporto è inizialmente vuoto.
n = 4; p = -2; opt = 1; z = [];
Ora chiama ripetutamente buffer, passando ogni volta un nuovo frame di segnale (colonna) da data. I campioni in eccesso (restituiti in z) vengono trasferiti e anteposti all'input nella successiva chiamata a buffer.
Per le prime tre iterazioni, mostra il frame di input [z';x]', i valori di input e output di opt, il buffer di output y e l'overflow z. La dimensione della matrice di output, y, può variare di una singola colonna da un'iterazione all'altra. Questo è tipico delle operazioni di buffering con sovrapposizione o sottosquadro.
for i = 1:size(data,2) x = data(:,i); [y,z,oppt] = buffer([z';x],n,p,opt); if i <= 3 disp("Iteration "+ i) ifrm = [z';x]' opts = [opt oppt] y z disp("-----------") end opt = oppt; end
Iteration 1
ifrm = 1×11
8 9 1 2 3 4 5 6 7 8 9
opts = 1×2
1 0
y = 4×1
2
3
4
5
z = 1×2
8 9
-----------
Iteration 2
ifrm = 1×9
10 11 12 13 14 15 16 17 18
opts = 1×2
0 1
y = 4×2
8 14
9 15
10 16
11 17
z = 1×0 empty double row vector
-----------
Iteration 3
ifrm = 1×11
26 27 19 20 21 22 23 24 25 26 27
opts = 1×2
1 0
y = 4×1
20
21
22
23
z = 1×2
26 27
-----------
Argomenti di input
Segnale di ingresso, specificato come vettore.
Lunghezza del frame, specificata come uno scalare intero positivo.
Numero di campioni sovrapposti o sottosquadrati, specificato come scalare intero.
Per
0<p<n(sovrapposizione),bufferripete gli ultimipcampioni di ogni frame all'inizio del frame successivo. Ad esempio, sex=1:30en=7, una sovrapposizione dip=3appare in questo modo.Il primo frame inizia con
pzeri (la condizione iniziale predefinita) e il numero di colonne inyèceil(L/(n-p)).Per
p<0(underlap),buffersaltapcampioni tra fotogrammi consecutivi. Ad esempio, sex=1:30en=7, un buffer con sottosquadro dip=-3ha questo aspetto.Il numero di colonne in
yèceil(L/(n-p)).
Opzione, specificata come vettore o numero intero.
Per
0<p<n(sovrapposizione),optspecifica un vettore di lunghezzapda inserire prima dix(1)nel buffer. Questo vettore può essere considerato una condizione iniziale, necessaria quando l'operazione di buffering corrente è una di una sequenza di operazioni di buffering consecutive. Per mantenere la sottosovrapposizione dei frame da un buffer all'altro,optdeve contenere gli ultimipcampioni del buffer precedente nella sequenza. Vedi Buffering continuo qui sotto.Per impostazione predefinita,
optèzeros(p,1)per un buffer con sottosovrapposizione. Impostaoptsu"nodelay"per saltare la condizione iniziale e iniziare subito a riempire il buffer conx(1). In questo caso,Ldeve esserelength(p)o più lungo. Ad esempio, sex=1:30en=7, un buffer con sovrapposizione dip=3ha questo aspetto.Per
p<0(underlap),optè un valore intero nell'intervallo[0,-p]che specifica il numero di campioni di input iniziali,x(1:opt), da saltare prima di aggiungere campioni al buffer. Il primo valore nel buffer è quindix(opt+1). Per impostazione predefinita,optè zero per un buffer con sottosovrapposizione.Questa opzione è particolarmente utile quando l'operazione di buffering corrente fa parte di una sequenza di operazioni di buffering consecutive. Per mantenere la sottosovrapposizione dei frame da un buffer all'altro,
optdeve essere uguale alla differenza tra il numero totale di punti da saltare tra i frame (p) e il numero di punti che erano disponibili da saltare nell'input precedente abuffer. Se l'input precedente conteneva meno dippunti che potevano essere saltati dopo aver riempito l'ultimo frame di quel buffer, i restantioptpunti devono essere rimossi dal primo frame del buffer corrente. Per un esempio pratico, consultare Buffering continuo.
Argomenti di output
Data frame, restituito come matrice. Ogni data frame occupa una colonna di y, che ha n righe e ceil(L/n) colonne. Se L non è divisibile per n, l'ultima colonna viene riempita con zeri fino a raggiungere la lunghezza n.
Se
yè un buffer con sottosovrapposizione, hanrighe emcolonne, dovem = floor(L/(n-p))quandolength(opt) = pom = ceil((L-p)/(n-p))quandoopt = "nodelay".Se
yè un buffer con sottosovrapposizione, hanrighe emcolonne, dovem = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p)) >= n).
I campioni rimanenti vengono restituiti come vettore. Se il numero di campioni nel vettore di input (dopo le opportune operazioni di sovrapposizione o sottosquadro) supera il numero di posizioni disponibili nel buffer n-per-m, i campioni rimanenti in x vengono inviati nel vettore z, che per un buffer di sovrapposizione ha lunghezza L - m*(n-p) quando length(opt) = p o L - ((m-1)*(n-p)+n) quando opt = "nodelay", e per un buffer di sottosquadro ha lunghezza (L-opt) - m*(n-p).
Se
yè un buffer con sottosovrapposizione o un buffer non sovrapposto, allorazha lo stesso orientamento (riga o colonna) dix.Se
yè un buffer con sottosovrapposizione, allorazviene restituito come vettore riga.
Se dopo aver riempito il buffer con la sovrapposizione o la sottosovrapposizione specificata non rimangono campioni nell'input, z è un vettore vuoto.
Ultimi campioni p, restituiti come vettore. In un buffer con sottosovrapposizione, opt è la differenza tra il numero totale di punti da saltare tra i frame (-p) e il numero di punti in x che erano disponibili per essere saltati dopo aver riempito l'ultimo frame. In una sequenza di operazioni di buffering, l'output opt di ciascuna operazione deve essere utilizzato come input opt per l'operazione di buffering successiva. Ciò garantisce che la sovrapposizione o la sottosquadratura desiderata dei fotogrammi venga mantenuta da un buffer all'altro, nonché da un fotogramma all'altro all'interno dello stesso buffer. Per un esempio pratico, consultare Buffering continuo.
Per
0<p<n(sovrapposizione),opt(come output) contiene i campioni finalipnell'ultimo frame del buffer. Questo vettore può essere utilizzato come condizione iniziale per una successiva operazione di buffering in una sequenza di operazioni di buffering consecutive. Ciò consente di mantenere la sovrapposizione dei frame desiderata da un buffer all'altro.Per
p<0(sottoscorrimento),opt(come output) è la differenza tra il numero totale di punti da saltare tra i frame (p) e il numero di punti inxche erano disponibili per essere saltati dopo aver riempito l'ultimo frame:opt = m*(n-p) + opt - L, doveopta destra è l'argomento di input perbuffereopta sinistra è l'argomento di output.zè il vettore vuoto. Quimè il numero di colonne nel buffer, conm = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p))>=n).Si noti che per un'uscita buffer sovrapposta,
optè sempre zero quando l'uscitazcontiene dati.L'output
optper un buffer con sottosovrapposizione è particolarmente utile quando l'operazione di buffering corrente è una di una sequenza di operazioni di buffering consecutive. L'outputoptdi ogni operazione di buffering specifica il numero di campioni che devono essere saltati all'inizio dell'operazione di buffering successiva per mantenere la sottosovrapposizione dei frame desiderata da un buffer all'altro. Se dopo aver riempito l'ultimo frame del buffer corrente sono disponibili meno dippunti da saltare, i restantioptpunti devono essere rimossi dal primo frame del buffer successivo.
Diagnostica
Vengono visualizzati messaggi di errore quando p ≥ n o length(opt) ≠ length(p) in un caso di buffer sovrapposto:
La sovrapposizione dei frame P deve essere inferiore alla dimensione del buffer N.<xid="1"></x>Le condizioni iniziali devono essere specificate come un vettore di lunghezza P.
Ulteriori informazioni
In un'operazione di buffering continuo, il vettore di input della funzione buffer rappresenta un frame in una sequenza di frame che costituiscono un segnale discreto. Questi frame di segnale possono avere origine in un processo di acquisizione dati basato su frame, oppure all'interno di un algoritmo basato su frame come la FFT.
Ad esempio, è possibile acquisire dati da una scheda A/D in frame da 64 campioni. Nel caso più semplice, si potrebbero riorganizzare i dati in frame da 16 campioni; buffer con n = 16 crea un buffer di quattro frame da ogni frame di input a 64 elementi. Il risultato è che il segnale di dimensione 64 è stato convertito in un segnale di dimensione 16; non sono stati aggiunti né rimossi campioni.
Nel caso generale in cui la dimensione originale del frame del segnale, L, non sia divisibile in modo uniforme per la nuova dimensione del frame, n, l'overflow dell'ultimo frame deve essere catturato e riciclato nel buffer successivo. È possibile farlo chiamando iterativamente buffer sull'input x con la sintassi a due argomenti di output:
[y,z] = buffer([z;x],n) % x is a column vector. [y,z] = buffer([z,x],n) % x is a row vector.
Questo semplicemente cattura qualsiasi overflow del buffer in z e antepone i dati all'input successivo nella successiva chiamata a buffer. Anche in questo caso, il segnale di ingresso, x, di dimensione del frame L, è stato convertito in un segnale di dimensione del frame n senza alcuna inserzione o cancellazione di campioni.
Si noti che il buffering continuo non può essere effettuato con la sintassi a uscita singola y = buffer(...), perché l'ultimo frame di y in questo caso è riempito con zeri, il che aggiunge nuovi campioni al segnale.
Il buffering continuo in presenza di sovrapposizione e sottoscorrimento viene gestito tramite il parametro opt, che funge sia da input che da output per buffer. I due esempi presenti in questa pagina dimostrano come utilizzare il parametro opt.
Funzionalità estese
Note sull'utilizzo e limitazioni:
L'input
pdeve essere costante in fase di compilazione.
Consultare le note d'uso e le limitazioni nella sezione Generazione di codice C/C++. Le stesse note d'uso e limitazioni si applicano alla generazione di codice GPU.
Questa funzione supporta pienamente gli GPU array. Per ulteriori informazioni, vedere Run MATLAB Functions on a GPU (Parallel Computing Toolbox).
Cronologia versioni
Introduzione prima di R2006aLa funzione buffer supporta argomenti di input non di tipo double.
Generare codice C e C++ autonomo per la funzione buffer. È necessario disporre di MATLAB® Coder™ per utilizzare questa funzionalità.
Vedi anche
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Seleziona un sito web
Seleziona un sito web per visualizzare contenuto tradotto dove disponibile e vedere eventi e offerte locali. In base alla tua area geografica, ti consigliamo di selezionare: .
Puoi anche selezionare un sito web dal seguente elenco:
Come ottenere le migliori prestazioni del sito
Per ottenere le migliori prestazioni del sito, seleziona il sito cinese (in cinese o in inglese). I siti MathWorks per gli altri paesi non sono ottimizzati per essere visitati dalla tua area geografica.
Americhe
- América Latina (Español)
- Canada (English)
- United States (English)
Europa
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)