Прием пакетов UDP из сети
dsp.UDPReceiver Система object™ принимает пакеты UDP по сети UDP с удаленного IP-адреса, указанного в свойстве RemoteIPAddress. Затем объект сохраняет данные во внутреннем буфере. Объем данных (количество элементов), принимаемых в каждом пакете UDP, может изменяться. Максимальное количество байтов, которое может получить объект без потери данных, задается свойством ReceiveBufferSize. Свойство MaximumStartLength указывает максимальное количество выборок, которое может содержать каждый пакет данных. LocalIPPort, на котором объект получает данные, настраивается в сгенерированном коде, но не настраивается во время моделирования. Пример см. в разделе Настройка номера порта UDP в MATLAB.
Для получения пакетов UDP из сети:
Создать dsp.UDPReceiver и задайте его свойства.
Вызовите объект с аргументами, как если бы это была функция.
Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.
Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.
Если свойство настраивается, его значение можно изменить в любое время.
Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в 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 если полученное сообщение является реальным.
Типы данных: logical
dataR - Полученные данныеДанные, полученные из сети, возвращенные в виде одного пакета. Свойство MaximumStartLength указывает максимальное количество байтов, которое может содержать каждый пакет данных. Длина полученных данных - это количество байтов, полученных из сети.
Данные принимаются как сложные данные, если IsMessageComplex свойство имеет значение true.
Типы данных: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
Поддержка комплексного номера: Да
Чтобы использовать функцию объекта, укажите объект System в качестве первого входного аргумента. Например, для освобождения системных ресурсов объекта System с именем obj, используйте следующий синтаксис:
release(obj)
Отправка и получение пакетов UDP с помощью dsp.UDPSender и dsp.UDPReceiver Системные объекты. Вычислите число байтов, успешно переданных.
Примечание.При использовании 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 receiverfunction [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 номер, равный 65000, передает данные по сети UDP. dsp.UDPReceiver объект с LocalIPPort номер, равный 65000, получает данные из сети 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}
Code generation successful.
Отпустите отправителя и измените RemoteIPPort число до 25000. 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-порта приемника на 25000. Сброс 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 Гц, частотой дискретизации 1000 Гц и с 60 выборками на каждый кадр сигнала.
sine = dsp.SineWave('SamplesPerFrame',winLen-overlapLen,'Frequency',100);
Инициализация timescope объект с частотой дискретизации 1000 Гц и временным интервалом 0,09. Delay объект корректирует длину перекрытия при сравнении входного сигнала с восстановленным выходным сигналом.
ts = timescope('SampleRate',1000,'ShowLegend',true,'YLimits',[-1 1],'TimeSpanSource','Property','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 = 5.3870e-14
Деблокируйте объекты 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)
Исполняемый файл, созданный из этого объекта System, основан на предварительно созданных файлах динамической библиотеки (.dll файлы), входящие в состав MATLAB. Используйте packNGo для упаковки кода, созданного из этого объекта, и всех соответствующих файлов в сжатый zip-файл. С помощью этого zip-файла можно переместить, распаковать и перестроить проект в другой среде разработки, где MATLAB не установлен. Дополнительные сведения см. в разделе Запуск созданного исполняемого файла вне MATLAB.
LocalIPPort свойство может быть настроено в сгенерированном коде, но не может быть настроено во время моделирования.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.