dsp.AsyncBuffer

Описание

The dsp.AsyncBuffer Системная object™ записывает выборки в и читает выборки из первого буфера (FIFO). The write метод записывает данные в буфер, и read метод считывает данные из буфера. При создании объекта можно задать количество выборок (строк) буфера с помощью Capacity свойство. Количество каналов (столбцов) устанавливается во время первого вызова равным write. Инициализируйте буфер путем вызова write или setup перед первым вызовом в read.

Данные, которые вы записываете, занимают следующее доступное пространство в буфере. Если буфер полон, и все данные в нем непрочитаны (asyncBuff.NumUnreadSamples == asyncBuff.Capacity), объект перезаписывает самые старые данные любыми новыми данными, которые поступают. Буфер удаляет данные только при перезаписи данных, поэтому можно перечитать данные из прошлого. The dsp.AsyncBuffer объект поддерживает запись и чтение сигналов переменного формата кадра. Для примеров смотрите Чтение Переменных Форматов кадра Из Буфера и Запись Переменных Форматов кадра в Буфер.

Чтобы записать и прочитать выборки из буфера FIFO:

  • Создайте dsp.AsyncBuffer и установите свойства объекта.

  • Звонить write чтобы записать выборки в буфер.

  • Звонить read для чтения выборок из буфера.

  • Звонить peek чтение выборок без изменения количества непрочитанных выборок в буфере.

Создание

Описание

пример

asyncBuff = dsp.AsyncBuffer возвращает асинхронный буфер Системный объект, asyncBuff, с использованием свойств по умолчанию.

asyncBuff = dsp.AsyncBuffer(cap) устанавливает Capacity свойство к cap.

Пример: asyncBuff = dsp.AsyncBuffer(200000);

Свойства

расширить все

Если не указано иное, свойства являются нетронутыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируются, когда вы вызываете их, и release функция разблокирует их.

Если свойство настраивается, можно изменить его значение в любой момент.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.

Количество доступных для записи/чтения строк в буфере, заданное в виде положительного целого числа, большего или равного 2. Количество строк во время каждой записи в буфер не должно превышать пропускную способность буфера. Если буфер заполнен, и все данные внутри непрочитаны, объект перезаписывает самые старые данные любыми новыми данными, которые поступают. The CumulativeOverrun свойство, возвращенное info задает количество выборок, переполненных на канал с момента последнего вызова, reset. Количество переполненных выборок - это количество перезаписанных непрочитанных выборок.

По умолчанию это свойство имеет тип данных int32.

Пример: asyncBuff = dsp.AsyncBuffer(200000);

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Это свойство доступно только для чтения.

Количество непрочитанных выборок в каждом канале (столбце) буфера, заданное как целое число, больше или равное 0. Общее количество непрочитанных выборок в буфере NumUnreadSamples × numChann. Переменная numChann является количеством каналов в буфере. Количество каналов в буфере является количеством столбцов данных в первом вызове write.

The CumulativeUnderrun свойство, возвращенное info метод задает количество выборок на канал с момента последнего вызова reset. Underrun происходит, если вы пытаетесь считать больше выборки, чем доступно.

Пример: asyncBuff = dsp.AsyncBuffer; input = randn(512,1); numUnreadSamples = write(asyncBuff,input)

Типы данных: int32

Использование

Чтобы записать и считать выборки из асинхронного буфера:

  • Создайте dsp.AsyncBuffer и установите свойства объекта.

  • Звонить write чтобы записать выборки в буфер.

  • Звонить read для чтения выборок из буфера.

  • Звонить peek чтение выборок без изменения количества непрочитанных выборок в буфере.

Функции объекта

Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем obj, используйте следующий синтаксис:

release(obj)

расширить все

infoПолучите кумулятивное переполнение и недооценку
readЧтение данных из буфера
writeЗапись данных в буфер
peekСчитывайте данные из буфера, не меняя количество непрочитанных выборок
stepЗапуск алгоритма системного объекта
releaseОтпустите ресурсы и допустите изменения в значениях свойств системного объекта и входных характеристиках
resetСброс внутренних состояний Системного объекта

Примеры

свернуть все

The dsp.AsyncBuffer Системная object™ поддерживает чтение переменных форматов кадра из буфера.

Создайте dsp.AsyncBuffer Системный объект. Это вход белого Гауссова шума со средним значением 0, стандартным отклонением 1 и формат кадра 512 выборок. Запишите вход в буфер с помощью write способ.

