exponenta event banner

буфер

Буферный вектор сигнала в матрицу кадров данных

Описание

y = buffer(x,n) перегородки длиной -L вектор сигнала x в неперекрывающиеся сегменты данных (кадры) длиной n.

y = buffer(x,n,p) перекрывает или подстилает последовательные кадры в выходной матрице p образцы.

пример

y = buffer(x,n,p,opt) задает вектор выборок, которые должны предшествовать x(1) в перекрывающемся буфере или количество начальных выборок, пропускаемых в подстилающем буфере.

пример

[y,z] = buffer(___) секционирует длину -L вектор сигнала x в рамки длины n, и выводит только полные кадры в y. Вектор z содержит оставшиеся образцы. Этот синтаксис может включать любую комбинацию входных аргументов из предыдущих синтаксисов.

[y,z,opt] = buffer(___) возвращает последнее p выборки перекрывающегося буфера в выходных данных opt.

Примеры

свернуть все

Создайте буфер, содержащий 100 кадров, каждый из которых содержит 11 выборок.

data = buffer(1:1100,11);

Взять кадры (столбцы) в матрице data чтобы быть последовательными выходами платы сбора данных, дискретизирующей физический сигнал: data(:,1) - первый A/D выход, содержащий первые 11 выборок сигнала, data(:,2) - второй выход, содержащий следующие 11 выборок сигнала, и так далее.

Вы хотите дать отпор этому сигналу от полученного размера кадра 11 до размера кадра 4 с перекрытием 1. Звонить buffer для работы с каждым последовательным входным кадром, используя opt для сохранения согласованности в перекрытии от одного буфера к другому.

Задайте параметры буфера. Укажите значение -5 для y(1). Вектор переноса первоначально пуст.

n = 4;
p = 1;
opt = -5;
z = [];

Теперь многократно звоните buffer, каждый раз проходя в новом сигнальном кадре (столбце) от data. Выборки переполнения (возвращены в z) переносятся и добавляются к входу в последующем вызове buffer.

Для первых четырех итераций показать кадр ввода [z;x]', входные и выходные значения opt, выходной буфер yи переполнение z. Размер выходной матрицы, y, может изменяться в одном столбце от одной итерации к другой. Это типично для операций буферизации с перекрытием или подложкой.

for i = 1:size(data,2)
    x = data(:,i);
    [y,z,oppt] = buffer([z;x],n,p,opt);
    if i <= 4
        disp(' '), i, ifrm = [z;x]', opts = [opt oppt], y, z, disp(' ')
   end
   opt = oppt;
end
 
i = 1
ifrm = 1×13

    10    11     1     2     3     4     5     6     7     8     9    10    11

opts = 1×2

    -5     9

y = 4×3

    -5     3     6
     1     4     7
     2     5     8
     3     6     9

z = 2×1

    10
    11

 
 
i = 2
ifrm = 1×12

    22    12    13    14    15    16    17    18    19    20    21    22

opts = 1×2

     9    21

y = 4×4

     9    12    15    18
    10    13    16    19
    11    14    17    20
    12    15    18    21

z = 22
 
 
i = 3
ifrm = 1×11

    23    24    25    26    27    28    29    30    31    32    33

opts = 1×2

    21    33

y = 4×4

    21    24    27    30
    22    25    28    31
    23    26    29    32
    24    27    30    33

z =

  0x1 empty double column vector

 
 
i = 4
ifrm = 1×13

    43    44    34    35    36    37    38    39    40    41    42    43    44

opts = 1×2

    33    42

y = 4×3

    33    36    39
    34    37    40
    35    38    41
    36    39    42

z = 2×1

    43
    44

 

Создайте буфер, содержащий 100 кадров, каждый из которых содержит 11 выборок.

data = buffer(1:1100,11);

Бери data(:,1) в качестве первого A/D выхода, содержащего первые 11 выборок сигнала, data(:,2) в качестве второго выходного сигнала, содержащего следующие 11 выборок сигнала, и так далее.

Этот сигнал необходимо отбросить от полученного размера кадра 11 до размера кадра 4 с подложкой 2. Для этого вы будете неоднократно звонить buffer для работы с каждым последовательным входным кадром, используя opt для поддержания согласованности в подложке от одного буфера к другому.

Задайте параметры буфера. Укажите новый размер рамки 4 и подложку -2. Пропустите первый входной элемент, x(1), путем установки opt на 1. Вектор переноса первоначально пуст.

n = 4;
p = -2;
opt = 1;
z = [];

Теперь многократно звоните buffer, каждый раз проходя в новом сигнальном кадре (столбце) от data. Выборки переполнения (возвращены в z) переносятся и добавляются к входу в последующем вызове buffer.

