认知无线电频谱切换源码matlab仿真
- 格式:doc
- 大小:152.50 KB
- 文档页数:21
毕业设计(论文)题目:认知无线电中频谱感知技术研究专业:学生:班级学号:指导教师:指导单位:20分太坑爹了。
老子放个免费的日期:年月日至年月日摘要无线业务的持续增长带来频谱需求的不断增加,无线通信的发展面临着前所未有的挑战。
无线电频谱资源一般是由政府统一授权分配使用,这种固定分配频谱的管理方式常常会出现频谱资源分配不均,甚至浪费的情形,这与日益严重的频谱短缺问题相互矛盾。
认知无线电技术作为一种智能频谱共享技术有效的缓解了这一矛盾。
它通过感知时域、频域和空域等频谱环境,自动搜寻已授权频段的空闲频谱并合理利用,达到提高现有频谱利用率的目的。
频谱感知技术是决定认知无线电能否实现的关键技术之一。
本文首先介绍了认知无线电的基本概念,对认知无线电在 WRAN 系统、UWB 系统与 WLAN 系统等领域的应用分别进行了讨论。
在此基础上,针对实现认知无线电的关键技术从理论上进行了探索,分析了影响认知网络正常工作的相关因素与认知网络对授权用户正常工作所形成的干扰。
从理论上推导了在实现认知无线电系统所必须面对的弱信号低噪声比恶劣环境下,信号检测的相关方法和技术,并进行了数字滤波器的算法分析,指出了窗函数的选择原则。
接着详细讨论了频谱检测技术中基于发射机检测的三种方法:匹配滤波器检测法、能量检测法和循环平稳特性检测法。
为了检验其正确性,借助 Matlab 工具,在Matlab 平台下对能量检测和循环特性检测法进行了建模仿真,比较分析了这两种方法的检测性能。
研究结果表明:在低信噪比的情况下,能量检测法检测正确率较低,检测性能远不如循环特征检测。
其次还详细的分析认知无线电的国外研究现状与关键技术。
详细阐述了频谱感知技术的研究现状和概念,并指出了目前频谱感知研究工作中受到关注的一些主要问题,围绕这些问题进行了深入研究。
关键词:感知无线电;频谱感知;匹配滤波器感知;能量感知;合作式感知;ABSTRACTThe development of the wireless business results in increasing needs of the frequency. Wireless communication is facing a challenge. Radio resource is distributed by the government, which generally rises inequality and waste of Radio resource. So,there is a contradiction between the waste and the shortage of Radio resource. The cognitive radio, a technology of intelligent spectrum sharing, effectively bridges the contradiction. Based on the perception of time domain, frequency domain and airspace,automatic discovery and reasonably use of free spectrum among distributed spectrum,the cognitive radio improves the utilization ratio in the existing frequency. Spectrum sensing is one of the sky technologies in the cognitive radio.Based on the introduction of Cognitive Radio(CR) and the discussion of applications of CR in WRAN, UWB and WLAN, the key technologies of achieving CR were researched in theory and the factors controlling cognitive network and the interferences raised by cognitive network in normal working of authorized user were analyzed. The related method and technology of signal detection was theoretically derived in the severe environment of weak signal and low signal to noise ratio that is must facing to achieve CR. With the algorithm analysis of digital filter, the selection principle of windows function was proposed. Three spectrum detection methods namely matching filter detection way, energy detection way and cycle property detection way, were investigation in great detail. For testing and verifying the correction of above results, the detailed modeling and simulation of energy detection and cycle property detection were completed with Matlab and the performances of that two detections were also compared. The results show that the energy detection way , in the low SNR , is low and the property of that is very poorer than the cycle property detection. And this paper suggested that improvement of algorithm of window function can promote the performance of cycle detection algorithm.Secondly, detailed analysis of the cognitive radio is also and the key technology research status.Elaborated on spectrum the sensing techniques and concepts Research,then points out the research work in the spectrum sensing some of the main issues of concern,around theseissues in depth study also.Key Words:Cognitive Radio;Spectrum Sensing;Matched filter Sensing;Energy Sensing;Cooperative Sensing;目录第一章绪论11.1认知无线电的研究背景与意义11.2认知无线电技术的国外发展现状11.2.1国际上和我国认知无线电技术的研究情况11.3全文的主要结构和研究容6第二章认知无线电技术82.1频谱感知技术82.2频谱分配技术92.3功率控制技术102.4认知无线电技术的应用112.4.1认知无线电在WRAN中的应用112.4.2认知无线电在UWB系统中的应用112.4.3认知无线电在WLAN中的应用122.5本章小结12第三章认知无线电频谱感知技术133.1频谱感知技术系统模型163.2单节点频谱感知技术173.2.1匹配滤波器感知173.2.2能量感知193.2.3循环平稳感知223.2.4单节点频谱感知的局限性253.3合作式频谱感知技术273.3.1合作式频谱感知的概念273.4合作式频谱感知的关键技术293.4.1“与”准则293.4.2“或”准则303.4.3“K秩”法313.5基于干扰温度的感知技术323.6本章小结34第四章实验仿真364.1实验仿真环境364.2能量检测仿真与结果364.3匹配滤波器检测仿真与结果374.4合作式检测仿真与结果384.5本章小结40第五章结束语425.1论文总结425.2未来研究展望43 致错误!未定义书签。
无线通信原理-基于matlab的ofdm系统设计与仿真基于matlab的ofdm系统设计与仿真摘要OFDM即正交频分复用技术,实际上是多载波调制中的一种。
其主要思想是将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到相互正交且重叠的多个子载波上同时传输。
该技术的应用大幅度提高无线通信系统的信道容量和传输速率,并能有效地抵抗多径衰落、抑制干扰和窄带噪声,如此良好的性能从而引起了通信界的广泛关注。
本文设计了一个基于IFFT/FFT算法与802.11a标准的OFDM系统,并在计算机上进行了仿真和结果分析。
重点在OFDM系统设计与仿真,在这部分详细介绍了系统各个环节所使用的技术对系统性能的影响。
在仿真过程中对OFDM信号使用QPSK 调制,并在AWGN信道下传输,最后解调后得出误码率。
整个过程都是在MATLAB环境下仿真实现,对ODFM系统的仿真结果及性能进行分析,通过仿真得到信噪比与误码率之间的关系,为该系统的具体实现提供了大量有用数据。
- 1 -第一章 ODMF系统基本原理1.1多载波传输系统多载波传输通过把数据流分解为若干个子比特流,这样每个子数据流将具有较低的比特速率。
用这样的低比特率形成的低速率多状态符号去调制相应的子载波,构成了多个低速率符号并行发送的传输系统。
在单载波系统中,一次衰落或者干扰就会导致整个链路失效,但是在多载波系统中,某一时刻只会有少部分的子信道会受到衰落或者干扰的影响。
图1,1中给出了多载波系统的基本结构示意图。
图1-1多载波系统的基本结构多载波传输技术有许多种提法,比如正交频分复用(OFDM)、离散多音调制(DMT)和多载波调制(MCM),这3种方法在一般情况下可视为一样,但是在OFDM中,各子载波必须保持相互正交,而在MCM则不一定。
1.2正交频分复用OFDM就是在FDM的原理的基础上,子载波集采用两两正交的正弦或余弦函sinm,tcosn,t数集。
1. 介绍QPSK信号QPSK (Quadrature Phase Shift Keying) 是一种数字调制技术,常用于无线通信和数字通信系统中。
它是通过改变相位来传输数字信息的一种调制方式,相较于单相位调制方式,QPSK可以提高信号传输效率和频谱利用率。
2. QPSK信号的生成原理QPSK信号的产生可以通过正交调制的方式完成,即将数据流分为两个独立的流并分别与正弦和余弦信号相乘,经过合并后即可生成QPSK信号。
具体过程如下:(1) 将二进制数据流分为实部和虚部,分别代表I信号和Q信号;(2) 分别对I信号和Q信号进行调制,得到两路调制信号;(3) 将两路调制信号通过信号合并器得到QPSK信号。
3. QPSK信号的Matlab仿真代码在Matlab中,可以通过编程实现QPSK信号的生成和仿真。
以下是一个简单的QPSK信号Matlab仿真代码示例:```Matlab设置QPSK调制参数M = 4; 调制阶数msg = randi([0 M-1],10000,1); 随机生成10000个0到M-1的整数,模拟二进制信息流txSig = qammod(msg,M); QAM调制绘制星座图scatterplot(txSig) 绘制QPSK星座图添加高斯噪声rxSig = awgn(txSig, 10); 添加信道噪声,信噪比为10dB解调rxMsg = qamdemod(rxSig,M); QPSK解调[numErrors,ber] = biterr(msg,rxMsg); 计算比特错误率disp(['比特错误率为:',num2str(ber)])```4. QPSK信号仿真结果分析通过上述Matlab代码,我们可以得到QPSK信号的仿真结果。
通过绘制星座图可以直观地观察到QPSK信号在复平面上的分布情况。
随后,我们可以添加高斯噪声,模拟信道中的干扰,然后进行解调并计算比特错误率。
5. 结论通过以上QPSK信号的Matlab仿真代码,我们可以成功生成和仿真QPSK信号,并得到比特错误率等性能指标。
利用matlab移频信号调制代码的方法摘要:一、引言二、Matlab移频信号调制的基本原理1.移频信号的定义2.移频信号调制的目的3.Matlab实现移频信号调制的方法三、Matlab移频信号调制的代码实现1.信号发生器2.调制器3.解调器4.性能分析四、实例分析1.实例一:频率偏移调制2.实例二:相位调制3.实例三:频移键控(FSK)五、总结与展望正文:一、引言移频信号调制是一种在无线通信中广泛应用的调制技术。
它通过改变信号的频率来传输信息,具有抗干扰性强、传输速率高等优点。
Matlab作为一种数学计算软件,可以方便地模拟移频信号调制的整个过程。
本文将详细介绍如何利用Matlab实现移频信号调制,并给出实例分析。
二、Matlab移频信号调制的基本原理1.移频信号的定义移频信号是指信号的频率随着时间变化而变化的信号。
它的基本表达式为:f(t) = f0 + f1 * cos(ωt + θ)其中,f0为载波频率,f1为频率偏移量,ω为角频率,θ为相位差。
2.移频信号调制的目的移频信号调制的目的是在保持载波功率不变的情况下,通过改变载波频率来传输信息。
这样可以提高信号的抗干扰能力,提高通信质量。
3.Matlab实现移频信号调制的方法在Matlab中,可以利用信号生成函数、调制函数和性能分析函数实现移频信号调制。
三、Matlab移频信号调制的代码实现1.信号发生器使用Matlab的`awgn`函数生成高斯白噪声,`randn`函数生成随机数。
2.调制器利用Matlab的`cos`、`sin`函数实现移频信号的调制。
例如,对于频率偏移调制,可以编写如下代码:```Matlab% 参数设置Fs = 1000; % 采样频率Ts = 1/Fs; % 采样间隔= 1000; % 数据长度% 信号生成t = (0:N-1)"/Ts;f1 = 10; % 频率偏移量f0 = 100; % 载波频率θ= 0; % 相位差% 调制modulated_signal = sin(2 * pi * (f0 + f1 * cos(t)) * t);```3.解调器利用Matlab的信号处理函数解调信号,例如`fft`、`ifft`等。
基于MATLAB下的频率选择性信道仿真简介本文档旨在介绍使用MATLAB进行频率选择性信道仿真的基本方法和步骤。
背景频率选择性信道是无线通信中常见的信道类型之一,其特点是在不同的频率上具有不同的衰减和相位响应。
为了更好地理解和分析这种信道的性能,我们需要进行仿真模拟。
仿真步骤以下是在MATLAB中进行频率选择性信道仿真的基本步骤:1. 信道建模:首先,我们需要使用合适的数学模型来描述频率选择性信道。
常用的模型包括扁平衰落模型、Jakes模型、Rician衰落模型等。
根据具体的应用场景和需求,选择合适的模型进行建模。
信道建模:首先,我们需要使用合适的数学模型来描述频率选择性信道。
常用的模型包括扁平衰落模型、Jakes模型、Rician衰落模型等。
根据具体的应用场景和需求,选择合适的模型进行建模。
2. 频谱分析:通过频谱分析可以获得信号在不同频率上的衰减和相位响应。
MATLAB提供了丰富的信号处理工具箱,可以方便地对信号进行频谱分析。
频谱分析:通过频谱分析可以获得信号在不同频率上的衰减和相位响应。
MATLAB提供了丰富的信号处理工具箱,可以方便地对信号进行频谱分析。
3. 信道仿真:在信道建模和频谱分析的基础上,我们可以开始进行信道仿真。
根据所选用的信道模型和信号特性,使用MATLAB编写仿真代码,生成仿真结果。
可以考虑包括信号衰落、传输误码率等性能指标。
信道仿真:在信道建模和频谱分析的基础上,我们可以开始进行信道仿真。
根据所选用的信道模型和信号特性,使用MATLAB编写仿真代码,生成仿真结果。
可以考虑包括信号衰落、传输误码率等性能指标。
4. 结果分析:对于信道仿真的结果,我们需要进行详细的分析和评估。
根据仿真结果,可以评估系统在频率选择性信道下的性能表现,并针对性地进行优化。
结果分析:对于信道仿真的结果,我们需要进行详细的分析和评估。
根据仿真结果,可以评估系统在频率选择性信道下的性能表现,并针对性地进行优化。
频率编码matlab频率编码是一种数字信号处理技术,通常用于将模拟信号转换为数字信号。
在Matlab中,我们可以使用信号处理工具箱中的函数来实现频率编码。
首先,我们需要将模拟信号进行采样,将其转换为离散时间信号。
可以使用Matlab中的`resample`函数对信号进行重采样,或者使用`downsample`函数进行降采样。
重采样的目的是将连续时间信号转换为离散时间信号,以便后续处理。
接下来,我们可以使用傅里叶变换将离散时间信号转换为频域信号。
Matlab中的`fft`函数可以用来计算离散傅里叶变换(DFT),将信号从时域转换到频域。
在频域中,我们可以选择一定的频率范围作为编码的频率带宽。
可以使用`fftshift`函数将频谱进行平移,使得零频率位于频谱的中心。
然后,根据选定的频率带宽,可以将频谱中的能量分布进行编码。
一种常见的频率编码方法是脉冲位置调制(PPM)。
在PPM中,信号的能量分布被编码为脉冲的位置。
可以使用Matlab中的逻辑运算和索引操作来实现PPM编码。
首先,我们可以根据选定的频率带宽确定频率分辨率,然后将频率分辨率映射到时间分辨率。
根据时间分辨率,可以确定每个脉冲的位置,并将其编码为相应的脉冲序列。
另一种常见的频率编码方法是频率调制(FM)。
在FM中,信号的能量分布被编码为频率的变化。
可以使用Matlab中的数学函数和数组操作来实现FM编码。
根据选定的频率带宽和调制参数,可以计算出每个离散时间点上的频率,然后将其编码为相应的频率序列。
除了PPM和FM,还有其他一些频率编码方法,如频率偏移编码(FSK)、相位调制编码(PSK)等。
这些方法的实现方式略有不同,但基本思想相似。
总结起来,在Matlab中实现频率编码的步骤包括,信号采样、傅里叶变换、频率带宽选择、能量分布编码。
具体的实现方式取决于所选用的编码方法和信号特性。
以上只是一个简单的概述,具体的实现细节需要根据实际情况进行调整和优化。
matlab无线通信仿真代码
本文分享了一份基于MATLAB平台的无线通信仿真代码。
该代码包含了常用的调制解调算法、信道模型、编码解码等模块,通过调用这些模块可以实现多种无线通信系统的仿真。
具体来说,该代码可以用于仿真以下几种无线通信系统:
1. 传统的模拟调制系统,包括AM、FM、PM等模式的调制解调。
2. 数字调制系统,包括PSK、QAM、FSK等模式的调制解调。
3. 多径衰落信道模型,包括AWGN信道、瑞利衰落信道、莱斯衰落信道等。
4. 信道编码解码,包括卷积码、Turbo码、LDPC码等。
除此之外,该代码还包含了多个演示程序,可以直观地展示无线通信系统的仿真结果。
这些演示程序涉及到信道容量、误码率、信噪比等指标,可以帮助用户深入理解无线通信系统的性能。
总之,该MATLAB无线通信仿真代码简单易用,功能齐全,可用于学术研究、教学实验、工程应用等多个领域。
- 1 -。
无线通信实验报告院系名称:信息科学与工程学院专业班级:电信班学生姓名:学号:授课教师:2014 年11 月 6 日实验一 高斯衰落信道建模一、基本原理QPSK 信号可以看成是对两个正交的载波进行多电平双边带调制后所得信号的叠加,因此可以用正交调制的方法得到QPSK 信号。
QPSK 信号的星座如图4.1.1所示:图1.1 QPSK 信号星座图从AWGN 信道中,在一个信号区间内接收到的带宽信号可以表示为()()()()()cos(2)()sin(2)m m c c s c r t u t n t u t n t f t n t f t ππ=+=+-这里()c n t 和()s n t 是加性噪声的两个正交分量。
可以将这个接收信号与1()()cos(2)T c t g t f t ψπ=,2()sin(2)T c g t f t ψπ=-给出的1()t ψ和2()t ψ作相关,两个相关器的输出产生受噪声污损的信号分量,它们可表示为22()m s s s m m r s n n n M Mππξξ=+=++ 式中c n 和s n 定义为 1()()2c T c n g t n t dt ∞-∞=⎰ 1()()2s T s n g t n t dt ∞-∞=⎰ 这两个正交噪声分量()c n t 和()s n t 是零均值,互不相关的高斯随机过程。
这样,()()0c s E n E n ==和()0c s E n n =。
c n 和s n 的方差是 220()()2c s N E n E n == 最佳检测器将接收信号向量r 投射到M 个可能的传输信号向量{m s }之一上去,并选取对应于最大投影的向量。
据此,得到相关准则为(,)m m C r s r s =•,m=0,1,…,M-1由于全部信号都具有相等的能量,因此,对数字相位调制一种等效的检测器标准是计算接收信号向量r=(c r ,s r )的相位为 arctan s r cr r θ= 并从信号集{m s }中选取其相位最接近r θ的信号。
流程示意图(a)发射端框图CSI流程示意图 (1)1 主程序ofdm_wav_trans_system.m (2)2 D/A转换模块:Get_wav_data.m (9)3 长短帧设定:construct_flag.m (10)4 子载波参数设定:bitload.m (11)5 数据读取Fetch_data_old.m (11)6 数据读取:Fetch_data.m (12)7 加扰模块Scramble_data_old.m (13)8 加扰模块Scramble_data (14)9 卷积码encd216.m (14)10 交织模块1 index_change.m (16)11 交织模块2 index_change2.m (18)12 交织模块3 Data_interleave.m (20)13 导频模块:add_prefix.m (21)14 QAM模块:modulate.m (22)15 成型滤波器模块:shape_filtering.m (24)16 信道模拟模块:channel.m (25)17 匹配滤波器:match_filtering.m (26)18 欠抽样恢复模块:sample_decision.m (28)19 同步模块:fresym_combine_est.m (30)20 解帧模块:decompose_frame.m (32)21 频偏估计:get_sample_clock_offset.m (33)22 频偏补偿:recov_sample_clock.m (34)23 QAM解映射:demodulate.m (35)24 解交织模块1:index_normal2.m (37)25 解交织模块2:index_normal.m (38)26 解交织模块3:Data_Deinterleave.m (39)27 V iterbi译码模块:decd216.m (40)1 主程序ofdm_wav_trans_system.m功能:描述数据在数字域的变化,将音频文件转为数字,组帧,加扰,解扰clear all;tic;%帧参数global GUARD_num; GUARD_num=16; %循环前缀所占global FFT_num; FFT_num=64; %每符号子载波数global OFDM_symbols_per_frame; OFDM_symbols_per_frame =25; %每帧数据符号数global OFDM_prefix_per_frame; OFDM_prefix_per_frame=5; %每帧前导符号数global OFDM_wavbits_per_frame1;OFDM_wavbits_per_frame=1408; %每帧比特数global OFDM_wavbits_per_frame2; OFDM_wavbits_per_frame2=1440;global OFDM_scrambits_per_frame;OFDM_scrambits_per_frame=1440; %每帧扰码后比特数global Total_bits_per_symbol; Total_bits_per_symbol=144; %每个符号的比特数36×4scram_polynomial=[1 0 0 0 1 0 0 1]; %扰码多项式SNR=10; %单位:DBrolloff_factor=0.25;up_sampling_factor=4;%帧结构% 长训练符号LTS = [0 0 0 0 0 0 1 1 -1 -1 1 1 -1 1 -1 1 ...1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 ...0 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 ...1 -1 -1 1 -1 1 -1 1 1 1 1 0 0 0 0 0];% 短训练符号STS = sqrt(13/6)* ...[0 0 0 0 0 0 0 0 1+j 0 0 0 -1-j 0 0 0 ...1+j 0 0 0 -1-j 0 0 0 -1-j 0 0 0 1+j 0 0 0 ...0 0 0 0 -1-j 0 0 0 -1-j 0 0 0 1+j 0 0 0 ...1+j 0 0 0 1+j 0 0 0 1+j 0 0 0 0 0 0 0]; ...global SIGNAL1;% 信令符号SIGNAL1 = zeros(1,144);global SIGNAL2;SIGNAL2 = ones(1,144);% 导频PILOT=[-1 1 1 1];Pattern_Datas_Symbols_Index = [8:15 17:26 40:49 51:58];Pattern_Pilot_Symbols_Index = [16 27 39 50];% 功率放大器参数HPA_para_AmAm_alpha = 2.1587;HPA_para_AmAm_beta = 1.1517;HPA_para_AmPm_alpha = 4.0033;HPA_para_AmPm_beta = 9.1040;HPA_para_InputScaling = 1; % Not dbHPA_para_OutputScaling = 1;% Not dbHPA_para=[HPA_para_AmAm_alpha,HPA_para_AmAm_beta;HPA_para_AmPm_alpha,HPA_para_AmPm_beta; HPA_para_InputScaling,HPA_para_OutputScaling];chan_multipath_imp_res_upsampling=[1 0.89 0.81 0.74 0.68 0.62 0.57 0.52 0.48 0.46 0.44 0.43 0.42 ...0.41 0.405 0.402 0.40 0.392 0.387 0.383 0.38 0.36 0.34 0.33 0.32 ...0.27 0.23 0.19 0.17 0.12 0.09 0.06]; %多径效应trans_carrier_num=length(Pattern_Datas_Symbols_Index); %数字载波的子载波数energy_per_carrier=1; %符号能量load ENC2.matload ENC4.mat %qpsk对照表load ENC16.mat %16QAM对照表load ENC64.mat %64QAM对照表load ENC256.mat %256QAM对照表% I/Q ImbalenceIQ_Imb_am = 0.025;IQ_Imb_ph = 1*pi*2/360;[Wav_data,sample_rate,per_sample_bits] =Get_wav_data('tada.wav'); %将声音文件转化为数据trans_frame_wav_data=[];data_index=1;%flag_in=[0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1];flag_in=[0 0 0 0 1];flag=flag_in;%flag=construct_flag(flag_in); % 产生flag序列% trans_iter_num=ceil(length(Trans_wav_data)/OFDM_wavbits_per_frame); %所需传输帧数rec_wav_data=[];[trans_bits_alloctrans_energy_alloc]=bitload(Pattern_Datas_Symbols_Index,Total_bits_per_symbol,tran s_carrier_num,energy_per_carrier);%chan_multipath_fre=fft(chan_multipath_imp_res,FFT_num);%频域信道响应for Trans_frame_index =1:1:length(flag)flag_value=flag(Trans_frame_index);[Frame_wav_data,get_signal_data,new_begin_index] =Fetch_data(Wav_data,data_index,flag_value); % 基于缓冲池的状态决定帧长% 并根据flag决定信令data_index=new_begin_index;trans_frame_wav_data=[trans_frame_wav_data Frame_wav_data];T_data=[get_signal_data Frame_wav_data];T_data=Scramble_data(T_data);% 加扰,信令144比特+1440比特数据Scram_signal_data=T_data(1:144);% 前面144比特为加扰后的信令Scram_Frame_wav_data=T_data(145:1584);% 后面是1440比特加扰后的数据coded_Frame_wav_data=encd216(Scram_Frame_wav_data);Frame_scram_data=[Scram_signal_data coded_Frame_wav_data]; %两次交织总效果%temp_data=index_change( Frame_scram_data);% 第一次交织%trans_wav_data=index_change2(temp_data);% 第二次交织% Construct OFDM frameOFDM_trans_frame=zeros(25,80);OFDM_trans_frame=add_prefix(OFDM_trans_frame,STS,LTS); %生成帧头% 包括信令在内的21个符号,每个符号144比特,经过16QAM调制到相应的信道,并插入导频,这里信令也插入了导频data_begin_index=1;for k=1:OFDM_symbols_per_frame-OFDM_prefix_per_frame+1trans_bits_per_symbol=trans_wav_data(data_begin_index:data_begin_index+Total_bits_per_symbol-1);trans_16QAM_per_symbol = zeros(1,FFT_num);trans_16QAM_per_symbol=modulate(trans_bits_per_symbol,trans_bits_alloc,trans_energy_alloc,s2,s4,s16,s64,s256);trans_16QAM_per_symbol(Pattern_Pilot_Symbols_Index)=PILOT;%加入导频符号trans_tmdata_per_symbol=ifft(trans_16QAM_per_symbol,FFT_num);%进行ifft变换,相当于系统模块中OFDM调制OFDM_trans_frame(k+4,:)=[trans_tmdata_per_symbol(49:64)trans_tmdata_per_symbol]; % 数据帧加循环前缀data_begin_index=data_begin_index+Total_bits_per_symbol;endOFDM_trans_frame=transpose(OFDM_trans_frame); %矩阵转置,变成时间域表示形式% 以下步骤形成一个数据帧tx_frame_signal =reshape(OFDM_trans_frame,1,OFDM_symbols_per_frame*(GUARD_num+FFT_num));% 形成一个2000个采样点的数据帧,参考批注4。
基于matlab ofdm通信系统仿真代码
基于MATLAB OFDM通信系统仿真代码是一种应用在无线通信领域的高
效的通信技术。
OFDM(正交分频多载波)技术是一种高效的技术,它
能够在有限的信道容量内传输大量的数据,同时也能抵御多径衰减和
多路径效应。
此外,OFDM还可以抵抗非线性干扰和伪噪声,从而提高
系统的可靠性和稳定性。
MATLAB OFDM通信系统仿真代码可以帮助我们快速验证一个OFDM系统的性能,从而帮助我们更好地理解OFDM技术
背后的原理和技术。
MATLAB OFDM通信系统仿真代码由信道模拟、OFDM调制和解调制的子
模块组成,其中每个子模块都可以通过MATLAB编程实现。
首先,我们
需要定义一个简单的信道函数,以模拟实际信道的衰减和多路径效应,然后将信号传输给OFDM调制模块,它将信号转换成OFDM调制的多载
波信号。
接着,多载波信号被发射到信道中,经过信道后,经过OFDM
解调制模块处理,得到恢复后的信号,再经过信道衰减模拟得到最终
信号,完成仿真。
通过使用MATLAB OFDM通信系统仿真代码,我们可以更有效地对OFDM
技术进行仿真评估,同时也可以获得更为准确、直观的仿真结果。
此外,MATLAB OFDM通信系统仿真代码还可以帮助我们了解OFDM技术的
具体实施方法,为实际开发工作提供有效的技术支持。
clearclc%rand('twister',1);blockpu=[];blocksu=[];for N=3:2:7block=[];for lambdap =0.01:0.05:0.5%*****************************************%假设 1. CR网络和主网络(授权网络)共同存在于同一区域,并且使用同一频段。
假设该频段共有N个信道,每个主用户或CR用户每次接入只占用一个信道。
% 若所有信道均被主用户占用,此时CR用户到达就被阻塞。
若CR用户正在使用的信道有主用户出现,此时CR用户被迫中断,并进入缓存区排队等待% 空闲可用信道以继续刚被中断的通信,若等待超过一定时限,则判定CR用户强制中断退离缓存区。
% 故共有三个队列,分别表示如下:% X队列——主用户队列,抢占优先,优先级最高% Y队列——次用户队列,优先级最低% Z队列——次用户切换队列,优先级次高,若在时延Tao内,则较次用户队列优先接入可用信道% 2. 主用户和次用户的到达服从泊松分布,参数分别为lambdap和lambdas,平均服务时间服从参数为mup和mus的负指数分布% 3. 对次用户而言,主用户抢占优先。
总共有N个信道,也就是最多可以有N个主用户抢占所有信道,% 故Z队列的长度不会超过N,这里给定Z队列长度为N。
% 4. 假设初始状态所有N个信道均空闲,次用户理想感知,感知延时为0.005%*****************************************% 2009年10月12日10月25日%*****************************************%初始化%*****************************************a = 100; %主用户数量b = 100; %次用户数量%N =3 %Z队列最大长度/总的信道数%Tao=5%切换时延门限TaoA = [ ]; %某主用户到达时刻占用信道序号的集合B = [ ]; %某次用户到达时刻占用信道序号的集合C = [ ]; %切换用户占用的当前所有信道序号集合D = [ ]; %某次用户到达时刻主用户占用信道集合member = [ ];member_CR = [ ];j1=1;%主用户参数*****************************************%lambdap = 0.3; %主用户到达率mup =0.4; %主用户服务率arr_meanp = 1/lambdap; %主用户平均到达时间ser_meanp = 1/mup;%主用户平均服务时间arr_nump = a; %round(Total_time*lambdap*2);tp = zeros(6,arr_nump);tp(1,:) = exprnd(arr_meanp,1,arr_nump); %按负指数分布产生各主用户到达时间间隔tp(1,:) = cumsum(tp(1,:)); %各主用户的到达时刻等于时间间隔的累积和tp(2,:) = exprnd(ser_meanp,1,arr_nump); %按负指数分布产生各主用户服务时间%次用户参数*****************************************lambdas =0.4;mus =0.6; %次用户到达率与服务率arr_means = 1/lambdas;ser_means = 1/mus; %次用户平均到达时间与平均服务时间arr_nums = b;ts = zeros(6,arr_nums);ts(1,:) = exprnd(arr_means,1,arr_nums); %按负指数分布产生各次用户达到时间间隔ts(1,:) = cumsum(ts(1,:)); %各次用户的到达时刻等于时间间隔的累积和ts(2,:) = exprnd(ser_means,1,arr_nums); %按负指数分布产生各次用户服务时间%切换用户参数*****************************************待计算lambdah和muh arr_numh = 10; %切换用户排队长度设置th = zeros(6,arr_numh);tsh=[];%*****************************************%计算第1个主用户的信息%*****************************************if arr_nump>=1tp(3,1) = 0; %第1个主用户进入系统后直接接受服务,无需等待n = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号tp(4,1) = tp(1,1)+tp(2,1); %其离开时刻等于其到达时刻与服务时间之和tp(5,1) = 1; %其肯定被系统接纳,此时系统内共有1个主用户,故标志位置1tp(6,1) = n; %依次记录主用户占用信道的序号A=[A n];member = [1]; %其进入系统后,系统内已有成员序号为1else!echo No Primary Usersend%*****************************************if arr_nums>=1if arr_nump>=1k1 = sum(ts(1,:) < tp(1,1));if k1~=0for i =1:k1if i==1ts(3,i) = 0.005; %其等待时间为0ts(4,i) = ts(1,i)+ts(2,i)+ts(3,i); %其离开时刻等于到达时刻与服务时间之和ts(5,i) = 1; %其标志位置1 ,即次用户在用当前信道m = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号ts(6,i) = m; %依次记录次用户占用信道的序号B=[B m];member_CR =[1];handoff1=find(tp(1,:)>ts(1,i));handoff2=find(tp(1,:)<ts(4,i));if isempty(handoff1)==0&&isempty(handoff2)==0handoff3=setdiff(handoff1,handoff2);%当前次用户通信期间(时间段)到达的主用户handoff=setdiff(handoff1,handoff3);handoff4=[];for puid=1:length(handoff)if tp(6,handoff(puid))==ts(6,i)handoff4=[handoff4,handoff(puid)];break;endendif isempty(handoff4)==0if j1<=arr_numhth(1,j1)=tp(1,handoff4(1));th(2,j1)=ts(4,i)-tp(1,handoff4(1));ts(4,i)=tp(1,handoff4(1));tsh=ts(:,i);%切换到其他可用信道num_arrivep=find(tp(1,:)<=th(1,j1));num_leavep=find(tp(4,:)>=th(1,j1));num_present1=setdiff(num_arrivep,num_leavep);num_present2=setdiff(num_arrivep,num_present1);%当前在的主用户num_arrives=find(ts(1,:)<th(1,j1));num_leaves=find(ts(4,:)>th(1,j1));num_present3=setdiff(num_arrives,num_leaves);num_present4=setdiff(num_arrives,num_present3);%当前在的次用户num_present6=[];wait=0;if j1>1j2=1:j1-1;num_arriveh=find(th(1,j2)<th(1,j1));num_leaveh=find(th(4,j2)>th(1,j1));num_present5=setdiff(num_arriveh,num_leaveh);num_present6=setdiff(num_arriveh,num_present5);%当前在的切换用户for j3=1:length(num_present6)wait=wait+th(3,num_present6(j3));endth(3,j1)=wait;%切换用户排队等待时间endif length(num_present2)==Nwait1=tp(4,num_present2(1));for k=1:length(num_present2)wait1=min(tp(4,num_present2(k)),wait1);endfor k=1:length(num_present2)if wait1==tp(4,num_present2(k))wait2=num_present2(k);break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=tp(6,wait2);tsh=[tsh,th(:,j1)];elseif isempty(num_present2)&&length(num_present4)==Nwait1=ts(4,num_present4(1));for k=1:length(num_present4)wait1=min(ts(4,num_present4(k)),wait1);endfor k=1:length(num_present4)if wait1==ts(4,num_present4(k))wait3=num_present4(k);break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=ts(6,wait3);tsh=[tsh,th(:,j1)];elseiflength(num_present2)+length(num_present4)==N&&isempty(num_present2)==0&&isempty(nu m_present4)==0wait1=tp(4,num_present2(1));for k=1:length(num_present2)wait1=min(tp(4,num_present2(k)),wait1);endfor k=1:length(num_present4)wait1=min(ts(4,num_present4(k)),wait1);endtps=[tp(:,num_present2),ts(:,num_present4)];for k=1:length(tps)if wait1==tps(4,k)wait4=k;break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=tps(6,wait4);tsh=[tsh,th(:,j1)];elseif length(num_present2)+length(num_present4)<Nchannel1=[tp(6,num_present2),ts(6,num_present4)];channel=setdiff([1:N],channel1);th(3,j1)=0.006+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=channel(1);tsh=[tsh,th(:,j1)];endj1=j1+1;endendendelseif i >= 2j=1:i-1;number_CR = find(ts(4,j) > ts(1,i)); %当前占用信道的次用户个数[th1,th2]=find(th==0);th(:,th2)=[];if isempty(number_CR)&&isempty(th)m = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号ts(3,i) = 0.005;ts(4,i) = ts(1,i)+ts(2,i)+ts(3,i); %其离开时刻等于到达时刻与服务时间之和ts(5,i) = 1; %其标志位置1 ,即次用户在用当前信道ts(6,i) = m; %依次记录次用户占用信道的序号B=[B m];member_CR = [member_CR,i];handoff1=find(tp(1,:)>ts(1,i));handoff2=find(tp(1,:)<ts(4,i));if isempty(handoff1)==0&&isempty(handoff2)==0handoff3=setdiff(handoff1,handoff2);%当前次用户通信期间(时间段)到达的主用户handoff=setdiff(handoff1,handoff3);handoff4=[];for puid=1:length(handoff)if tp(6,handoff(puid))==ts(6,i)handoff4=[handoff4,handoff(puid)];break;endendif isempty(handoff4)==0if j1<=arr_numhth(1,j1)=tp(1,handoff4(1));th(2,j1)=ts(4,i)-tp(1,handoff4(1));ts(4,i)=tp(1,handoff4(1));tsh=[tsh,ts(:,i)];%切换到其他可用信道num_arrivep=find(tp(1,:)<=th(1,j1));num_leavep=find(tp(4,:)>=th(1,j1));num_present1=setdiff(num_arrivep,num_leavep);num_present2=setdiff(num_arrivep,num_present1);%当前在的主用户num_arrives=find(ts(1,:)<th(1,j1));num_leaves=find(ts(4,:)>th(1,j1));num_present3=setdiff(num_arrives,num_leaves);num_present4=setdiff(num_arrives,num_present3);%当前在的次用户num_present6=[];wait=0;if j1>1j2=1:j1-1;num_arriveh=find(th(1,j2)<th(1,j1));num_leaveh=find(th(4,j2)>th(1,j1));num_present5=setdiff(num_arriveh,num_leaveh);num_present6=setdiff(num_arriveh,num_present5);%当前在的切换用户for j3=1:length(num_present6)wait=wait+th(3,num_present6(j3));endth(3,j1)=wait;%切换用户排队等待时间endif length(num_present2)==Nwait1=tp(4,num_present2(1));for k=1:length(num_present2)wait1=min(tp(4,num_present2(k)),wait1);endfor k=1:length(num_present2)if wait1==tp(4,num_present2(k))wait2=num_present2(k);break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=tp(6,wait2);tsh=[tsh,th(:,j1)];elseif isempty(num_present2)&&length(num_present4)==Nwait1=ts(4,num_present4(1));for k=1:length(num_present4)wait1=min(ts(4,num_present4(k)),wait1);endfor k=1:length(num_present4)if wait1==ts(4,num_present4(k))wait3=num_present4(k);break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=ts(6,wait3);tsh=[tsh,th(:,j1)];elseiflength(num_present2)+length(num_present4)==N&&isempty(num_present2)==0&&isempty(nu m_present4)==0wait1=tp(4,num_present2(1));for k=1:length(num_present2)wait1=min(tp(4,num_present2(k)),wait1);endfor k=1:length(num_present4)wait1=min(ts(4,num_present4(k)),wait1);endtps=[tp(:,num_present2),ts(:,num_present4)];for k=1:length(tps)if wait1==tps(4,k)wait4=k;break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=tps(6,wait4);tsh=[tsh,th(:,j1)];elseif length(num_present2)+length(num_present4)<Nchannel1=[tp(6,num_present2),ts(6,num_present4)];channel=setdiff([1:N],channel1);th(3,j1)=0.006+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=channel(1);tsh=[tsh,th(:,j1)];endj1=j1+1;endendendelseif length(number_CR)+length(th(1,:))>0&&length(number_CR)+length(th(1,:))<N m = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号while any(m == ts(6,number_CR))&&any(m == th(6,:))m = ceil(rand*N);endts(3,i) = 0.005;ts(4,i) = ts(1,i)+ts(2,i)+ts(3,i); %其离开时刻等于到达时刻与服务时间之和ts(5,i) = 1; %其标志位置1 ,即次用户在用当前信道ts(6,i) = m; %依次记录次用户占用信道的序号B=[B m];member_CR = [member_CR,i]; %如果系统有次用户正在接受服务,且系统等待队列未满,则第i个次用户进入系统handoff1=find(tp(1,:)>ts(1,i));handoff2=find(tp(1,:)<ts(4,i));if isempty(handoff1)==0&&isempty(handoff2)==0handoff3=setdiff(handoff1,handoff2);%当前次用户通信期间(时间段)到达的主用户handoff=setdiff(handoff1,handoff3);handoff4=[];for puid=1:length(handoff)if tp(6,handoff(puid))==ts(6,i)handoff4=[handoff4,handoff(puid)];break;endendif isempty(handoff4)==0if j1<=arr_numhth(1,j1)=tp(1,handoff4(1));th(2,j1)=ts(4,i)-tp(1,handoff4(1));ts(4,i)=tp(1,handoff4(1));tsh=[tsh,ts(:,i)];%切换到其他可用信道num_arrivep=find(tp(1,:)<=th(1,j1));num_leavep=find(tp(4,:)>=th(1,j1));num_present1=setdiff(num_arrivep,num_leavep);num_present2=setdiff(num_arrivep,num_present1);%当前在的主用户num_arrives=find(ts(1,:)<th(1,j1));num_leaves=find(ts(4,:)>th(1,j1));num_present3=setdiff(num_arrives,num_leaves);num_present4=setdiff(num_arrives,num_present3);%当前在的次用户num_present6=[];wait=0;if j1>1j2=1:j1-1;num_arriveh=find(th(1,j2)<th(1,j1));num_leaveh=find(th(4,j2)>th(1,j1));num_present5=setdiff(num_arriveh,num_leaveh);num_present6=setdiff(num_arriveh,num_present5);%当前在的切换用户for j3=1:length(num_present6)wait=wait+th(3,num_present6(j3));endth(3,j1)=wait;%切换用户排队等待时间endif length(num_present2)==Nwait1=tp(4,num_present2(1));for k=1:length(num_present2)wait1=min(tp(4,num_present2(k)),wait1);endfor k=1:length(num_present2)if wait1==tp(4,num_present2(k))wait2=num_present2(k);break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=tp(6,wait2);tsh=[tsh,th(:,j1)];elseif isempty(num_present2)&&length(num_present4)==Nwait1=ts(4,num_present4(1));for k=1:length(num_present4)wait1=min(ts(4,num_present4(k)),wait1);endfor k=1:length(num_present4)if wait1==ts(4,num_present4(k))wait3=num_present4(k);break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=ts(6,wait3);tsh=[tsh,th(:,j1)];elseiflength(num_present2)+length(num_present4)==N&&isempty(num_present2)==0&&isempty(nu m_present4)==0wait1=tp(4,num_present2(1));for k=1:length(num_present2)wait1=min(tp(4,num_present2(k)),wait1);endfor k=1:length(num_present4)wait1=min(ts(4,num_present4(k)),wait1);endtps=[tp(:,num_present2),ts(:,num_present4)];for k=1:length(tps)if wait1==tps(4,k)wait4=k;break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=tps(6,wait4);tsh=[tsh,th(:,j1)];elseif length(num_present2)+length(num_present4)<Nchannel1=[tp(6,num_present2),ts(6,num_present4)];channel=setdiff([1:N],channel1);th(3,j1)=0.006+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=channel(1);tsh=[tsh,th(:,j1)];endj1=j1+1;endendelseif number_CR+length(th(1,:)) >= N %如果系统已满,则系统拒绝第i个次用户,其标志位置0 //次用户阻塞ts(5,i) = 0; %其标志位置0 ,即次用户在用当前信道endendendendelse%***********************第一个次用户到达信息ts(3,1) = 0.005; %其等待时间为0ts(4,1) = ts(1,1)+ts(2,1)+ts(3,1); %其离开时刻等于到达时刻与服务时间之和ts(5,1) = 1; %其标志位置1 ,即次用户在用当前信道m = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号ts(6,1) = m; %依次记录次用户占用信道的序号B=[B m];member_CR =[1];%************************第一个之后的次用户到达信息for i = 2:arr_numsnumber = find(ts(4,:) > ts(1,i)); %当前占用信道的主用户个数if isempty(number) %如果系统为空,则第i个主用户直接接受服务m = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号ts(3,i)=0.005;ts(4,i)=ts(1,i)+ts(2,i)+ts(3,1); %其离开时刻等于到达时刻与服务时间之和ts(5,i) = 1; %其标志位置1ts(6,i) = m; %依次记录主用户占用信道的序号B=[B m];member_CR = [member_CR,i]; %如果系统有主用户正在接受服务,且系统等待队列未满,则第i个主用户进入系统elseif isempty(number)==0&&length(number)<Nm = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号while any(m==ts(6,number))m = ceil(rand*N);endts(3,i)=0.005;ts(4,i)=ts(1,i)+ts(2,i)+ts(3,1); %其离开时刻等于到达时刻与服务时间之和ts(5,i) = 1; %其标志位置1ts(6,i) = m; %依次记录主用户占用信道的序号B=[B m];member_CR = [member_CR,i]; %如果系统有主用户正在接受服务,且系统等待队列未满,则第i个主用户进入系统elseif length(number) >= N %如果系统已满,则系统拒绝第i个主用户,其标志位置0 //主用户阻塞ts(5,i) = 1; %其标志位置1 ,即主用户在用当前信道endendelse!echo No Cognitive Radio Usersend%*****************************************以上是第一个主用户到达时刻之前可能到达的次用户信息OK 10月26日%*****************************************以下是第一个主用户之后到达的主用户信息if arr_nump>=1for i = 2:arr_numpnumber = find(tp(4,:) > tp(1,i)); %当前占用信道的主用户个数if isempty(number)==1 %如果系统为空,则第i个主用户直接接受服务n = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号tp(3,i)=0;tp(4,i)=tp(1,i)+tp(2,i); %其离开时刻等于到达时刻与服务时间之和tp(5,i) = 1; %其标志位置1tp(6,i) = n; %依次记录主用户占用信道的序号A=[A n];member = [member,i]; %如果系统有主用户正在接受服务,且系统等待队列未满,则第i个主用户进入系统elseif isempty(number)==0&&length(number)<Nn = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号while any(n==tp(6,number))n = ceil(rand*N);endtp(3,i)=0;tp(4,i)=tp(1,i)+tp(2,i); %其离开时刻等于到达时刻与服务时间之和tp(5,i) = 1; %其标志位置1tp(6,i) = n; %依次记录主用户占用信道的序号A=[A n];member = [member,i]; %如果系统有主用户正在接受服务,且系统等待队列未满,则第i个主用户进入系统elseif length(number) >= N %如果系统已满,则系统拒绝第i个主用户,其标志位置0 //主用户阻塞tp(5,i) = 0; %其标志位置1 ,即主用户在用当前信道endendendif arr_nump>=1&&arr_nums>=1if tp(4,end)>=ts(1,end)arr_numss=arr_nums;elsexxx=find(ts(1,:)<=tp(1,end));arr_numss=xxx(end);endif k1<arr_numsj = k1+1;for i=2:arr_numpnum_arrive=find(tp(1,:)<ts(1,j));num_leave=find(tp(4,:)>ts(1,j));num_P=[];num_S=[];for num=1:length(num_arrive)if any(num_arrive(num)==num_leave)num_P=[num_P,num_arrive(num)];endendif k1~=0y=1:j-1;num_S=find(ts(4,y) > ts(1,j)); %当前ts(1,p)时刻占用信道的次用户个数end[th1,th2]=find(th==0);th(:,th2)=[];if isempty(num_S)&&isempty(num_P)&&isempty(th)m = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号ts(3,j) = 0.005;ts(4,j) = ts(1,j)+ts(2,j)+ts(3,j); %其离开时刻等于到达时刻与服务时间之和ts(5,j) = 1; %其标志位置1ts(6,j) = m; %依次记录次用户占用信道的序号B=[B m];member_CR = [member_CR,j]; %如果系统有次用户正在接受服务,且系统等待队列未满,则第c个次用户进入系统handoff1=find(tp(1,:)>ts(1,j));handoff2=find(tp(1,:)<ts(4,j));if isempty(handoff1)==0&&isempty(handoff2)==0handoff3=setdiff(handoff1,handoff2);%当前次用户通信期间(时间段)到达的主用户handoff=setdiff(handoff1,handoff3);handoff4=[];for puid=1:length(handoff)if tp(6,handoff(puid))==ts(6,j)handoff4=[handoff4,handoff(puid)];break;endendif isempty(handoff4)==0if j1<=arr_numhth(1,j1)=tp(1,handoff4(1));th(2,j1)=ts(4,j)-tp(1,handoff4(1));ts(4,j)=tp(1,handoff4(1));tsh=[tsh,ts(:,i)];%切换到其他可用信道num_arrivep=find(tp(1,:)<=th(1,j1));num_leavep=find(tp(4,:)>=th(1,j1));num_present1=setdiff(num_arrivep,num_leavep);num_present2=setdiff(num_arrivep,num_present1);%当前在的主用户num_arrives=find(ts(1,:)<th(1,j1));num_leaves=find(ts(4,:)>th(1,j1));num_present3=setdiff(num_arrives,num_leaves);num_present4=setdiff(num_arrives,num_present3);%当前在的次用户num_present6=[];wait=0;if j1>1j2=1:j1-1;num_arriveh=find(th(1,j2)<th(1,j1));num_leaveh=find(th(4,j2)>th(1,j1));num_present5=setdiff(num_arriveh,num_leaveh);num_present6=setdiff(num_arriveh,num_present5);%当前在的切换用户for j3=1:length(num_present6)wait=wait+th(3,num_present6(j3));endth(3,j1)=wait;%切换用户排队等待时间endif length(num_present2)==Nwait1=tp(4,num_present2(1));for k=1:length(num_present2)wait1=min(tp(4,num_present2(k)),wait1);endfor k=1:length(num_present2)if wait1==tp(4,num_present2(k))wait2=num_present2(k);break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=tp(6,wait2);tsh=[tsh,th(:,j1)];elseif isempty(num_present2)&&length(num_present4)==Nwait1=ts(4,num_present4(1));for k=1:length(num_present4)wait1=min(ts(4,num_present4(k)),wait1);endfor k=1:length(num_present4)if wait1==ts(4,num_present4(k))wait3=num_present4(k);break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=ts(6,wait3);tsh=[tsh,th(:,j1)];elseiflength(num_present2)+length(num_present4)==N&&isempty(num_present2)==0&&isempty(nu m_present4)==0wait1=tp(4,num_present2(1));for k=1:length(num_present2)wait1=min(tp(4,num_present2(k)),wait1);endfor k=1:length(num_present4)wait1=min(ts(4,num_present4(k)),wait1);endtps=[tp(:,num_present2),ts(:,num_present4)];for k=1:length(tps)if wait1==tps(4,k)wait4=k;break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=tps(6,wait4);tsh=[tsh,th(:,j1)];elseif length(num_present2)+length(num_present4)<Nchannel1=[tp(6,num_present2),ts(6,num_present4)];channel=setdiff([1:N],channel1);th(3,j1)=0.006+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=channel(1);tsh=[tsh,th(:,j1)];endj1=j1+1;endendendelseiflength(num_S)+length(num_P)+length(th(1,:))>0&&length(num_S)+length(num_P)+length(th(1,: ))< Nm = ceil(rand*N);while any(m == tp(6,num_P))&&any(m == ts(6,num_S))&&any(m == th(6,:)) m = ceil(rand*N);endts(3,j) = 0.005;ts(4,j) = ts(1,j)+ts(2,j)+ts(3,j); %其离开时刻等于到达时刻与服务时间之和ts(5,j) = 1; %其标志位置1ts(6,j) = m; %依次记录次用户占用信道的序号B=[B m];member_CR = [member_CR,j];handoff1=find(tp(1,:)>ts(1,j));handoff2=find(tp(1,:)<ts(4,j));if isempty(handoff1)==0&&isempty(handoff2)==0handoff3=setdiff(handoff1,handoff2);%当前次用户通信期间(时间段)到达的主用户handoff=setdiff(handoff1,handoff3);handoff4=[];for puid=1:length(handoff)if tp(6,handoff(puid))==ts(6,j)handoff4=[handoff4,handoff(puid)];break;endendif isempty(handoff4)==0if j1<=arr_numhth(1,j1)=tp(1,handoff4(1));th(2,j1)=ts(4,j)-tp(1,handoff4(1));ts(4,j)=tp(1,handoff4(1));tsh=[tsh,ts(:,i)];%切换到其他可用信道num_arrivep=find(tp(1,:)<=th(1,j1));num_leavep=find(tp(4,:)>=th(1,j1));num_present1=setdiff(num_arrivep,num_leavep);num_present2=setdiff(num_arrivep,num_present1);%当前在的主用户num_arrives=find(ts(1,:)<th(1,j1));num_leaves=find(ts(4,:)>th(1,j1));num_present3=setdiff(num_arrives,num_leaves);num_present4=setdiff(num_arrives,num_present3);%当前在的次用户num_present6=[];wait=0;if j1>1j2=1:j1-1;num_arriveh=find(th(1,j2)<th(1,j1));num_leaveh=find(th(4,j2)>th(1,j1));num_present5=setdiff(num_arriveh,num_leaveh);num_present6=setdiff(num_arriveh,num_present5);%当前在的切换用户for j3=1:length(num_present6)wait=wait+th(3,num_present6(j3));endth(3,j1)=wait;%切换用户排队等待时间endif length(num_present2)==Nwait1=tp(4,num_present2(1));for k=1:length(num_present2)wait1=min(tp(4,num_present2(k)),wait1);endfor k=1:length(num_present2)if wait1==tp(4,num_present2(k))wait2=num_present2(k);break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=tp(6,wait2);tsh=[tsh,th(:,j1)];elseif isempty(num_present2)&&length(num_present4)==Nwait1=ts(4,num_present4(1));for k=1:length(num_present4)wait1=min(ts(4,num_present4(k)),wait1);endfor k=1:length(num_present4)if wait1==ts(4,num_present4(k))wait3=num_present4(k);break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=ts(6,wait3);tsh=[tsh,th(:,j1)];elseiflength(num_present2)+length(num_present4)==N&&isempty(num_present2)==0&&isempty(nu m_present4)==0wait1=tp(4,num_present2(1));for k=1:length(num_present2)wait1=min(tp(4,num_present2(k)),wait1);endfor k=1:length(num_present4)wait1=min(ts(4,num_present4(k)),wait1);endtps=[tp(:,num_present2),ts(:,num_present4)];for k=1:length(tps)if wait1==tps(4,k)wait4=k;break;endendth(3,j1)=wait1-th(1,j1)+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=tps(6,wait4);tsh=[tsh,th(:,j1)];elseif length(num_present2)+length(num_present4)<Nchannel1=[tp(6,num_present2),ts(6,num_present4)];channel=setdiff([1:N],channel1);th(3,j1)=0.006+th(3,j1);th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);th(5,j1)=1;th(6,j1)=channel(1);tsh=[tsh,th(:,j1)];endj1=j1+1;endendendelseif (length(num_P)+length(num_S))+length(th(1,:))>=N %如果系统已满,则系统拒绝第i个次用户接入,其标志位置0 //次用户阻塞ts(5,j)=0;endif j<arr_numssj=j+1;endendif arr_numss<arr_numsfor i = arr_numss+1:arr_numsnumber = find(ts(4,:) > ts(1,i)); %当前占用信道的主用户个数if isempty(number) %如果系统为空,则第i个主用户直接接受服务m = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号ts(3,i)=0.005;ts(4,i)=ts(1,i)+ts(2,i)+ts(3,1); %其离开时刻等于到达时刻与服务时间之和ts(5,i) = 1; %其标志位置1ts(6,i) = m; %依次记录主用户占用信道的序号B=[B m];member_CR = [member_CR,i]; %如果系统有主用户正在接受服务,且系统等待队列未满,则第i个主用户进入系统elseif isempty(number)==0&&length(number)<Nm = ceil(rand*N); %产生一个在N范围内的随机数作为接入的信道序号while any(m==ts(6,number))m = ceil(rand*N);endts(3,i)=0.005;ts(4,i)=ts(1,i)+ts(2,i)+ts(3,1); %其离开时刻等于到达时刻与服务时间之和ts(5,i) = 1; %其标志位置1ts(6,i) = m; %依次记录主用户占用信道的序号B=[B m];member_CR = [member_CR,i]; %如果系统有主用户正在接受服务,且系统等待队列未满,则第i个主用户进入系统elseif length(number) >= N %如果系统已满,则系统拒绝第i个主用户,其标志位置0 //主用户阻塞ts(5,i) = 1; %其标志位置1 ,即主用户在用当前信道endendendend%......................................................................%仿真结束时,进入系统的总主用户数和总次用户数len_X = length(member);len_CR = length(member_CR);%*****************************************%输出结果%*****************************************%绘制进入系统的所有主用户和次用户的到达时刻和离开时刻曲线图(plot:绘制二维线性图,stairs:绘制二维阶梯图)subplot(2,1,1);plot([0 tp(1,member)],0:len_X);%绘出各主用户的到达时间图;hold on;plot([0 tp(4,member)],0:len_X,'r');grid on;%绘出各主用户的离去时间图;xlabel('Time/ms');ylabel('Number of PU');legend('PU Arrive curve','PU leave curve')title 'Primary Users Arrive Time and Leave Time';hold off;subplot(2,1,2);%绘出各次用户的到达时间图;plot([0 ts(1,member_CR)],0:len_CR,'r-*');hold on;%绘出各次用户的离去时间图;plot([0 ts(4,member_CR)],0:len_CR,'g-');grid on;xlabel('Time/s');ylabel('Number of CU');legend('CU Arrive curve','CU leave curve ')title 'Cognitive Users Arrive Time and Leave Time';hold off;%*******************************************%*******************************************%绘出次用户的停留时间;figure(2);%figure;%subplot(3,1,3);plot(1: len_CR,ts(2,member_CR)+ts(3,member_CR),'g-');grid on;legend('CU Stay Time');xlabel('Number of CU');ylabel('Time/s');title 'Cognitive Users Stay Time';%grid on; %..........................................................................%*******************************************%计算次用户的阻塞概率和被迫中断概率ockpu,(arr_nump-length(member))/arr_nump];block=[block,(arr_nums-length(member_CR))/arr_nums];thh=setdiff(th(1,:),zeros(1,10));forcehandoff=length(thh(1,:))/length(member_CR);endif isempty(blocksu)blocksu=[blocksu,block];elseblocksu=[blocksu;block]endendfigure(3);lambdap =0.01:0.05:0.5;plot(lambdap,blocksu(1,:),'-+');hold on;plot(lambdap,blocksu(2,:),'r-*');hold on;plot(lambdap,blocksu(3,:),'o-');legend('N=3','N=5','N=7');xlabel('Lamdap');ylabel('SU block probability');title 'SU block probability with lamdap';%SU用户在lamdap下的阻塞概率grid on;hold off;。