exponenta event banner

dsp. AsyncBuffer

Описание

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

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

Для записи и считывания выборок из буфера FIFO:

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

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

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

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

Создание

Описание

пример

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

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

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

Свойства

развернуть все

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

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

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

release(obj)

развернуть все

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

Примеры

свернуть все

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 определяет количество считываемых выборок. Поэтому сигнал считывается как сигнал переменного размера. 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

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

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

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

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

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

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

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
      ⋮

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 способ. Пример см. в разделе Почему Does the dsp. Ошибка объекта AsyncBuffer при вызове функции «Чтение перед записью»?

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

.
Представлен в R2017a