buffer
Mettre en mémoire tampon le vecteur d’un signal dans une matrice de trames de données
Syntaxe
Description
[ divise un signal de longueur y,z] = buffer(___)L nommé x en trames de longueur n et génère uniquement les trames complètes en sortie dans y. Le vecteur z contient les échantillons restants. Cette syntaxe peut inclure n’importe quelle combinaison des arguments en entrée indiqués dans les syntaxes précédentes.
Exemples
Créez une mémoire tampon contenant 100 trames de 10 échantillons chacune.
data = buffer(1:1000,10);
Les trames (colonnes) de la matrice data représentent les sorties séquentielles d’une carte d’acquisition de données qui échantillonne un signal physique : data(:,1) est la première sortie A/D contenant les 11 premiers échantillons du signal, data(:,2) est la deuxième sortie contenant les 11 échantillons suivants, et ainsi de suite.
Vous souhaitez remettre le signal en mémoire tampon en changeant la taille de trame acquise de 11 à 4 avec un chevauchement positif de 1. Appelez la fonction buffer pour l’appliquer à chaque trame d’entrée successive en utilisant le paramètre opt pour conserver un chevauchement cohérent d’une mémoire tampon à l’autre.
Configurez les paramètres de la mémoire tampon. Spécifiez une valeur de –5 pour y(1). Le vecteur de report est initialement vide.
n = 4; p = 1; opt = -5; z = [];
Appelez ensuite la fonction buffer de manière répétée en lui passant à chaque fois une nouvelle trame de signal (colonne) de data. Les échantillons en dépassement (renvoyés dans z) sont reportés et ajoutés au début de l’entrée dans l’appel suivant de la fonction buffer.
Pour les quatre premières itérations, affichez la trame d’entrée [z;x]', les valeurs d’entrée et de sortie de opt, la mémoire tampon de sortie y et le dépassement z. La taille de la matrice de sortie y peut varier d’une seule colonne entre chaque itération. Ce comportement est courant dans les opérations de mise en mémoire tampon avec chevauchement positif ou négatif.
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
-----------
Créez une mémoire tampon contenant 100 trames de 9 échantillons chacune.
data = buffer(1:900,9);
data(:,1) représente la première sortie A/D contenant les 11 premiers échantillons du signal, data(:,2) est la deuxième sortie contenant les 11 échantillons suivants, et ainsi de suite.
Vous souhaitez remettre le signal en mémoire tampon en changeant la taille de trame acquise de 11 à 4 avec un chevauchement négatif de 2. Pour ce faire, vous allez appeler la fonction buffer de manière répétée afin de l’appliquer à chaque trame d’entrée successive en utilisant le paramètre opt pour conserver un chevauchement cohérent d’une mémoire tampon à l’autre.
Configurez les paramètres de la mémoire tampon. Spécifiez une nouvelle taille de trame égale à 4 et un chevauchement négatif de –2. Ignorez le premier élément en entrée x(1) en définissant opt à 1. Le vecteur de report est initialement vide.
n = 4; p = -2; opt = 1; z = [];
Appelez ensuite la fonction buffer de manière répétée en lui passant à chaque fois une nouvelle trame de signal (colonne) de data. Les échantillons en dépassement (renvoyés dans z) sont reportés et ajoutés au début de l’entrée dans l’appel suivant de la fonction buffer.
Pour les trois premières itérations, affichez la trame d’entrée [z';x]', les valeurs d’entrée et de sortie de opt, la mémoire tampon de sortie y et le dépassement z. La taille de la matrice de sortie y peut varier d’une seule colonne entre chaque itération. Ce comportement est courant dans les opérations de mise en mémoire tampon avec chevauchement positif ou négatif.
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
-----------
Arguments d'entrée
Signal d’entrée, défini par un vecteur.
Longueur de trame, définie par un scalaire entier positif.
Nombre d’échantillons qui se chevauchent, défini par un scalaire entier.
Pour
0<p<n(chevauchement positif),bufferrépète lespderniers échantillons de chaque trame au début de la suivante. Par exemple, six=1:30etn=7, un chevauchement positifp=3se présente comme suit.La première trame commence par
pzéros (condition initiale par défaut) et le nombre de colonnes deyest égal àceil(L/(n-p)).Pour
p<0(chevauchement négatif),bufferignorepéchantillons entre les trames consécutives. Par exemple, six=1:30etn=7, une mémoire tampon avec un chevauchement négatifp=-3se présente comme suit.Le nombre de colonnes de
yest égal àceil(L/(n-p)).
Option, définie par un vecteur ou un nombre entier.
Pour
0<p<n(chevauchement positif),optspécifie un vecteur de longueurpà insérer avantx(1)dans la mémoire tampon. Ce vecteur peut être considéré comme une condition initiale qui est nécessaire lorsque l’opération de mise en mémoire tampon en cours fait partie d’une série d’opérations de mise en mémoire tampon consécutives. Pour conserver le chevauchement de trames positif souhaité d’une mémoire tampon à l’autre,optdoit contenir lespderniers échantillons de la mémoire tampon précédente de la séquence. Reportez-vous à Mise en mémoire tampon continue ci-dessous.Par défaut,
optest défini surzeros(p,1)pour une mémoire tampon à chevauchement positif. Définissezoptsur"nodelay"pour ignorer la condition initiale et commencer immédiatement à remplir la mémoire tampon avecx(1). Dans ce cas,Ldoit être supérieur ou égal àlength(p). Par exemple, six=1:30etn=7, une mémoire tampon avec un chevauchement positifp=3se présente comme suit.Pour
p<0(chevauchement négatif),optest une valeur entière comprise dans la plage[0,-p]qui spécifie le nombre d’échantillons d’entrée initiauxx(1:opt)à ignorer avant d’ajouter des échantillons à la mémoire tampon. La première valeur de la mémoire tampon est doncx(opt+1). Par défaut,optest égal à zéro pour une mémoire tampon à chevauchement négatif.Cette option est particulièrement utile lorsque l’opération de mise en mémoire tampon en cours fait partie d’une série d’opérations de mise en mémoire tampon consécutives. Pour conserver le chevauchement de trames négatif souhaité d’une mémoire tampon à l’autre,
optdoit être égal à la différence entre le nombre total de points à ignorer entre les trames (p) et le nombre de points pouvant être ignorés dans l’entrée précédente debuffer. Si l’entrée précédente contenait moins deppoints pouvant être ignorés une fois la dernière trame remplie pour cette mémoire tampon, lesoptpoints restants doivent être supprimés de la première trame de la mémoire tampon actuelle. Pour un exemple concret illustrant ce fonctionnement, veuillez consulter Mise en mémoire tampon continue.
Arguments de sortie
Trame de données, renvoyée sous la forme d’une matrice. Chaque trame de données occupe une colonne de y, qui contient n lignes et ceil(L/n) colonnes. Si L n’est pas exactement divisible par n, la dernière colonne est remplie avec des zéros jusqu’à atteindre la longueur n.
Si
yest une mémoire tampon à chevauchement positif, elle contientnlignes etmcolonnes, oùm = floor(L/(n-p))quandlength(opt) = poum = ceil((L-p)/(n-p))quandopt = "nodelay".Si
yest une mémoire tampon à chevauchement négatif, elle contientnlignes etmcolonnes, oùm = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p)) >= n).
Échantillons restants, renvoyés sous la forme d’un vecteur. Si le nombre d’échantillons du vecteur d’entrée (après les opérations de chevauchement positif ou négatif appropriées) est supérieur au nombre de places disponibles dans la mémoire tampon de n x m, les échantillons restants de x sont stockés dans le vecteur z en sortie. Pour une mémoire tampon à chevauchement positif, la longueur de ce vecteur est égale à L - m*(n-p) quand length(opt) = p ou à L - ((m-1)*(n-p)+n) quand opt = "nodelay". Pour une mémoire tampon à chevauchement négatif, elle est égale à (L-opt) - m*(n-p).
Si
yest une mémoire tampon à chevauchement positif ou sans chevauchement,za la même orientation (ligne ou colonne) quex.Si
yest une mémoire tampon à chevauchement négatif,zest renvoyé sous la forme d’un vecteur ligne.
S’il ne reste aucun échantillon dans l’entrée une fois que la mémoire tampon a été remplie avec le chevauchement positif ou négatif spécifié, z est un vecteur vide.
p derniers échantillons, renvoyés sous la forme d’un vecteur. Dans une mémoire tampon à chevauchement négatif, opt est égal à la différence entre le nombre total de points à ignorer entre les trames (-p) et le nombre de points de x pouvant être ignorés une fois la dernière trame remplie. Dans une série d’opérations de mise en mémoire tampon, la sortie opt de chaque opération doit être utilisée comme entrée opt de l’opération de mise en mémoire tampon suivante. Cela garantit que le chevauchement de trames positif ou négatif souhaité est conservé d’une mémoire tampon à l’autre, mais aussi d’une trame à l’autre dans la même mémoire tampon. Pour un exemple concret illustrant ce fonctionnement, veuillez consulter Mise en mémoire tampon continue.
Pour
0<p<n(chevauchement positif),opt(en tant que sortie) contient lespderniers échantillons de la dernière trame de la mémoire tampon. Ce vecteur peut être utilisé comme condition initiale de l’opération de mise en mémoire tampon suivante dans une série d’opérations de mise en mémoire tampon consécutives. Le chevauchement de trames positif souhaité peut ainsi être conservé d’une mémoire tampon à l’autre.Pour
p<0(chevauchement négatif),opt(en tant que sortie) est égal à la différence entre le nombre total de points à ignorer entre les trames (p) et le nombre de points dexpouvant être ignorés une fois la dernière trame remplie :opt = m*(n-p) + opt - L, oùoptà droite est l’argument en entrée debufferetoptà gauche est l’argument en sortie.zest le vecteur vide. Ici,mest le nombre de colonnes de la mémoire tampon, avecm = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p))>=n).Notez qu’en sortie d’une mémoire tampon à chevauchement négatif,
optest toujours égal à zéro quand la sortiezcontient des données.La sortie
optpour une mémoire tampon à chevauchement négatif est particulièrement utile lorsque l’opération de mise en mémoire tampon en cours fait partie d’une série d’opérations de mise en mémoire tampon consécutives. La sortieoptde chaque opération de mise en mémoire tampon spécifie le nombre d’échantillons à ignorer au début de l’opération de mise en mémoire tampon suivante pour conserver le chevauchement de trames négatif souhaité d’une mémoire tampon à l’autre. Si le nombre de points pouvant être ignorés une fois la dernière trame remplie dans la mémoire tampon actuelle est inférieur àp, lesoptpoints restants doivent être supprimés de la première trame de la mémoire tampon suivante.
Diagnostics
Des messages d’erreur s’affichent lorsque p ≥ n ou que length(opt) ≠ length(p) dans le cas d’une mémoire tampon à chevauchement positif :
Frame overlap P must be less than the buffer size N. (Le chevauchement de trames positif P doit être inférieur à la taille de mémoire tampon N.) Initial conditions must be specified as a length-P vector. (Les conditions initiales doivent être spécifiées sous la forme d’un vecteur de longueur P.)
En savoir plus
Dans une opération de mise en mémoire tampon continue, le vecteur en entrée de la fonction buffer représente une seule trame dans une série de trames composant un signal discret. Ces trames de signal peuvent provenir d’un processus d’acquisition de données basé sur des trames ou d’un algorithme basé sur des trames tel que FFT.
Par exemple, vous pouvez acquérir les données d’une carte A/D par trames de 64 échantillons. Dans le plus simple des cas, vous pouvez remettre les données en mémoire tampon par trames de 16 échantillons. La fonction buffer avec n = 16 crée une mémoire tampon contenant quatre trames pour chaque trame de 64 éléments en entrée. Le résultat est la conversion du signal ayant une taille de trame de 64 en un signal ayant une taille de trame de 16 sans ajout ni suppression d’échantillons.
Dans le cas général où la taille de trame L du signal d’origine n’est pas exactement divisible par la nouvelle taille de trame n, le dépassement de la dernière trame doit être capturé et recyclé dans la mémoire tampon suivante. Pour ce faire, vous pouvez appeler buffer de manière itérative sur l’entrée x avec la syntaxe à deux arguments en sortie :
[y,z] = buffer([z;x],n) % x is a column vector. [y,z] = buffer([z,x],n) % x is a row vector.
Cette syntaxe offre un moyen simple de capturer tout dépassement de mémoire tampon dans z et d’ajouter ces données au début de l’entrée suivante dans le prochain appel de buffer. Là encore, le signal d’entrée x ayant une taille de trame L est converti en un signal ayant une taille de trame n sans insertion ni suppression d’échantillons.
Notez qu’il est impossible d’effectuer une mise en mémoire tampon continue avec la syntaxe à une seule sortie y = buffer(...), car dans ce cas, la dernière trame de y est remplie avec des zéros, ce qui ajoute de nouveaux échantillons au signal.
En cas de chevauchement positif ou négatif, la mise en mémoire tampon continue s’effectue en utilisant le paramètre opt à la fois comme entrée et sortie de buffer. Les deux exemples de cette page montrent comment utiliser le paramètre opt.
Capacités étendues
Notes d’usage et limitations :
L’entrée
pdoit être constante au moment de la compilation.
Consultez les notes d’usage et limitations à la section « Génération de code C/C++ ». Les mêmes notes d’usage et limitations s’appliquent à la génération de code GPU.
Cette fonction supporte complètement les GPU arrays. Pour plus d’informations, veuillez consulter Exécuter les fonctions MATLAB sur un GPU (Parallel Computing Toolbox).
Historique des versions
Introduit avant R2006aLa fonction buffer supporte les arguments en entrée non doubles.
Générez du code C et C++ pour la fonction buffer. Vous devez disposer de MATLAB® Coder™ pour utiliser cette fonctionnalité.
Voir aussi
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.
Sélectionner un site web
Choisissez un site web pour accéder au contenu traduit dans votre langue (lorsqu'il est disponible) et voir les événements et les offres locales. D’après votre position, nous vous recommandons de sélectionner la région suivante : .
Vous pouvez également sélectionner un site web dans la liste suivante :
Comment optimiser les performances du site
Pour optimiser les performances du site, sélectionnez la région Chine (en chinois ou en anglais). Les sites de MathWorks pour les autres pays ne sont pas optimisés pour les visites provenant de votre région.
Amériques
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)