Получите пакеты UDP от сети
Система dsp.UDPReceiver
object™ получает пакеты UDP по сети UDP от удаленного IP-адреса, заданного в свойстве RemoteIPAddress. Объект затем сохраняет данные к своему внутреннему буферу. Объем данных (число элементов), полученное в каждом пакете UDP, может отличаться. Максимальный номер байтов, которые объект может получить, не теряя данные, определяется свойством ReceiveBufferSize. Свойство MaximumMessageLength задает максимальное количество выборок, которые может содержать каждый пакет данных. LocalIPPort, по которому объект получает данные, является настраиваемым в сгенерированном коде, но не настраиваемым во время симуляции. Для примера смотрите Мелодию Номер порта UDP в MATLAB.
Получить пакеты UDP от сети:
Создайте объект dsp.UDPReceiver
и установите его свойства.
Вызовите объект с аргументами, как будто это была функция.
Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.
udpr = dsp.UDPReceiver
udpr = dsp.UDPReceiver(Name,Value)
Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и функция release
разблокировала их.
Если свойство является настраиваемым, можно изменить его значение в любое время.
Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (MATLAB).
LocalIPPort
— Локальный порт, по которому можно получить данные25000
(значение по умолчанию) | [1 65535]
Порт, по которому можно получить данные, заданные как скаляр в области значений [1 65535]. Это свойство является настраиваемым в сгенерированном коде, но не настраиваемым во время симуляции.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
RemoteIPAddress
— Обратитесь, из которого можно принять данные'0.0.0.0'
(значение по умолчанию) | вектор символов, содержащий допустимый IP-адрес |, представляет скаляр в виде строкиОбратитесь, из которого можно принять данные, заданные как вектор символов или скаляр строки, содержащий допустимый IP-адрес. Ввод определенного IP-адреса блокирует пакеты UDP от других адресов. Значение по умолчанию, '0.0.0.0'
, указывает, что данные могут быть приняты от любого удаленного IP-адреса.
Типы данных: char
ReceiveBufferSize
— Размер внутреннего буфера8192
(значение по умолчанию) | [1 67108864]
Размер внутреннего буфера, который получает пакеты UDP, заданные в байтах как скаляр в области значений [1 67108864]
. Если количество полученных байтов превышает это значение, переполнение буфера и содержимое являются усеченными.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
MaximumMessageLength
— Максимальный размер выходного сигнала255
(значение по умолчанию) | [1 65507]
Максимальная длина выходного сигнала, заданного в выборках как положительная скалярная величина в области значений [1 65507]. Установите это свойство на значение, равное или больше, чем размер данных пакета UDP. Если вы получаете больше выборок, чем заданный в этом свойстве, избыточные данные являются усеченными.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
MessageDataType
— Тип данных сообщения'uint8'
(значение по умолчанию) | 'double'
| 'single'
| 'int8'
| 'int16'
| 'uint16'
| 'int32'
| 'uint32'
| 'logical'
Тип данных векторных элементов в сообщении вывод, заданный как MATLAB® встроенный тип данных.
Совпадайте с типом данных вводу данных, используемому, чтобы создать пакеты UDP.
Типы данных: char
IsMessageComplex
— Сложность сообщенияfalse
(значение по умолчанию) | true
Сложность сообщения, заданного или как true
или как false
.
Установите это свойство на true
, если полученное сообщение является комплексным. Установите свойство на false
, если полученное сообщение действительно.
Типы данных: логический
dataR = udpr()
dataR
— Данные полученыДанные получены от сети, возвращенной как один пакет. Свойство MaximumMessageLength задает максимальное количество байтов, которые может содержать каждый пакет данных. Длина полученных данных является количеством байтов, полученных от сети.
Данные получены как комплексные данные, если свойство IsMessageComplex
установлено в true
.
Типы данных: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
Поддержка комплексного числа: Да
Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj
, используйте этот синтаксис:
release(obj)
Отправьте и получите пакеты UDP с помощью Системных объектов dsp.UDPReceiver
и dsp.UDPSender
. Вычислите количество байтов, успешно переданных.
Примечание: Если вы используете R2016a или более ранний релиз, заменяете каждый вызов объекта с эквивалентным синтаксисом шага. Например, obj(x)
становится step(obj,x)
.
Установите RemoteIPPort
отправителя UDP и LocalIPPort
получателя UDP к 31000
. Установите длину вектора данных к выборкам 128
, который является меньше, чем значение свойства MaximumMessageLength
получателя. Чтобы предотвратить потерю пакетов, вызовите метод setup
на объекте получателя перед первым вызовом объектного алгоритма.
udpr = dsp.UDPReceiver('LocalIPPort',31000); udps = dsp.UDPSender('RemoteIPPort',31000); setup(udpr); bytesSent = 0; bytesReceived = 0; dataLength = 128;
В каждом цикле итерации отправьте и получите пакет данных. В конце цикла используйте функцию fprintf
, чтобы распечатать количество байтов, отправленных отправителем и количеством байтов, полученных получателем.
for k = 1:20 dataSent = uint8(255*rand(1,dataLength)); bytesSent = bytesSent + dataLength; udps(dataSent); dataReceived = udpr(); bytesReceived = bytesReceived + length(dataReceived); end release(udps); release(udpr); fprintf('Bytes sent: %d\n', bytesSent);
Bytes sent: 2560
fprintf('Bytes received: %d\n', bytesReceived);
Bytes received: 2560
Локальный номер порта IP объекта dsp.UDPReceiver
и удаленный номер порта IP объекта dsp.UDPSender
являются настраиваемыми в сгенерированном коде. Сгенерируйте файл MEX от функции receiver
, которая содержит алгоритм, чтобы получить данные о синусоиде по сети UDP. Измените удаленный номер порта IP получателя UDP, не регенерируя файл MEX. Проверьте количество байтов, отправленных и полученных по сети.
Примечание: Этот пример запускается только в R2017a или позже.
Вход к функции receiver
является локальным номером порта IP Системы dsp.UDPReceiver
object™. Вывод этой функции является количеством байтов, полученных от сети UDP.
type receiver
function [bytesReceived] = receiver(portnumber) persistent udpRx if isempty(udpRx) udpRx = dsp.UDPReceiver('MessageDataType','double'); end udpRx.LocalIPPort = portnumber; dataReceived = udpRx(); bytesReceived = length(dataReceived);
Объект dsp.UDPSender
с набором номера remoteIPPort
к 65 000 отправляет данные по сети UDP. Объект dsp.UDPReceiver
с набором номера LocalIPPort
к 65 000 получает данные из сети UDP. Данные являются синусоидой, содержащей 250 выборок на кадр.
portnumber = 65000; udpSend = dsp.UDPSender('RemoteIPPort',portnumber); sine = dsp.SineWave('SamplesPerFrame',250); bytesSent = 0; bytesReceived = 0; dataLength = 250; for i = 1:10 dataSent = sine(); bytesSent = bytesSent + dataLength; udpSend(dataSent); bytesReceived = bytesReceived + receiver(portnumber); end fprintf('Number of bytes sent: %d', bytesSent);
Number of bytes sent: 2500
fprintf('Number of bytes received: %d', bytesReceived);
Number of bytes received: 2250
Данные отправлены и получены успешно по сети UDP. Исходные данные пропущены из-за издержек.
Сгенерируйте файл MEX от функции receiver.m
.
codegen receiver -args {65000}
Выпустите отправителя и измените номер RemoteIPPort
на 25 000. Количество LocalIPPort
получателя продолжает быть 65000. Поскольку номера портов отличаются, данные не передаются успешно.
release(udpSend) portnumberTwo = 25000; udpSend.RemoteIPPort = portnumberTwo; bytesReceived = 0; bytesSent = 0; for i = 1:10 dataSent = sine(); bytesSent = bytesSent + dataLength; udpSend(dataSent); bytesReceived = bytesReceived + receiver_mex(portnumber); end fprintf('Number of bytes sent: %d', bytesSent);
Number of bytes sent: 2500
fprintf('Number of bytes received: %d', bytesReceived);
Number of bytes received: 0
Очистите файл MEX и измените локальный номер порта IP получателя к 25 000. Очистка MEX позволяет номеру порта получателя измениться, не имея необходимость регенерировать MEX. Номера портов отправителя и соответствия получателя. Проверьте, передаются ли данные успешно.
clear mex %#ok bytesReceived = 0; bytesSent = 0; for i = 1:10 dataSent = sine(); bytesSent = bytesSent + dataLength; udpSend(dataSent); bytesReceived = bytesReceived + receiver_mex(portnumberTwo); end fprintf('Number of bytes sent: %d', bytesSent);
Number of bytes sent: 2500
fprintf('Number of bytes received: %d', bytesReceived);
Number of bytes received: 2250
Данные передаются успешно по сети UDP. Исходные данные пропущены из-за издержек.
Вычислите STFT синусоиды и передайте комплексные данные STFT по сети UDP. В стороне получателя вычислите ISTFT полученных данных. Визуализируйте отправленные данные, и данные получили использование осциллографа времени.
Объект dsp.UDPSender
может отправить комплексные данные. В порядке включить объекту dsp.UDPReceiver
получить комплексные данные, установите свойство IsMessageComplex
на true
.
udps = dsp.UDPSender('RemoteIPPort',31000); udpr = dsp.UDPReceiver('LocalIPPort',31000,'IsMessageComplex',true,'MessageDataType','double'); setup(udpr); bytesSent = 0; bytesReceived = 0; dataLength = 128;
Инициализируйте dsp.STFT
и Системные объекты dsp.ISTFT
с периодическим окном hann
длины 120 выборок и продолжительность перекрытия 60 выборок. Установите длину БПФ на 128.
winLen = 120; overlapLen = 60; frameLen = winLen-overlapLen; stf = dsp.STFT('Window',hann(winLen,'periodic'),'OverlapLength',overlapLen,'FFTLength',128); istf = dsp.ISTFT('Window',hann(winLen,'periodic'),'OverlapLength',overlapLen,'WeightedOverlapAdd',0);
Вход является синусоидальным сигналом с частотой 100 Гц, частотой дискретизации 1 000 Гц, и с 60 выборками на каждый кадр сигнала.
sine = dsp.SineWave('SamplesPerFrame',winLen-overlapLen,'Frequency',100);
Инициализируйте объект dsp.TimeScope
с частотой дискретизации 1 000 Гц и отрезком времени 0,09. Объект Delay
исправляет длину перекрытия при сравнении входа с восстановленным выходным сигналом.
ts = dsp.TimeScope('SampleRate',1000,'ShowLegend',true,'YLimits',[-1 1],'TimeSpan',.09,... 'ChannelNames',{'Input','Reconstructed'}); dly = dsp.Delay('Length',overlapLen);
Комплекс передачи данные STFT синусоиды по сети UDP. Вычислите ISTFT полученных данных. Сравните вход, x
, к восстановленному выводу, y
. Из-за задержки, введенной объектами, восстановленный вывод переключен вовремя по сравнению с входом. Поэтому, чтобы выдержать сравнение, возьмите норму различия между восстановленным выводом, y
, и предыдущим входом, xprev
.
Визуализируйте сигналы с помощью осциллографа времени. Вы видите, что восстановленный сигнал накладывается очень тесно с входным сигналом.
n = zeros(1,1e3); xprev = 0; for k = 1:1e3 x = sine(); X = stf(x); bytesSent = bytesSent + length(X); udps(X); dataReceived = udpr(); if (~isempty(dataReceived)) y = istf(dataReceived); end n(1,k) = norm(y-xprev); xprev = x; bytesReceived = bytesReceived + length(dataReceived); ts([dly(x),y]); end
Норма различия является очень маленькой, указывая, что выходной сигнал является отлично восстановленной версией входного сигнала.
max(abs(n))
ans = 1.4282e-15
Выпустите объекты UDP.
release(udps); release(udpr);
Некоторые отправленные пакеты могут быть потеряны во время передачи из-за природы с потерями протокола UDP. Чтобы проверять на потерю, сравните байты, отправленные в полученные байты.
fprintf('Bytes sent: %d\n', bytesSent);
Bytes sent: 128000
fprintf('Bytes received: %d\n', bytesReceived);
Bytes received: 128000
Указания и ограничения по применению:
Системные объекты в Генерации кода MATLAB (MATLAB Coder)
Исполняемый файл, сгенерированный от этого Системного объекта, полагается на предварительно созданные динамические файлы библиотеки (файлы .dll
) включенный с MATLAB. Используйте функцию packNGo
, чтобы группировать код, сгенерированный от этого объекта и всех соответствующих файлов в сжатом zip-файле. Используя этот zip-файл, можно переместить, распаковать и восстановить проект в другой среде разработки, где MATLAB не установлен. Для получения дополнительной информации смотрите, Как Запустить Сгенерированный Исполняемый файл Вне MATLAB.
Свойство LocalIPPort
является настраиваемым в сгенерированном коде, но не настраиваемым во время симуляции.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.