buffer
Puffern eines Signalvektors in eine Matrix von Datenframes.
Syntax
Beschreibung
Beispiele
Erstellen Sie einen Puffer mit 100 Frames, jedes mit 10 Abtastwerten.
data = buffer(1:1000,10);
Betrachten wir die Frames (Spalten) in der Matrix data als die sequenziellen Ausgänge einer Datenerfassungskarte, die ein physikalisches Signal abtastet: data(:,1) ist der erste A/D-Ausgang, der die ersten 11 Signalabtastwerte enthält, data(:,2) ist der zweite Ausgang, der die nächsten 11 Signalabtastwerte enthält, und so weiter.
Sie möchten dieses Signal von der erfassten Framegröße von 11 auf eine Framegröße von 4 mit einer Überlappung von 1 neu puffern. Rufen Sie buffer auf, um jeden nachfolgenden Eingabe-Frame zu bearbeiten, wobei der Parameter opt die Konsistenz der Überlappung von einem Puffer zum nächsten gewährleistet.
Die Pufferparameter festlegen. Geben Sie für y(1) den Wert –5 an. Der Übertragsvektor ist anfänglich leer.
n = 4; p = 1; opt = -5; z = [];
Rufen Sie nun wiederholt buffer auf und übergeben Sie dabei jedes Mal einen neuen Signalframe (eine neue Spalte) von data. Überlaufwerte (die in z zurückgegeben werden) werden übernommen und dem Input beim nachfolgenden Aufruf von buffer vorangestellt.
Für die ersten vier Iterationen zeigen Sie den Eingabeframe [z;x]', die Eingabe- und Ausgabewerte von opt, den Ausgabepuffer y und den Überlauf z an. Die Größe der Ausgabematrix y kann von einer Iteration zur nächsten um eine einzige Spalte variieren. Dies ist typisch für Pufferungsvorgänge mit Überlappung oder Unterlappung.
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
-----------
Erstellen Sie einen Puffer mit 100 Frames, von denen jeder 9 Abtastwerte enthält.
data = buffer(1:900,9);
Nehmen Sie data(:,1) als ersten A/D-Ausgang, der die ersten 11 Signalabtastwerte enthält, data(:,2) als zweiten Ausgang, der die nächsten 11 Signalabtastwerte enthält, und so weiter.
Sie möchten dieses Signal von der erfassten Framegröße von 11 auf eine Framegröße von 4 mit einer Unterlappung von 2 neu puffern. Dazu rufen Sie wiederholt buffer auf, um jeden nachfolgenden Eingabe-Frame zu bearbeiten, wobei Sie den Parameter opt verwenden, um die Konsistenz der Unterlappung von einem Puffer zum nächsten zu gewährleisten.
Die Pufferparameter festlegen. Legen Sie eine neue Framegröße von 4 und eine Unterlappung von –2 fest. Das erste Eingabeelement, x(1), wird übersprungen, indem opt auf 1 gesetzt wird. Der Übertragsvektor ist anfänglich leer.
n = 4; p = -2; opt = 1; z = [];
Rufen Sie nun wiederholt buffer auf und übergeben Sie dabei jedes Mal einen neuen Signalframe (eine neue Spalte) von data. Überlaufwerte (die in z zurückgegeben werden) werden übernommen und dem Input beim nachfolgenden Aufruf von buffer vorangestellt.
Für die ersten drei Iterationen werden der Eingabeframe [z';x]', die Eingabe- und Ausgabewerte von opt, der Ausgabepuffer y und der Überlauf z angezeigt. Die Größe der Ausgabematrix y kann von einer Iteration zur nächsten um eine einzige Spalte variieren. Dies ist typisch für Pufferungsvorgänge mit Überlappung oder Unterlappung.
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
-----------
Eingabeargumente
Eingangssignal, angegeben als Vektor.
Framelänge, angegeben als positive ganzzahlige Skalargröße.
Anzahl der überlappenden oder unterlappenden Abtastwerte, angegeben als ganzzahliger Skalar.
Für
0<lt;p<lt;n(Überlappung) wiederholtbufferdie letztenpAbtastwerte jedes Frames am Anfang des folgenden Frames. Wenn beispielsweisex=1:30undn=7gilt, sieht eine Überlappung vonp=3folgendermaßen aus.Der erste Frame beginnt mit
pNullen (der Standard-Anfangszustand), und die Anzahl der Spalten inybeträgtceil(L/(n-p)).Für
p<0(Unterlappung) überspringtbufferpAbtastwerte zwischen aufeinanderfolgenden Frames. Wenn beispielsweisex=1:30undn=7gilt, sieht ein Puffer mit Unterlappung vonp=-3folgendermaßen aus.Die Anzahl der Spalten in
ybeträgtceil(L/(n-p)).
Option, angegeben als Vektor oder Ganzzahl.
Für
0<p<n(Überlappung) gibtopteinen Vektor der Längepan, der vorx(1)im Puffer eingefügt werden soll. Dieser Vektor kann als Anfangsbedingung betrachtet werden, die benötigt wird, wenn es sich bei der aktuellen Pufferungsoperation um eine von mehreren aufeinanderfolgenden Pufferungsoperationen handelt. Um die gewünschte Frame-Überlappung von einem Puffer zum nächsten aufrechtzuerhalten, sollteoptdie letztenpAbtastwerte des vorherigen Puffers in der Sequenz enthalten. Siehe Kontinuierliche Pufferung unten.Standardmäßig ist
optgleichzeros(p,1)für einen überlappenden Puffer. Setzen Sieoptauf"nodelay", um die Anfangsbedingung zu überspringen und den Puffer sofort mitx(1)zu füllen. In diesem Fall mussLmindestenslength(p)lang sein. Wenn beispielsweisex=1:30undn=7gilt, sieht ein Puffer mit Überlappung vonp=3folgendermaßen aus.Für
p<0(Unterlappung) istoptein ganzzahliger Wert im Bereich[0,-p], der die Anzahl der anfänglichen Eingangsabtastwertex(1:opt)angibt, die übersprungen werden sollen, bevor Abtastwerte zum Puffer hinzugefügt werden. Der erste Wert im Puffer ist daherx(opt+1). Standardmäßig istoptbei einem unterlappenden Puffer null.Diese Option ist besonders nützlich, wenn es sich bei dem aktuellen Puffervorgang um einen von mehreren aufeinanderfolgenden Puffervorgängen handelt. Um die gewünschte Frame-Unterlappung von einem Puffer zum nächsten aufrechtzuerhalten, sollte
optder Differenz zwischen der Gesamtzahl der zwischen den Frames zu überspringenden Punkte (p) und der Anzahl der Punkte entsprechen, die im vorherigen Input fürbufferzum Überspringen verfügbar waren. Falls die vorherige Eingabe weniger alspPunkte enthielt, die nach dem Füllen des letzten Frames dieses Puffers übersprungen werden konnten, müssen die verbleibendenoptPunkte aus dem ersten Frame des aktuellen Puffers entfernt werden. Siehe Kontinuierliche Pufferung für ein Beispiel, wie dies in der Praxis funktioniert.
Ausgabeargumente
Datenframe, zurückgegeben als Matrix. Jeder Datenframe belegt eine Spalte von y, das n Zeilen und ceil(L/n) Spalten hat. Wenn L nicht durch n teilbar ist, wird die letzte Spalte mit Nullen auf die Länge n aufgefüllt.
Wenn
yein überlappender Puffer ist, hat ernZeilen undmSpalten, wobeim = floor(L/(n-p))wennlength(opt) = poderm = ceil((L-p)/(n-p))wennopt = "nodelay".Wenn
yein unterlappender Puffer ist, hat ernZeilen undmSpalten, wobeim = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p)) >= n).
Die verbleibenden Abtastwerte werden als Vektor zurückgegeben. Wenn die Anzahl der Abtastwerte im Eingangsvektor (nach den entsprechenden Überlappungs- oder Unterlappungsoperationen) die Anzahl der im Puffer n-by-m verfügbaren Plätze überschreitet, werden die verbleibenden Abtastwerte in x im Vektor z ausgegeben, der bei einem überlappenden Puffer die Länge L - m*(n-p) hat, wenn length(opt) = p oder L - ((m-1)*(n-p)+n), wenn opt = "nodelay", und bei einem unterlappenden Puffer die Länge (L-opt) - m*(n-p).
Wenn
yein überlappender Puffer oder ein nicht überlappender Puffer ist, dann hatzdie gleiche Ausrichtung (Zeile oder Spalte) wiex.Wenn
yein unterlappender Puffer ist, dann wirdzals Zeilenvektor zurückgegeben.
Wenn nach dem Füllen des Puffers mit der angegebenen Unterlappung oder Unterlappung keine weiteren Abtastwerte im Eingabedatensatz vorhanden sind, ist z ein leerer Vektor.
Die letzten p Abtastwerte werden als Vektor zurückgegeben. In einem unterlappenden Puffer ist opt die Differenz zwischen der Gesamtzahl der zwischen den Frames zu überspringenden Punkte (-p) und der Anzahl der Punkte in x, die nach dem Füllen des letzten Frames noch zum Überspringen zur Verfügung standen. In einer Abfolge von Pufferoperationen sollte der opt-Ausgang jeder Operation als opt-Eingang für die nachfolgende Pufferoperation verwendet werden. Dadurch wird sichergestellt, dass die gewünschte Frame-Überlappung oder -Unterlappung sowohl von Puffer zu Puffer als auch von Frame zu Frame innerhalb desselben Puffers erhalten bleibt. Siehe Kontinuierliche Pufferung für ein Beispiel, wie dies in der Praxis funktioniert.
Für
0<lt;p<lt;n(Überlappung) enthältopt(als Ausgabe) die letztenpAbtastwerte im letzten Frame des Puffers. Dieser Vektor kann als Anfangsbedingung für einen nachfolgenden Puffervorgang in einer Sequenz aufeinanderfolgender Puffervorgänge verwendet werden. Dadurch kann die gewünschte Frame-Überlappung von einem Puffer zum nächsten beibehalten werden.Für
p<0(Unterlappung) istopt(als Ausgabe) die Differenz zwischen der Gesamtzahl der zwischen den Frames zu überspringenden Punkte (p) und der Anzahl der Punkte inx, die nach dem Füllen des letzten Frames noch zum Überspringen verfügbar waren:opt = m*(n-p) + opt - L. Dabei istoptrechts das Eingabeargument fürbufferundoptlinks das Ausgabeargument.zist der leere Vektor. Hierbei istmdie Anzahl der Spalten im Puffer, mitm = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p))>=n).Beachten Sie, dass bei einem unterlappenden Pufferausgang
optimmer Null ist, wenn der AusgangzDaten enthält.Der
opt-Ausgang für einen unterlappenden Puffer ist besonders nützlich, wenn es sich bei der aktuellen Pufferoperation um eine von mehreren aufeinanderfolgenden Pufferoperationen handelt. Deropt-Ausgang jedes Puffervorgangs gibt die Anzahl der Abtastwerte an, die zu Beginn des nächsten Puffervorgangs übersprungen werden müssen, um die gewünschte Frame-Unterlappung von einem Puffer zum nächsten aufrechtzuerhalten. Falls nach dem Füllen des letzten Frames des aktuellen Puffers weniger alspPunkte zum Überspringen zur Verfügung stehen, müssen die verbleibendenoptPunkte aus dem ersten Frame des nächsten Puffers entfernt werden.
Diagnostik
Fehlermeldungen werden angezeigt, wenn p ≥ n oder length(opt) ≠ length(p) in einem Fall überlappender Puffer gilt:
Die Frame-Überlappung P muss kleiner als die Puffergröße N sein. Anfangsbedingungen müssen als Vektor der Länge P angegeben werden.
Mehr über
Bei einem kontinuierlichen Pufferungsvorgang stellt der Vektoreingang der Funktion buffer einen Frame in einer Sequenz von Frames dar, die ein diskretes Signal bilden. Diese Signalframes können im Rahmen eines Frame-basierten Datenerfassungsprozesses oder innerhalb eines Frame-basierten Algorithmus wie der FFT entstehen.
Beispielsweise könnten Sie Daten von einer A/D-Karte in Frames von 64 Abtastwerten erfassen. Im einfachsten Fall könnten Sie die Daten in Frames von 16 Samples neu puffern; buffer mit n = 16 erzeugt einen Puffer von vier Frames aus jedem 64-Elemente-Eingabeframe. Das Ergebnis ist, dass das Signal mit einer Framegröße von 64 in ein Signal mit einer Framegröße von 16 umgewandelt wurde; es wurden keine Abtastwerte hinzugefügt oder entfernt.
Im allgemeinen Fall, dass die ursprüngliche Signalframegröße L nicht durch die neue Framegröße n teilbar ist, muss der Überlauf des letzten Frames erfasst und im folgenden Puffer wiederverwendet werden. Dies erreichen Sie durch iteratives Aufrufen von buffer mit der Eingabe x und der Syntax mit zwei Ausgabeargumenten:
[y,z] = buffer([z;x],n) % x is a column vector. [y,z] = buffer([z,x],n) % x is a row vector.
Hierbei wird lediglich ein etwaiger Pufferüberlauf in z abgefangen und die Daten dem nachfolgenden Input beim nächsten Aufruf von buffer vorangestellt. Das Eingangssignal x mit der Framegröße L wurde erneut in ein Signal mit der Framegröße n umgewandelt, ohne dass Abtastwerte eingefügt oder gelöscht wurden.
Beachten Sie, dass kontinuierliches Puffern mit der Single-Output-Syntax y = buffer(...) nicht möglich ist, da der letzte Frame von y in diesem Fall mit Nullen aufgefüllt wird, wodurch dem Signal neue Samples hinzugefügt werden.
Die kontinuierliche Pufferung bei Überlappung und Unterlappung wird mit dem Parameter opt gehandhabt, der sowohl als Eingabe als auch als Ausgabe für buffer verwendet wird. Die beiden Beispiele auf dieser Seite veranschaulichen die Verwendung des Parameters opt.
Erweiterte Fähigkeiten
Hinweise zur Verwendung und Einschränkungen:
Die Eingabe
pmuss zur Kompilierzeit konstant sein.
Beachten Sie die Hinweise zur Verwendung und die Einschränkungen im Abschnitt „C/C++ Codegenerierung“. Für die GPU-Codegenerierung gelten die gleichen Nutzungshinweise und Einschränkungen.
Diese Funktion unterstützt GPU-Arrays vollständig. Weitere Informationen finden Sie unter Run MATLAB Functions on a GPU (Parallel Computing Toolbox).
Versionsverlauf
Eingeführt vor R2006aDie Funktion buffer unterstützt nicht-double-Eingabeargumente.
Generieren Sie C/C++ für die buffer-Funktion. Sie benötigen MATLAB® Coder™, um diese Funktionalität nutzen zu können.
Siehe auch
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.
Website auswählen
Wählen Sie eine Website aus, um übersetzte Inhalte (sofern verfügbar) sowie lokale Veranstaltungen und Angebote anzuzeigen. Auf der Grundlage Ihres Standorts empfehlen wir Ihnen die folgende Auswahl: .
Sie können auch eine Website aus der folgenden Liste auswählen:
So erhalten Sie die bestmögliche Leistung auf der Website
Wählen Sie für die bestmögliche Website-Leistung die Website für China (auf Chinesisch oder Englisch). Andere landesspezifische Websites von MathWorks sind für Besuche von Ihrem Standort aus nicht optimiert.
Amerika
- 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)