Для первых трех итераций показать кадр ввода [z';x]', входные и выходные значения opt, выходной буфер yи переполнение z. Размер выходной матрицы, y, может изменяться в одном столбце от одной итерации к другой. Это типично для операций буферизации с перекрытием или подложкой.

for i = 1:size(data,2)
   x = data(:,i);
   [y,z,oppt] = buffer([z';x],n,p,opt);
   if i <= 3
       disp(' '), i, ifrm = [z';x]', opts = [opt oppt], y, z, disp(' ')
   end
   opt = oppt;
end
 
i = 1
ifrm = 1×11

     1     2     3     4     5     6     7     8     9    10    11

opts = 1×2

     1     2

y = 4×2

     2     8
     3     9
     4    10
     5    11

z =

  1x0 empty double row vector

 
 
i = 2
ifrm = 1×14

    20    21    22    12    13    14    15    16    17    18    19    20    21    22

opts = 1×2

     2     0

y = 4×1

    14
    15
    16
    17

z = 1×3

    20    21    22

 
 
i = 3
ifrm = 1×13

    32    33    23    24    25    26    27    28    29    30    31    32    33

opts = 1×2

     0     0

y = 4×2

    20    26
    21    27
    22    28
    23    29

z = 1×2

    32    33

 

Входные аргументы

свернуть все

Входной сигнал, заданный как вектор.

Длина кадра, заданная как положительный действительный скаляр.

Число выборок, указанное как действительный положительный скаляр.

  • Для 0 < p < n (перекрытие), buffer повторяет окончательный p выборки каждого кадра в начале следующего кадра. Например, если x = 1:30 и n = 7, перекрытие p = 3 выглядит вот так.

    Первый кадр начинается с p нули (исходное условие по умолчанию) и количество столбцов в y является ceil(L/(n-p)).

  • Для p < 0 (подложка), buffer пропуски p отсчеты между последовательными кадрами. Например, если x = 1:30 и n = 7, буфер с подложкой p = -3 выглядит вот так.

    Количество столбцов в y является ceil(L/(n-p)).

Параметр, заданный как вектор или целое число.

  • Для 0 < p < n (перекрытие), opt задает длину -p вектор для вставки перед x(1) в буфере. Этот вектор можно считать начальным условием, которое необходимо, когда текущая операция буферизации представляет собой операцию в последовательности последовательных операций буферизации. Для сохранения требуемого перекрытия кадров из одного буфера в следующий, opt должен содержать окончательный p выборки предыдущего буфера в последовательности. См. раздел Непрерывная буферизация ниже.

    По умолчанию opt является zeros(p,1) для перекрывающегося буфера. Набор opt кому 'nodelay' пропустить исходное условие и немедленно начать заполнение буфера x(1). В этом случае L должно быть length(p) или дольше. Например, если x = 1:30 и n = 7, буфер с перекрытием p = 3 выглядит вот так.

  • Для p < 0 (подложка), opt - целое значение в диапазоне [0,-p] указание количества начальных входных выборок, x(1:opt), чтобы пропустить перед добавлением образцов в буфер. Поэтому первое значение в буфере - x(opt+1). По умолчанию opt равен нулю для буфера подложки.

    Этот параметр особенно полезен, если текущая операция буферизации состоит из последовательности последовательных операций буферизации. Для сохранения требуемой подложки кадра из одного буфера в другой opt должна равняться разнице между общим количеством пропускаемых точек между кадрами (p) и количество точек, которые можно было пропустить при предыдущем вводе в buffer. Если предыдущий вход был меньше, чем p точки, которые могут быть пропущены после заполнения последнего кадра этого буфера, оставшиеся opt необходимо удалить точки из первого кадра текущего буфера. Пример того, как это работает на практике, см. в разделе Непрерывная буферизация.

Выходные аргументы

свернуть все

Кадр данных, возвращаемый в виде матрицы. Каждый кадр данных занимает один столбец y, который имеет n строки и ceil(L/n) столбцы. Если L не делится равномерно на n, последний столбец заполнен нулями до длины n.

  • Если y является перекрывающимся буфером, он имеет n строки и m столбцы, где m = floor(L/(n-p)) когда length(opt) = p или m = ceil((L-p)/(n-p)) когда opt = 'nodelay'.

  • Если y является буфером-подложкой, имеет n строки и m столбцы, где m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p)) >= n).

Оставшиеся выборки, возвращенные в виде вектора. Если количество отсчетов во входном векторе (после соответствующих операций наложения или наложения) превышает количество мест, доступных в nоколо-m буфер, остальные образцы в x выводятся в векторе z, которая для перекрывающегося буфера имеет длину L - m*(n-p) когда length(opt) = p или L - ((m-1)*(n-p)+n) когда opt = 'nodelay', а для буфера подложки имеет длину (L-opt) - m*(n-p).

  • Если y является перекрывающимся буфером или неперекрывающимся буфером, то z имеет ту же ориентацию (строка или столбец), что и x.

  • Если y является буфером-подложкой, затем z возвращается как вектор строки.

Если после заполнения буфера с указанным перекрытием или подложки на входе нет оставшихся выборок, z является пустым вектором.

В последний раз p выборки, возвращенные в виде вектора. В буфере подложки opt - разница между общим количеством пропускаемых точек между кадрами (-p) и количество точек в x которые можно было пропустить после заполнения последнего кадра. В последовательности операций буферизации opt выходные данные каждой операции должны использоваться в качестве opt вход в последующую операцию буферизации. Это гарантирует, что требуемое перекрытие кадра или подложка поддерживается от буфера к буферу, а также от кадра к кадру в пределах того же буфера. Пример того, как это работает на практике, см. в разделе Непрерывная буферизация.

  • Для 0 < p < n (перекрытие), opt (в виде выходных данных) содержит окончательный p выборки в последнем кадре буфера. Этот вектор может использоваться в качестве начального условия для последующей операции буферизации в последовательности последовательных операций буферизации. Это позволяет поддерживать требуемое перекрытие кадров от одного буфера к следующему.

  • Для p < 0 (подложка), opt (в качестве выходного) - разница между общим количеством пропускаемых точек между кадрами (p) и количество точек в x которые можно было пропустить после заполнения последнего кадра: opt = m*(n-p) + opt - L, где opt справа - входной аргумент для buffer, и opt слева - выходной аргумент. z - пустой вектор. Здесь m - количество столбцов в буфере, с m = floor((L-opt)/(n-p)) + (rem((L-opt),(n-p))>=n).

    Обратите внимание, что для вывода буфера подложки: opt всегда равно нулю при выводе z содержит данные.

    opt вывод для буфера-подложки особенно полезен, когда текущая операция буферизации состоит из последовательности последовательных операций буферизации. opt выходные данные каждой операции буферизации определяют количество выборок, которые необходимо пропустить в начале следующей операции буферизации для поддержания требуемой подложки кадра из одного буфера в другой. Если меньше, чем p точки были доступны для пропуска после заполнения последнего кадра текущего буфера, остальные opt необходимо удалить точки из первого кадра следующего буфера.

Диагностика

При отображении сообщений об ошибках p ≥n или length(opt)length(p) в случае перекрывающегося буфера:

Frame overlap P must be less than the buffer size N.
Initial conditions must be specified as a length-P vector.

Подробнее

свернуть все

Непрерывная буферизация

В операции непрерывной буферизации вектор вводится в buffer функция представляет один кадр в последовательности кадров, составляющих дискретный сигнал. Эти сигнальные кадры могут возникать в процессе сбора данных на основе кадра или в алгоритме на основе кадра, таком как БПФ.

Например, вы можете получить данные от A/D карты в кадрах из 64 выборок. В простейшем случае можно дать отпор данным в кадры из 16 выборок; buffer с n = 16 создает буфер из четырех кадров из каждого 64-элементного входного кадра. В результате сигнал размера 64 кадра преобразуется в сигнал размера 16 кадра; образцы не были добавлены или удалены.

В общем случае, когда размер кадра исходного сигнала, L, не делится в равной степени на новый размер кадра, n, переполнение из последнего кадра должно быть захвачено и возвращено в следующий буфер. Это можно сделать путем итеративного вызова buffer на входе x с синтаксисом двух выходных аргументов:

[y,z] = buffer([z;x],n)     % x is a column vector.
[y,z] = buffer([z,x],n)     % x is a row vector.

Это просто фиксирует любое переполнение буфера в zи добавляет данные к последующему вводу в следующем вызове buffer. Опять же, входной сигнал, x, размера кадра L, был преобразован в сигнал размера кадра n без какой-либо вставки или удаления образцов.

Обратите внимание, что непрерывная буферизация не может выполняться с помощью синтаксиса с одним выходом y = buffer(...), потому что последний кадр y в этом случае заполняется нулями, что добавляет новые выборки к сигналу.

Непрерывная буферизация при наличии перекрытия и подложки обрабатывается с помощью opt параметр, который используется как вход, так и выход для buffer. Два примера на этой странице демонстрируют, как opt должен использоваться параметр.

Расширенные возможности

См. также

Представлен до R2006a