asyncBuff = dsp.AsyncBuffer;
input = randn(512,1);
write(asyncBuff,input);
plot(input)
hold on

Figure contains an axes. The axes contains an object of type line.

Сохраните данные, считанные из буфера, в outTotal.

Постройте график входного сигнала и данных, которые считываются из буфера на том же графике. Считывайте данные из буфера до тех пор, пока не будут считаны все выборки. В каждой итерации цикла randi определяет количество считываемых выборок. Поэтому сигнал считывается как сигнал переменного размера. The prevIndex переменная отслеживает предыдущее значение индекса, содержащее данные.

outTotal = zeros(size(input));
prevIndex = 0;
while asyncBuff.NumUnreadSamples ~= 0
    numToRead = randi([1,64]);
    out = read(asyncBuff,numToRead);
    outTotal(prevIndex+1:prevIndex+numToRead) = out;
    prevIndex = prevIndex+numToRead;
end
plot(outTotal,'r')
hold off

Figure contains an axes. The axes contains 2 objects of type line.

Проверьте, что входные данные и данные, считанные из буфера (исключая подземные выборки, если таковые имеются), совпадают. Совокупное количество переполненных и недооцененных выборок в буфере определяется info функция.

S = info(asyncBuff)
S = struct with fields:
     CumulativeOverrun: 0
    CumulativeUnderrun: 28

The CumulativeUnderrun В поле показано количество выборок на канал. Underrun происходит, если вы пытаетесь считать больше выборки, чем доступно.

Запишите синусоиду переменного формата кадра в буфер. Вычислите БПФ синусоиды и визуализируйте результат на графике массива.

Инициализируйте dsp.AsyncBuffer, dsp.ArrayPlot, и dsp.FFT Системные объекты.

asynBuff = dsp.AsyncBuffer;
plotter = dsp.ArrayPlot;
fftObj = dsp.FFT('FFTLengthSource','Property','FFTLength',256);

Синусоида генерируется с помощью sin функция в MATLAB. The start и finish переменные помечают начальный и конечный индексы каждой системы координат. Если достаточно данных кэшировано, считайте из буфера и выполните БПФ. Просмотр БПФ на графике массива.

start = 1;

for Iter = 1 : 2000
    numToWrite = randi([200,800]);
    finish = start + numToWrite;

    inputData = sin(start:finish)';
    start = finish + 1;

    write(asynBuff,inputData);
    while asynBuff.NumUnreadSamples >= 256
        x = read(asynBuff,256);
        X = abs(fftObj(x));
        plotter(log(X));
    end
end

Считайте данные из асинхронного буфера, не меняя количество непрочитанных выборок, используя peek функция.

Создайте dsp.AsyncBuffer Системные object™. Вход является вектором-столбцом из 100 выборок, от 1 до 100. Запишите данные в буфер.

asyncBuff = dsp.AsyncBuffer
asyncBuff = 
  AsyncBuffer with properties:

            Capacity: 192000
    NumUnreadSamples: 0

input = (1:100)';
write(asyncBuff,input);

Посмотрите на первые три выборки. Вывод: [1 2 3] '.

out1  = peek(asyncBuff,3)
out1 = 3×1

     1
     2
     3

The NumUnreadSamples равен 100, что указывает на то, что peek функция не изменила количество непрочитанных выборок в буфере.

asyncBuff.NumUnreadSamples
ans = int32
    100

После просмотра прочитайте 50 выборки, используя read функция. Вывод: [1:50] '.

out2  = read(asyncBuff,50)
out2 = 50×1

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
      ⋮

The NumUnreadSamples равен 50, что указывает на то, что read функция изменила количество непрочитанных выборок в буфере.

asyncBuff.NumUnreadSamples
ans = int32
    50

Теперь посмотрите снова на первые три выборки. Выводится [51 52 53] '. Проверьте, что NumUnreadSamples все еще 50.

out3  = peek(asyncBuff,3)
out3 = 3×1

    51
    52
    53

asyncBuff.NumUnreadSamples
ans = int32
    50

Еще раз прочитайте 50 выборки. Вывод теперь содержит последовательность [51:100] '. Проверьте, что NumUnreadSamples равен 0.

out4  = read(asyncBuff)
out4 = 50×1

    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
      ⋮

asyncBuff.NumUnreadSamples
ans = int32
    0

Ограничения

Перед вызовом read метод, необходимо инициализировать буфер путем вызова либо write или setup способ. Например, см. Why Does the dsp. Ошибка объекта AsyncBuffer при вызове Read перед записью?

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

.
Введенный в R2017a