{"id":165,"date":"2026-10-06T06:35:44","date_gmt":"2026-10-06T10:35:44","guid":{"rendered":"https:\/\/blogs.mathworks.com\/engineering\/?p=165"},"modified":"2026-10-06T06:37:00","modified_gmt":"2026-10-06T10:37:00","slug":"flexible-channel-emulation-workflows-on-usrps-with-matlab-and-simulink","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/engineering\/2026\/10\/06\/flexible-channel-emulation-workflows-on-usrps-with-matlab-and-simulink\/","title":{"rendered":"Flexible Channel Emulation Workflows on USRPs with MATLAB and Simulink"},"content":{"rendered":"<div class = rtcContent>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\"><\/span><\/div>\n<h2  style = 'margin: 20px 10px 5px 4px; padding: 0px; line-height: 25px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 20px; font-weight: 700; text-align: left; ' id = 'TMP_0801' ><span class=\"_richTextNode\">Guest bloggers: <\/span><\/h2>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-weight: bold;'>Nadia Shivarova (Senior Wireless Application Engineer) &amp; Neil MacEwen (Pricinpal Development Engineer)<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Nadia Shivarova is a senior wireless specialist application engineer at MathWorks, working with customers in multiple industries to adopt the tools and accelerate their development. She specializes in modelling wireless standards, end-to-end systems and deployment to SDRs. She joined MathWorks in 2016 as a quality engineer as part of the HDL group, then transitioned to application engineering in 2020. Recent interests include 6G, NTN and AI for wireless. She holds an MEng in Electronic and Electrical Engineering from University of Strathclyde, Glasgow.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Neil MacEwen is a Principal Development Engineer at MathWorks specializing in wireless communications, Software-Defined Radio (SDR), and FPGA development. His work focuses on rapid prototyping of next-generation wireless, radar, and sensing systems using MATLAB, Simulink, and NI USRP hardware. He holds an MEng in Electronic and Electrical Engineering and a PhD in communication systems for wireless sensor networks from the University of Strathclyde.<\/span><\/div>\n<h2  style = 'margin: 20px 10px 5px 4px; padding: 0px; line-height: 25px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 20px; font-weight: 700; text-align: left; ' id = 'TMP_2bdd' ><span class=\"_richTextNode\">Overview<\/span><\/h2>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">In this post we walk through a Model-Based Design workflow for building wireless signal processing on the FPGA of an <\/span><a href = \"https:\/\/www.ni.com\/en\/shop\/wireless-design-test\/what-is-a-usrp-software-defined-radio.html\"><span class=\"_richTextNode\">NI USRP radio <\/span><\/a><span class=\"_richTextNode\">with Wireless Testbench, using SISO terrestrial <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/wireless-testbench\/ug\/channel-emulation-on-ni-usrp-radio.html\"><span class=\"_richTextNode\">channel emulation as the example<\/span><\/a><span class=\"_richTextNode\">. We handle the scenario, waveforms and test vectors, the reference model, device control and analysis through MATLAB, and the HDL-compatible implementation and the move to fixed point through Simulink. The channel emulator is built from behavioural model to validated on hardware. It can be extended to MIMO, reconfigured for NTN, or leveraged for AI training data and low-PHY work in O-RAN architectures.<\/span><\/div>\n<h2  style = 'margin: 20px 10px 5px 4px; padding: 0px; line-height: 25px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 20px; font-weight: 700; text-align: left; ' id = 'TMP_9f24' ><span class=\"_richTextNode\">Introduction<\/span><\/h2>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Wireless research validation often requires more than simulation and more control than purely over-the-air (OTA) testing can provide. Teams want to define representative wireless scenarios, implement real-time signal processing on hardware, and validate the results against software references without rebuilding the workflow at each step.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">That&#8217;s the gap the Wireless Testbench deployment workflow addresses. MATLAB stays the environment for scenarios, standard-compliant waveforms, reference behaviour, control and analysis. Simulink holds the HDL-compatible implementation, and synthesisable HDL is generated from it. The USRP brings FPGA processing and RF together on one platform. None of this is toy-scale: the same approach has been used for much larger designs, such as <\/span><a href = \"https:\/\/uk.mathworks.com\/campaigns\/offers\/deploying-5g-nr-on-fpgas-white-paper.html\"><span class=\"_richTextNode\">an NR 5G SIB1 receiver<\/span><\/a><span class=\"_richTextNode\">.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Channel emulation is a good test of the idea. Receiver behaviour, synchronisation, beamforming decisions, link adaptation and waveform robustness all depend on delay, multipath fading and UE mobility.  An emulator in the live signal path gives you realistic conditions that are repeatable and can be reconfigured from MATLAB between runs.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Put that emulator on a USRP and you have a practical hardware-in-the-loop setup. You evaluate behaviour on real hardware under controlled conditions, not just offline. If you read the earlier <\/span><a href = \"https:\/\/blogs.mathworks.com\/engineering\/2026\/08\/20\/how-do-we-know-our-system-will-actually-work\/\"><span class=\"_richTextNode\">post on the desktop simulation, SiL, PiL and HiL<\/span><\/a><span class=\"_richTextNode\">, this is HiL applied to wireless.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The example here is a terrestrial, multipath, ray-traced scenario. The workflow carries over to more channel paths, MIMO, NTN and controlled dataset generation for AI, which we come back to at the end.<\/span><\/div>\n<h2  style = 'margin: 20px 10px 5px 4px; padding: 0px; line-height: 25px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 20px; font-weight: 700; text-align: left; ' id = 'TMP_9b60' ><span class=\"_richTextNode\" style=' font-weight: bold;'>Channel Emulation on NI USRP Radios<\/span><\/h2>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/wireless-testbench\/ug\/channel-emulation-on-ni-usrp-radio.html\"><span class=\"_richTextNode\">example<\/span><\/a><span class=\"_richTextNode\"> is in the Wireless Testbench documentation. It takes a multipath channel from a ray-traced scenario in MATLAB to an emulator running on the USRP FPGA, then checks the hardware against a software reference. Figure 1 is the map for the rest of this post.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><img class = \"imageNode\" src = \"http:\/\/blogs.mathworks.com\/engineering\/files\/2026\/10\/FlexibleChannelEmulationWorkflows_1-4.png\" width = \"626\" height = \"231\" alt = \"\" style = \"vertical-align: baseline; width: 626px; height: 231px;\"><\/img><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-style: italic;'>Figure 1: Model-Based Design for USRP<\/span><\/div>\n<ol  style = 'margin: 10px 0px 20px; padding-left: 0px; font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-size: 14px; '>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><span class=\"_richTextNode\">A MATLAB test bench that generates required path delays and gains based on a terrestrial ray tracing scenario.<\/span><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><span class=\"_richTextNode\">A fixed-point, HDL-compatible Simulink implementation of a multipath channel emulator device-under-test (DUT) implementing integer and fractional delays.<\/span><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><span class=\"_richTextNode\">Deployment of the design to a supported NI USRP FPGA using the Wireless Testbench deployment workflow.<\/span><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><span class=\"_richTextNode\">A host MATLAB I\/Q streaming configuration and validation of the deployed design against a software golden reference<\/span><\/li>\n<\/ol>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\"><\/span><\/div>\n<h2  style = 'margin: 20px 10px 5px 4px; padding: 0px; line-height: 25px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 20px; font-weight: 700; text-align: left; ' id = 'TMP_1658' ><span class=\"_richTextNode\">Workflow summary <\/span><\/h2>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The deployment flow has five stages, shown in Figure 2.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><img class = \"imageNode\" src = \"http:\/\/blogs.mathworks.com\/engineering\/files\/2026\/10\/FlexibleChannelEmulationWorkflows_2-4.png\" width = \"618\" height = \"370\" alt = \"\" style = \"vertical-align: baseline; width: 618px; height: 370px;\"><\/img><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-style: italic;'>Figure 2: Wireless Testbench USRP deployment workflow<\/span><\/div>\n<ol  style = 'margin: 10px 0px 20px; padding-left: 0px; font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-size: 14px; '>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><span class=\"_richTextNode\" style=' font-weight: bold;'>Setup.<\/span><span class=\"_richTextNode\"> Configure the environment, the toolchain and a saved radio configuration.<\/span><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><span class=\"_richTextNode\" style=' font-weight: bold;'>Simulink model.<\/span><span class=\"_richTextNode\"> Model the algorithm in MATLAB, then Simulink. Convert from floating to fixed point, and check functional behaviour and the AXI interfaces in simulation.<\/span><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><span class=\"_richTextNode\" style=' font-weight: bold;'>IP core generation settings.<\/span><span class=\"_richTextNode\"> Set the HDL code generation options, pick the USRP target and map the DUT&#8217;s AXI interfaces to the radio.<\/span><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><span class=\"_richTextNode\" style=' font-weight: bold;'>Generate bitstream.<\/span><span class=\"_richTextNode\"> Generate the <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/hdlcoder\/ug\/custom-ip-core-generation.html\"><span class=\"_richTextNode\">HDL IP core<\/span><\/a><span class=\"_richTextNode\">, wrap it as an RFNoC block and let Vivado integrate the design and build the bitstream.<\/span><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><span class=\"_richTextNode\" style=' font-weight: bold;'>Host interface script.<\/span><span class=\"_richTextNode\"> Generate the MATLAB script that programs the radio, connects to the deployed design and controls it for HIL validation.<\/span><\/li>\n<\/ol>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">You can run all of this interactively from the HDL Code tab in Simulink (Figure 3). The tab is laid out in the same order as the workflow. You choose the output, prepare the settings and target interface, generate the IP core, build the bitstream, then generate the host interface script.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><img class = \"imageNode\" src = \"http:\/\/blogs.mathworks.com\/engineering\/files\/2026\/10\/FlexibleChannelEmulationWorkflows_3-4.png\" width = \"659\" height = \"76\" alt = \"\" style = \"vertical-align: baseline; width: 659px; height: 76px;\"><\/img><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-style: italic;'>Figure 3: Simulink HDL Code toolstrip <\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">For CI\/CD, the same steps are available through a MATLAB API. That matters more than it sounds. Once the hardware build is a pipeline step, regressions in the FPGA design get caught the same way software ones do.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">I won&#8217;t repeat the full procedure here, because the documentation covers it in better detail.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\"><\/span><\/div>\n<h2  style = 'margin: 20px 10px 5px 4px; padding: 0px; line-height: 25px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 20px; font-weight: 700; text-align: left; ' id = 'TMP_6f89' ><span class=\"_richTextNode\" style=' font-weight: bold;'>Channel Emulator HDL IP<\/span><\/h2>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Now for the detail. Figure 4 shows what actually runs on the radio.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><img class = \"imageNode\" src = \"http:\/\/blogs.mathworks.com\/engineering\/files\/2026\/10\/FlexibleChannelEmulationWorkflows_4-4.png\" width = \"451\" height = \"332\" alt = \"\" style = \"vertical-align: baseline; width: 451px; height: 332px;\"><\/img><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-style: italic;'>Figure 4: Deployed channel emulator DUT<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The host transmits a test signal out of DAC 0, which loops back over RF into ADC 0. The channel filter applies the multipath delays and gains, sends the result out of DAC 1, and it loops back into ADC 1 for capture. Delays and path gains stream in separately from MATLAB, so you can change the channel without rebuilding the bitstream. Because the signal passes through the radio&#8217;s real converters on both sides, the test covers more than the FPGA logic.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The channel itself comes from a terrestrial <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/comm\/ug\/ray-tracing-for-wireless-communications.html\"><span class=\"_richTextNode\">ray tracing<\/span><\/a><span class=\"_richTextNode\"> scenario (Figure 5). <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/comm\/ref\/comm.raytracingchannel-system-object.html\"><span class=\"_richTextNode\" style=' font-family: monospace;'>comm.RayTracingChannel<\/span><\/a><span class=\"_richTextNode\"> uses shooting and bouncing rays (SBR) over buildings from an OpenStreetMap file, and can account for building materials, antenna beamforming, reflections and diffraction. What we get out is a set of path delays and gains. This scenario produced 11 paths, set through MATLAB variables.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><img class = \"imageNode\" src = \"http:\/\/blogs.mathworks.com\/engineering\/files\/2026\/10\/FlexibleChannelEmulationWorkflows_5-4.png\" width = \"419\" height = \"318\" alt = \"\" style = \"vertical-align: baseline; width: 419px; height: 318px;\"><\/img><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-style: italic;'>Figure 5: Terrestrial ray tracing scenario<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The same scenario drives the golden reference: <\/span><a href = \"https:\/\/www.mathworks.com\/help\/comm\/ref\/comm.channelfilter-system-object.html\"><span class=\"_richTextNode\" style=' font-family: monospace;'>comm.ChannelFilter<\/span><\/a><span class=\"_richTextNode\">, a floating-point model of what the hardware should do. Because it exists before deployment, problems show up in simulation rather than on the bench, where they cost more to find.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The Simulink model shown in <\/span><span class=\"_richTextNode\">Figure <\/span><span class=\"_richTextNode\">6<\/span><span class=\"_richTextNode\"> maps that behavior into an HDL-compatible, fixed-point arithmetic DUT implementation of a channel filter with AXI4 Stream interfaces and registers. The design uses highly optimized blocks for HDL code generation, such as reprogrammable <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/releases\/R2026a\/dsphdl\/ref\/discretefirfilter.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>discrete FIR filters<\/span><\/a><span class=\"_richTextNode\">, complex multiplications, and counters to implement streaming logic, per-path delay handling, complex gain application, and path combination. This makes the model suitable for FPGA targeting while preserving a clear connection to the original channel concept.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><img class = \"imageNode\" src = \"http:\/\/blogs.mathworks.com\/engineering\/files\/2026\/10\/FlexibleChannelEmulationWorkflows_6-4.png\" width = \"687\" height = \"494\" alt = \"\" style = \"vertical-align: baseline; width: 687px; height: 494px;\"><\/img><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-style: italic;'>Figure <\/span><span class=\"_richTextNode\" style=' font-style: italic;'>6<\/span><span class=\"_richTextNode\" style=' font-style: italic;'> Channel emulator IP implementation model<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The next step is to choose the USRP device to target, including FPGA rate and required streaming interfaces. This is shown in <\/span><span class=\"_richTextNode\">Figure <\/span><span class=\"_richTextNode\">7<\/span><span class=\"_richTextNode\">. Finally we indicate which ports on the Simulink model correspond to which interfaces on the Target Interface.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><img class = \"imageNode\" src = \"http:\/\/blogs.mathworks.com\/engineering\/files\/2026\/10\/FlexibleChannelEmulationWorkflows_7-2.png\" width = \"690\" height = \"692\" alt = \"\" style = \"vertical-align: baseline; width: 690px; height: 692px;\"><\/img><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-style: italic;'>Figure <\/span><span class=\"_richTextNode\" style=' font-style: italic;'>7<\/span><span class=\"_richTextNode\" style=' font-style: italic;'> Radio and DUT configuration parameters<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">From there it&#8217;s automated. The flow generates a device-agnostic HDL IP core, wraps it as an RFNoC block, and runs Vivado in a shell to integrate the design and produce the bitstream and auxiliary files. It can also generate the MATLAB host script, already populated with the functions to program the FPGA, stream data and update registers. <\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\"><\/span><\/div>\n<h2  style = 'margin: 20px 10px 5px 4px; padding: 0px; line-height: 25px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 20px; font-weight: 700; text-align: left; ' id = 'TMP_1397' ><span class=\"_richTextNode\">Validation<\/span><\/h2>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Validation happens at three levels: the functional correctness, the speed and area fit on the FPGA, and the behaviour on hardware.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-weight: bold;'>Fixed point against floating point.<\/span><span class=\"_richTextNode\"> Once the fixed-point model is built, compare its output with the floating-point MATLAB reference. That tells you whether the data types have enough precision, range and scaling. In this example the maximum error stays within a 1e-4 tolerance (Figure 8).<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><img class = \"imageNode\" src = \"http:\/\/blogs.mathworks.com\/engineering\/files\/2026\/10\/FlexibleChannelEmulationWorkflows_8-2.png\" width = \"692\" height = \"397\" alt = \"\" style = \"vertical-align: baseline; width: 692px; height: 397px;\"><\/img><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-style: italic;'>Figure <\/span><span class=\"_richTextNode\" style=' font-style: italic;'>8<\/span><span class=\"_richTextNode\" style=' font-style: italic;'> Validating quantization error between floating- and fixed-point models<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-weight: bold;'>Speed against area.<\/span><span class=\"_richTextNode\"> Next comes iterating on the FPGA requirements. Pipelining raises the achievable clock rate but adds latency. Resource sharing saves area, also at the cost of latency. HDL Coder automates a lot of these <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/hdlcoder\/ug\/introduction-to-speed-and-area-optimizations-in-hdl-coder.html\"><span class=\"_richTextNode\">optimisations<\/span><\/a><span class=\"_richTextNode\">. The full RFNoC design was synthesised for 200 MHz, and the table below shows the channel emulator IP on its own.<\/span><\/div>\n<table  style = 'margin: 3px; border: 0.666667px solid rgb(191, 191, 191); border-collapse: collapse; '>\n<col\/>\n<col\/>\n<col\/>\n<col\/>\n<col\/>\n<tr  style = 'background-color: rgba(0, 0, 0, 0); '>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-weight: bold;'>USRP Target<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-weight: bold;'>LUTs (%)<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-weight: bold;'>FFs (%)<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-weight: bold;'>BRAM (%)<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-weight: bold;'>DSP (%)<\/span><\/div>\n<\/td>\n<\/tr>\n<tr  style = 'background-color: rgba(0, 0, 0, 0); '>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">X310<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">5579 (2.19)<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">16363 (3.22)<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">51 (3.21)<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">364 (23.64)<\/span><\/div>\n<\/td>\n<\/tr>\n<tr  style = 'background-color: rgba(0, 0, 0, 0); '>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">X410<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">5661 (1.33)<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">16856 (1.98)<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">38 (1.78)<\/span><\/div>\n<\/td>\n<td  style = 'border: 0.666667px solid rgb(191, 191, 191); vertical-align: top; '>\n<div  style = 'margin: 2px 10px 2px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">364 (8.52)<\/span><\/div>\n<\/td>\n<\/tr>\n<\/table>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: center; '><span class=\"_richTextNode\" style=' font-style: italic;'><\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">To enable scaling up to MIMO, this model allows DSP resource sharing to be set via a MATLAB variable. This would significantly reduce DSP resources at the expense of latency as the number of input and output channels grow and consume more resources.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-weight: bold;'>Hardware against reference.<\/span><span class=\"_richTextNode\"> With the IP running on the radio, you can drive it from MATLAB. You can stimulate the DUT from the radio front end, or stream complex I\/Q straight from the host as AXI4-Stream over Ethernet. Code snippets on the host side look like this:<\/span><\/div>\n<div class = 'preformatted-matlab' style = 'margin: 10px 3px 10px 55px; padding: 10px 10px 10px 5px; '>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span style=\"color: rgb(0, 128, 19);\">% Set up the radio and download the bitstream<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >device = usrp(radio);<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >programFPGA(device, <\/span><span style=\"color: rgb(14, 0, 255);\">&#8230;<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >    <\/span><span style=\"color: rgb(167, 9, 245);\">&#8220;build_N320_HG\/build-N320_HG\/n3xx.bit&#8221;<\/span><span >, <\/span><span style=\"color: rgb(14, 0, 255);\">&#8230;<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >    <\/span><span style=\"color: rgb(167, 9, 245);\">&#8220;build_N320_HG\/build\/usrp_n320_fpga_HG.dts&#8221;<\/span><span >);<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >describeFPGA(device, <\/span><span style=\"color: rgb(167, 9, 245);\">&#8220;wtChannelEmulatorSL_wthandoffinfo.mat&#8221;<\/span><span >);<\/span><\/span><\/div>\n<\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\"><\/span><\/div>\n<div class = 'preformatted-matlab' style = 'margin: 10px 3px 10px 55px; padding: 10px 10px 10px 5px; '>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span style=\"color: rgb(0, 128, 19);\">% Select physical antenna ports<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >device.TransmitAntennas = <\/span><span style=\"color: rgb(167, 9, 245);\">&#8220;RF0:TX\/RX&#8221;<\/span><span >;<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >device.CaptureAntennas = <\/span><span style=\"color: rgb(167, 9, 245);\">&#8220;RF0:RX2&#8221;<\/span><span >;<\/span><\/span><\/div>\n<\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\"><\/span><\/div>\n<div class = 'preformatted-matlab' style = 'margin: 10px 3px 10px 55px; padding: 10px 10px 10px 5px; '>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span style=\"color: rgb(0, 128, 19);\">% Initialise the FPGA and write the channel parameters<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >dut = fpga(device);<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >writePort(dut, <\/span><span style=\"color: rgb(167, 9, 245);\">&#8220;pathGains_data&#8221;<\/span><span >, sl_in.PathGains(:,1));<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >writePort(dut, <\/span><span style=\"color: rgb(167, 9, 245);\">&#8220;delays_data&#8221;<\/span><span >, delays);<\/span><\/span><\/div>\n<\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\"><\/span><\/div>\n<div class = 'preformatted-matlab' style = 'margin: 10px 3px 10px 55px; padding: 10px 10px 10px 5px; '>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span style=\"color: rgb(0, 128, 19);\">% Set up the test vector<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >txData = int16(impulse * 2^15);<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >captureLen = impulseLen * 5;<\/span><\/span><\/div>\n<\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\"><\/span><\/div>\n<div class = 'preformatted-matlab' style = 'margin: 10px 3px 10px 55px; padding: 10px 10px 10px 5px; '>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span style=\"color: rgb(0, 128, 19);\">% Transmit continuously into the FPGA<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >transmit(device, txData, <\/span><span style=\"color: rgb(167, 9, 245);\">&#8220;continuous&#8221;<\/span><span >);<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >device(captureLen);<\/span><\/span><\/div>\n<\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\"><\/span><\/div>\n<div class = 'preformatted-matlab' style = 'margin: 10px 3px 10px 55px; padding: 10px 10px 10px 5px; '>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span style=\"color: rgb(0, 128, 19);\">% Capture the DUT output back to the host for validation<\/span><\/span><\/div>\n<div  style = 'border-left: 0px none rgb(33, 33, 33); border-right: 0px none rgb(33, 33, 33); border-top: 0px none rgb(33, 33, 33); border-bottom: 0px none rgb(33, 33, 33); border-radius: 0px; padding: 0px; line-height: 15.6px; min-height: 16px; white-space: pre; color: rgb(33, 33, 33); font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; font-size: 12px; '><span style=\"white-space: pre\"><span >[dataOut, numSamps] = capture(device, captureLen);<\/span><\/span><\/div>\n<\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\"><\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The same script captures the DUT output. That means two checks: the impulse response against the golden reference, and the frequency-selective behaviour against what the ray-traced scenario predicts (Figure 9).<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><img class = \"imageNode\" src = \"http:\/\/blogs.mathworks.com\/engineering\/files\/2026\/10\/FlexibleChannelEmulationWorkflows_9-2.png\" width = \"633\" height = \"396\" alt = \"spectrum-analyzer-output.png\" style = \"vertical-align: baseline; width: 633px; height: 396px;\"><\/img><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\" style=' font-style: italic;'>Figure <\/span><span class=\"_richTextNode\" style=' font-style: italic;'>9<\/span><span class=\"_richTextNode\" style=' font-style: italic;'> Spectrum analyzer visualization of I\/Q data<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">That closes the loop. The environment that defined the channel is the one that decides whether the hardware got it right.<\/span><\/div>\n<h2  style = 'margin: 20px 10px 5px 4px; padding: 0px; line-height: 25px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 20px; font-weight: 700; text-align: left; ' id = 'TMP_897b' ><span class=\"_richTextNode\">Additional Use Cases<\/span><\/h2>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Although the current example is focused on a terrestrial multipath scenario, the workflow is relevant to several broader use cases.<\/span><\/div>\n<h3  style = 'margin: 15px 10px 5px 4px; padding: 0px; line-height: 20.4px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 17px; font-weight: 700; text-align: left; ' id = 'TMP_9374' ><span class=\"_richTextNode\">SISO to MIMO Channel<\/span><\/h3>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The methodology is not limited to SISO. As the number of antennas and links grow, the design becomes more demanding in terms of interfaces, memory, and FPGA resources, but the same workflow applies. Simulink is able to handle data vectors creates a natural extension to a MIMO channel emulator. That makes the example a useful stepping stone toward MIMO and beamforming studies. For further up-scaling and synchronizing time and phase across multiple USRPs using the OctoClock, see <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/wireless-testbench\/ug\/connect-and-synchronize-multiple-ni-usrp-radios.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Connect and Synchronize Multiple NI USRP Radios<\/span><\/a><span class=\"_richTextNode\"> example.<\/span><\/div>\n<h3  style = 'margin: 15px 10px 5px 4px; padding: 0px; line-height: 20.4px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 17px; font-weight: 700; text-align: left; ' id = 'TMP_1108' ><span class=\"_richTextNode\">NTN Research<\/span><\/h3>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">This workflow is also extensible toward non-terrestrial network (NTN) scenarios. In these cases, <\/span><a href = \"https:\/\/uk.mathworks.com\/products\/satellite-communications.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Satellite Communications Toolbox<\/span><\/a><span class=\"_richTextNode\"> can help derive orbit scenario parameters, such as <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/satcom\/ug\/calculate-latency-and-doppler-in-a-satellite-scenario.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>doppler and latency<\/span><\/a><span class=\"_richTextNode\">. 5G Toolbox <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/5g\/ref\/nrtdlchannel-system-object.html?s_tid=srchtitle_support_results_1_nrtdlchannel#mw_4399bf49-09df-4c24-9365-3a0a0139d48a\"><span class=\"_richTextNode\" style=' font-style: italic; text-decoration: underline;'>nrTDLChannel<\/span><\/a><span class=\"_richTextNode\" style=' font-style: italic; text-decoration: underline;'> <\/span><span class=\"_richTextNode\">or <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/5g\/ref\/nrcdlchannel-system-object.html?s_tid=ta_help_results#mw_22a2ffc3-057c-4312-ae61-03d5039db30a\"><span class=\"_richTextNode\" style=' font-style: italic; text-decoration: underline;'>nrCDLChannel<\/span><\/a><span class=\"_richTextNode\" style=' font-style: italic; text-decoration: underline;'> <\/span><span class=\"_richTextNode\">3GPP NTN profiles can configure the path gains and delays. For more information on NTN channel modeling, see <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/satcom\/ug\/model-nr-ntn-channel.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Model NR NTN Channel<\/span><\/a><span class=\"_richTextNode\">. <\/span><\/div>\n<h3  style = 'margin: 15px 10px 5px 4px; padding: 0px; line-height: 20.4px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 17px; font-weight: 700; text-align: left; ' id = 'TMP_3bb9' ><span class=\"_richTextNode\">AI Training Data<\/span><\/h3>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Channel emulation can also support AI and machine learning workflows. A controllable deployed setup can be used to generate labelled training and validation data under repeatable wireless conditions. By sweeping channel parameters deliberately, teams can create datasets with clearer provenance and more systematic scenario coverage than uncontrolled OTA capture alone. Explore the <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/wireless-testbench\/ug\/capture-and-label-nr-and-lte-signals-for-ai-training.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Capture and Label NR and LTE Signals for AI Training<\/span><\/a><span class=\"_richTextNode\"> example to see how USRPs can be leveraged for this purpose.<\/span><\/div>\n<h3  style = 'margin: 15px 10px 5px 4px; padding: 0px; line-height: 20.4px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 17px; font-weight: 700; text-align: left; ' id = 'TMP_1f92' ><span class=\"_richTextNode\">O-RAN Research<\/span><\/h3>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Deploying processing to the USRP FPGA can help isolate low-PHY behavior from higher-layer or software-based processing. That makes the workflow relevant to O-RAN-style split experimentation, where lower-layer timing behavior may need to be studied independently of the rest of the stack. For more information, explore <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/wireless-hdl\/ug\/hdlofdmtransmitter.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>HDL OFDM Transmitter<\/span><\/a><span class=\"_richTextNode\"> and <\/span><a href = \"https:\/\/uk.mathworks.com\/help\/wireless-testbench\/ug\/introduction-to-custom-ofdm-on-ni-usrp-radio.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Introduction to Custom OFDM on NI USRP Radio<\/span><\/a><span class=\"_richTextNode\"> examples. <\/span><\/div>\n<h3  style = 'margin: 15px 10px 5px 4px; padding: 0px; line-height: 20.4px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 17px; font-weight: 700; text-align: left; ' id = 'TMP_2bae' ><span class=\"_richTextNode\">OAI Testbeds<\/span><\/h3>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The same channel emulation concept can fit into broader SDR and open testbed environments. In OpenAirInterface-style systems and related research setups, a controlled channel stage can complement higher-layer experimentation by adding repeatable wireless behavior to the overall platform. <\/span><\/div>\n<h3  style = 'margin: 15px 10px 5px 4px; padding: 0px; line-height: 20.4px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 17px; font-weight: 700; text-align: left; ' id = 'TMP_4832' ><span class=\"_richTextNode\">Conclusion<\/span><\/h3>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">This application note uses channel emulation to illustrate a broader MATLAB and Simulink Wireless Testbench workflow for NI USRP radios. The value of the workflow is not only that it can produce a flexible, working FPGA deployment, but also that it preserves continuity from scenario definition to deployed validation.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">MATLAB supports the front end of the process through modeling, test vector waveforms, and golden references. Simulink provides the environment to design and test the HDL-compatible model. Deployment using Wireless Testbench in MATLAB provides the bridge to USRP hardware, host control and analysis layer for HIL validation.<\/span><\/div>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">Channel emulation is a strong example because it demonstrates how this workflow supports real-time HIL wireless experimentation while remaining repeatable, extensible, and practical for research and prototyping. It also provides a natural path toward related use cases such as MIMO studies, NTN parameterization, AI dataset generation, and low-PHY exploration in O-RAN research. <\/span><\/div>\n<h2  style = 'margin: 20px 10px 5px 4px; padding: 0px; line-height: 25px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 20px; font-weight: 700; text-align: left; '><span class=\"_richTextNode\">Appendix Tool Requirements<\/span><\/h2>\n<div  style = 'margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre; color: rgb(33, 33, 33); font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: 400; text-align: left; '><span class=\"_richTextNode\">The exact deployment requirements depend on the target radio and build environment, but this workflow assumes the following components:<\/span><\/div>\n<ul  style = 'margin: 10px 0px 20px; padding-left: 0px; font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-size: 14px; '>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><a href = \"https:\/\/uk.mathworks.com\/products\/matlab.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>MATLAB<\/span><\/a><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><a href = \"https:\/\/uk.mathworks.com\/products\/simulink.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Simulink<\/span><\/a><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><a href = \"https:\/\/uk.mathworks.com\/products\/wireless-testbench.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Wireless Testbench<\/span><\/a><\/li>\n<ul  style = 'margin: 0px 0px 0px 25.2px; padding-left: 0px; font-family: Helvetica, Arial, sans-serif, Helvetica, Arial, sans-serif; font-size: 14px; '>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><a href = \"https:\/\/uk.mathworks.com\/matlabcentral\/fileexchange\/106930-ni-usrp-radio-support-from-wireless-testbench\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Wireless Testbench Support Package for NI USRP Radios<\/span><\/a><\/li>\n<\/ul>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><a href = \"https:\/\/uk.mathworks.com\/products\/hdl-coder.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>HDL Coder<\/span><\/a><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><a href = \"https:\/\/uk.mathworks.com\/products\/dsp-hdl.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>DSP HDL Toolbox<\/span><\/a><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><a href = \"https:\/\/uk.mathworks.com\/products\/communications.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Communications Toolbox<\/span><\/a><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><a href = \"https:\/\/uk.mathworks.com\/products\/fixed-point-designer.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Fixed-Point Designer<\/span><\/a><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><a href = \"https:\/\/uk.mathworks.com\/help\/wireless-testbench\/gs\/supported-sdr-devices.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>Supported NI USRP radio hardware<\/span><\/a><\/li>\n<li  style = 'margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; '><a href = \"https:\/\/uk.mathworks.com\/help\/wireless-testbench\/ug\/system-requirements.html\"><span class=\"_richTextNode\" style=' text-decoration: underline;'>OS Requirements<\/span><\/a><\/li>\n<\/ul>\n<\/div>\n<p><script type=\"text\/javascript\">var css = '._richTextNode {white-space: break-spaces;}'; var head = document.head || document.getElementsByTagName('head')[0], style = document.createElement('style'); head.appendChild(style); style.type = 'text\/css'; if (style.styleSheet){ style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); }<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"overview-image\"><img src=\"https:\/\/blogs.mathworks.com\/engineering\/files\/2026\/10\/FlexibleChannelEmulationWorkflows_4-4.png\" class=\"img-responsive attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"\" decoding=\"async\" loading=\"lazy\" \/><\/div>\n<p>Guest bloggers:<br \/>\nNadia Shivarova (Senior Wireless Application Engineer) &amp; Neil MacEwen (Pricinpal Development Engineer)<br \/>\nNadia Shivarova is a senior wireless specialist application engineer at&#8230; <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/engineering\/2026\/10\/06\/flexible-channel-emulation-workflows-on-usrps-with-matlab-and-simulink\/\">read more >><\/a><\/p>\n","protected":false},"author":242,"featured_media":315,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/posts\/165"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/users\/242"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/comments?post=165"}],"version-history":[{"count":12,"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/posts\/165\/revisions"}],"predecessor-version":[{"id":322,"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/posts\/165\/revisions\/322"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/media\/315"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/media?parent=165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/categories?post=165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/engineering\/wp-json\/wp\/v2\/tags?post=165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}