1、第十章 MATLAB 仿真 OFDM 系统举例10.1 系统模型10.1.1 自适应调制和 MIMO自适应调制是一种重要的技术,与非自适应的未编码的方案相比增加了数据速率。信道自适应的内在假设是在发送端和接收端的信道特性是可以预知的。在这样的前提下,发送端和接收端可以使用协商好的调制方案。在本章中,我们考虑自适应比特和功率分配方案。也就是,我们预先假设所期望的比特数量是由一个单独的OFDM信号(由N个子载波构成,然后我们按照在整个传输过程中使用能量的最小最为判决方法来将这些比特分配到各个子载波上。除去采用自适应调制,MIMO是针对于SISO(单入单处)系统提高数据速率的有效的技术。比在SISO
2、-OFDM系统中使用自适应调制,本章提出MIMO-OFDM系统中的自适应调制。一个很重要的概念是假设在发送端和接收端分别进行了合适的预编码和波形成型,每个信道矩阵能够被分解成一系列的平行的子信道,在这些子信道中数据是被单独传输的。10.1.2 OFDM 系统的细节描述在本文中研究的OFDM的系统结构如图(10-1)所示。该系统将输入比特按不同的数量分配给每个子载波(在调制模块中),这些数量决定每个子载波的星座点。在每个频率范围的信噪比变换决定分配给每个子载波的比特数量。比特分配的最优化过程将在以下部分具体描述。在OFDM系统中采用的子载波数量N 的选择是在邻近载波频偏和邻信道干扰间取一个折衷。
3、越多的子载波意味着越少的邻信道干扰,但是对频偏更加敏感。图(10-1 )FFT and IFFTOFDM系统的关键组成是发送端的IFFT和接收端的FFT。这个操作是在N个复杂数据和N个复杂的OFDM 信号间进行可逆的线形映射。 对于一个 N点的FFT 只需要N logN个乘法器,胜于 个直接计算。根据这个事实,OFDM系统较均衡器系统使用更少的计算器。使用2FFT在频域传输数据,即进行有效的正交线形变换,在时域可以更有效的对抗ISI。信道模型和信道估计在整个工作中,我们假设信道是瑞利衰落信道,并且随着时间推移呈现时变散射特性。在MIMO 信道下,信道的矩阵方程如下:这里 是矢量, 是矩阵。信道
4、的延迟扩展等于L个符号周期。为了模拟信道的指数衰落分布,我们可以将每一个随机信道矩阵 中所有元素的功率设成一个常数Ei。系数Ei随着变量i 成几何级数衰落。在一个相关时间间隔内,所有的信道矩阵 是一个常量;但是当信道不相关时,根据各自的pdf(功率密度函数)重新生成新的信道矩阵。为了简化运算,我们假设信道在一个OFDM符号传输周期内都是相关的,只在符号传输末端才变得不相关,需要重新生成信道矩阵。在每个子载波上,信道估计转化成对非频率选择性信道的估计。在一般的OFDM系统中,使用导频信号进行信道估计。在时变信道中,导频信号要频繁的被重复。在时域和频域的导频信号间隔依赖于固定的时间和带宽。在本文中
5、,假设信道估计是完善的,并且能被发送机和接收机使用。在知道所有信道特性的前提下,收发信机可以知道信道的频率响应和在每个子载波上的OFDM符号的信道增益。在知道这些增益的前提下,可以应用自适应算法进行比特和功率分配。这个过程会在SECTION详细说明。循环前缀在OFDM信号中加入循环前缀是为了对抗多径效应。相邻的OFDM符号间的干扰可以这样避免,即插入一保护间隔使得在此期间通过多径扩展的传输信号已消逝,而下一个符号还未被传送。一种有效的简化接收机复杂度的方法是在保护时间内引入保护符号。特别是,这种保护符号被作为每个块的扩展前缀。这样做的目的是使信号和信道的线形卷积可以变换成循环卷积,因此使得循环
6、卷积的信号和信道的FFT可以分解成对它们各自进行 FFT。然而,为了是这项技术起作用,必须使保护间隔大于信道的时延扩展。因此,循环前缀的相对长度决定于信道时延扩展和OFDM符号持续时间的比值。调制与解调调制器根据信号星座中的某点将比特流转化成一复杂的数。在本论文中,假设采用自适应算法,调制器的输入是一串比特流和能量值,调制器的输出是根据输入的比特数量和所期望的能量输出的星座符号。调制器只能提供有限数量的可获得的速率,这就意味着可用于调制的星座是有限的。特别是,这些星座是从一组星座符号是2的幂的星座中选出来的。再则,为了能有效的对抗比特错误,格雷编码的星座图被每个可利用的调制所使用。格雷编码确保
7、了如果符号发生错误,此时解调器选择了与发送机原本要解调的信号邻近的符号,则结果只会有单独的比特错误。许多解调技术可以被使用,包括最大似然估计,MMSE和迫零算法。在本文中,为了简化解调,在知道每个子信道是平坦性信道的前提下使用迫零算法来解调。自适应分配OFDM的优势是每个子载波相对窄带的并且是平坦衰落的。然而,某个子信道的低增益导致大的误码率。因此,利用相对好的特性的子信道是很有意义的;这就是自适应调制的动机。在交织的时变信道中,在每个频选信道在时间上是不相关的。因此每次信道不相关在自适应算法中应该被使用。在传输功率一定的情况下达到仙农容量的极限值的最优的自适应传输方案就是在频选信道下采用注水
8、定理来分配功率。然而,当使用注水定理来实现最优方案时,估计比较困难,而且在星座大小的有限尺度内实现也是不太现实的。在本文中使用的自适应技术是在知道子信道增益条件下一种有效的完成功率和速率最优化的有效技术。只使用六种不同的MQAM信号星座;这个方案旨为有效接近的模拟使用非限制的星座。本文采用离散比特分配算法,我们得到一组N 和函数 , 代表了在给定传输编码方案下达到期望的可能的误码率时在每个子信道下传送b比特所需要的能量值。我们假设 。用公式表示的分配问题如下:能量最小化问题为了初始化比特分配,方案2被采用。过程简述如下:算法初始化1.估计子信道信噪比 2.估计根据公式分配给第i路子信道的比特数
9、量3.四舍五入 到b(i)4.限制b(i)取值为0,1,2,4,6或8(与可利用的调制顺序一致)5.计算基于公式的分配给第i路初始化的比特数量下的能量6.形成一张每个子信道能量增量的表。 对于第i路子信道:考虑第k路信道。在知道信道增益和噪声功率谱密度的条件下,能量增加表会提供子信道传输0比特到1比特,1比特变为2比特,2比特变为3比特等等情况下所增加的能量。既然我们要求我们的比特最大传输8比特,那么在从8比特变为9比特时所需的能量增量就很大。而且,我们要求子信道只有0,1,2,4,6或8比特。那么就不支持奇数的比特。为了达到这个目标,能量增加表采用了很灵活的平方技术。以下的例子会很好的描述:
10、假设在第n路子信道从2比特多传输一比特需要能量增加30个单元,从3比特增加一比特需要40个能量单元。那么,再分配能量增值为同一个值,即二者的平均。在本例中,为35个单元。这使我们相信如果单独分配一比特给一子信道使它从2比特增加到3比特,那么在下一次分配时需要相同的额外的最小能量增量来支持另外的比特意味着相同的子信道也会分配另一个比特。同样的平均过程在其他所有的可能比特传输中被重复着。当算法完成时使得子信道所有比特数量平坦的尾比特还未分配时,将会发生唯一的例外情况。 为了解决这种问题,我们采用1中建议的算法(解决尾比特的函数)。这部分会在下一章节讨论。注意到我们引进了一个新的术语,GAP。这个参
11、数是一个有效的协调参数。不同的GAP的值取决于不同的 的值,在给定的所期望的传输比特B下。这是因为GAP直接影响能量表上能量值的计算。.因此,协调值GAP允许我们表征系统BER的特性。在初始化比特分配条件下,以下是比特最优分配的算法1:最后,为了处理单独的违规的比特,我们采用解决尾比特的算法1.检查输入的比特分配至多包含一个比特受限的违规现象。2.如果存在单独的违规,(假设发生在子信道v),从有最大的用来补充子信道v的功率增量的比特分配中找出该比特。3.找出一比特,该比特在其他只被分配0或1个比特的信道中有着最小的功率增量。 我们这样做的原因是其他的子信道都有2,4,6或8个比特,分配一单独比
12、特给他们会破坏比特限制。 4.根据最小的E1和E2进行改变。有这三个算法,我们就有了一个在频选信道条件下完整的比特分配的过程。MIMO/OFDM 系统MIMO系统被定义成在收发信机使用多天线的点到点的通信链路。在收发机都使用多天线技术要比只在发送机或接收机单独使用多天线的分集系统要提供更强的性能。这个技术的意义在于在不增加传输功率和带宽的情况下增加无线系统的数据传输速率。增加速率的成本包括多配置天线所增加的成本,这些额外的天线所需要的空间和复用空间信号处理所增加的复杂度的要求。大量的研究机构已经投入到结合空间技术与OFDM系统的研究领域。这个系统同时具有增加数据速率和消除时延扩展的优点。MIM
13、O/OFDM系统的功率控制在增强频谱和功率效率方面至关重要。希望没有任何干扰,优化传输的最佳功率控制是注水法。但是像先前讨论的那样,实际应用上并不可行,我们必须使用前面提到的自适应分配技术来描绘有单天线的OFDM系统的MIMO/OFDM 系统的实际特性。分析MIMO-OFDM系统考虑一个使用多根发送天线和接收天线的MIMO系统。对于每个子载波,MIMO 信道的频率响应可以表示为一个 的矩阵,其中矩阵的每个元素 表示从发送天线k到接收天线j的信道增益。如果我们知道在发送端和接收端信道特性理想,我们可以将MIMO信道在每个子载波处用奇异值分解(SVD)的办法分解为平行互不相干的SISO信道。让瞬时
14、信道矩阵在第i路的奇异值分解( SVD)为:此处 和 是归一化的复数, 是奇异值矩阵 对角线上的元素, 是对矩阵取逆。现在如果我们使用发送预编码滤波器 和接收机的成形滤波器 ,将在IFFT和FFT 模块之间的MIMO信道等价分解为平行的子信道。可以发现这样的子信道数等于 非零的奇异值的个数。用 表示这个值。同样的将这个操作应用于OFDM的每个子信道。总体来说,每个预编码器和成形矩阵对于每个子信道都是不同的。MIMO-OFDM 的自适应调制根据上文提到的分解过程,自适应调制的MIMO-OFDM系统需要每个子信道都有相应的预编码器和成形矩阵。因此,我们获得M个有效的子信道:换句话说,MIMO-OF
15、DM自适应调制的问题分解成在所有奇异值非零的子载波上的比特分配的问题。因此,要比SISO的问题复杂,但是采用了分解的办法使得我们对最优算法不要进行任何的变动。10.1.3 仿真结果在给定参数下,仿真采用的数据是256个比特每个OFDM符号。比特分配为了显示比特分配,产生了一个作为范例的子信道,并建立最佳的比特分配。图 (10-2)显示了信道的频谱特性,每个信道的频谱分配和功率分配。图(10-2) 对于一个信道的能量比特分配就像期望的那样,当信道特性不好的时候,只分配很少的比特甚至没有分配比特。BER 特性为了比较,我们仿真了固定速率的SISO,即总比特数被平均分配到每个子载波上。在图(10-3
16、 )中显示了自适应SISO ,自适应的MIMO和固定速率的SISO。在所有仿真中,采用了双入双出的MIMO系统。可以看出,MIMO的性能最好,自适应的SISO次之,固定比特速率的SISO最差。对于三个系统,为了保证比较的公平性,每个OFDM符号的总比特数是一样的。图(10-3 )10.2 程序功能说明MIMO OFDM 仿真器: OFDM.m: OFDM 仿真器 (外部功能) create_channel.m:产生频率选择性衰落的瑞利信道,参数由天线结构,OFDM 系统的结构和功率时延结构来决定。 svd_decompose_channel.m:假设所有的信道特性都是知道,那么传输是通过平行奇
17、异值模型。这个函数就是将信道分解成几个这样的模型。 BitLoad.m:应用比特装载(bitloading)算法根据当前的信道特性来达到所期望的比特和能量的分配。 ComputeSNR.m:假设子载波确定,这个简单的函数用来实现各个子信道的 SNR 值(每个单独的值是针对独立的信道) 。 chow_algo.m:应用 Chows 算法来实现特别的比特和能量分配。 EnergyTableInit.m:根据 SNR 的值,针对每个信道产生一个能量增加的表。 campello_algo.m:应用 Campellos 算法根据给定的信道条件汇聚成最佳的比特和能量分配。 ResolvetheLastBi
18、t.m:一种末尾比特优化的比特装载需要一种特殊的最优化。 modulate.m:根据每个信道的比特分配调制随机输入数据流。 ENC2.mat: BPSK 调制器 ENC4.mat: 4-QAM 调制器 (格雷编码) ENC16.mat: 16-QAM 调制器 (格雷编码) ENC64.mat: 64-QAM 调制器 (格雷编码) ENC256.mat: 256-QAM 调制器 (格雷编码) precode.m: 在用信道右矩阵过滤调制矢量时预编码传输矢量。 ifft_cp_tx_blk.m: OFDM 系统的 IFFT 模块。 channel.m: 将信道应用于 OFDM 帧。 fft_cp_
19、rx_blk.m: OFDM 系统的 FFT 模块。 shape.m:用信道左矩阵过滤接收到的矢量 demodulate.m:在知道所使用的传输星座的条件下形成最近的临近搜索。10.3 程序OFDM.m:OFDM 仿真器 (外部功能) function TotEbNo, Errors=OFDM(Mt,Mr);% function TotEbNo, Errors=OFDM(Mt,Mr);%输入:% Mt -发送天线数% Mr - 接收天线数%输出: % TotEbNo 信噪比% Errors - 平均误比特率%load ENC2.matload ENC4.matload ENC16.matloa
20、d ENC64.matload ENC256.matA = 1 1/exp(1) 1/exp(2); % 功率时延谱N = 64; % OFDM 子载波数GI = 16; %保护间隔sig2 = 1e-3; % 噪声M = 8; %最大的星座比特数Mgap = 10.(1:(1.7/10):2.7); % 间隔Btot = 100*Mt; %每个 OFDM 符号总的比特数TransmitIter = 50; % 每个信道传输符号叠代次数ChannelIter = 100; % 随机信道叠代GapIter = length(Mgap);TotEbNo = ;Errors =;EbNo = ;fo
21、r lGap = 1:GapItergap = Mgap(lGap);totalErrors = 0;for lChan = 1:ChannelIter%创建信道H h_f=create_channel(Mt, Mr, A, N+GI);% 在频域中分解每个子信道U S V = svd_decompose_channel(Mt, Mr, h_f, N);% 比特分配bits_alloc,energy_alloc = BitLoad(S,Btot,Mt*N,gap,sig2,M);%能量分配for lTrans = 1:TransmitIter% 传输的比特x = (randn(1,Btot)0
22、);% 调制x_mod = modu(x,bits_alloc,energy_alloc,s2,s4,s16,s64,s256);%调制信号预编码x_pre = precode(Mt, x_mod, V, N);% ifft,含循环前缀ofdm_symbol =;for i=1:Mtofdm_symbol = ofdm_symbol; ifft_cp_tx_blk(x_pre(i:Mt:Mt*(N-1)+i),N,GI);endofdm_symbol2 = reshape(ofdm_symbol,Mt*(N+GI),1);% 信道y = transpose(channel(sig2, Mt,
23、Mr, ofdm_symbol2, H, N+GI);% fftrec_symbol =;for i=1:Mtrec_symbol = rec_symbol; fft_cp_rx_blk(y(i:Mt:Mt*(N+GI-1)+i),N,GI);endrec_symbol2 = reshape(rec_symbol,1,Mt*N);% 接收信号成型shaped_vals = shape(rec_symbol2, Mr, U, N);%解调y_demod = demodulate(shaped_vals, bits_alloc, energy_alloc, S, s2,s4,s16,s64,s25
24、6, c2,c4,c16,c64,c256);% 比较totalErrors = totalErrors + sum(xor(y_demod,x);endEbNo = EbNo sum(energy_alloc)/Btot/sig2;endErrors = Errors totalErrors/Btot/ChannelIter/TransmitIter;TotEbNo = TotEbNo mean(EbNo);EbNo = ;Endcreate_channel.m:产生频率选择性衰落的瑞利信道,参数由天线结构,OFDM 系统的结构和功率时延结构来决定。function H, H_f=creat
25、e_channel(Mt, Mr, A, N);% function H, H_f=create_channel(Mt, Mr, A, N);% A 功率时延谱矢量% Mt 发送天线数% Mr 接收天线数% N在一个 OFDM 符号发送天线端的矢量符号数% 例如在一个 OFDM 符号中有 N 个 MIMO 传输%频率选择性瑞利信道,假设复高斯过程在相位和幅度上是独立的。% 定义信道H_int = 1/sqrt(2)*(randn(Mr*length(A),Mt) + j*randn(Mr*length(A),Mt);H_int2=;for i = 1:length(A)H_int2 = H_i
26、nt2;sqrt(A(i)*H_int(i-1)*Mr+1:i*Mr,:);endH_int2 = H_int2;zeros(N-length(A)*Mr,Mt);H_f = zeros(Mr,Mt*(N-16);for i = 1:Mtfor jj = 1:Mrh_f = fft(H_int2(jj:Mr:(N-16-1)*Mr+jj,i);for k = 1:(N-16)H_f(jj,i+(k-1)*Mt) = h_f(k);endendendH=H_int2;for i = 1:N-1H=H,zeros(Mr*i,Mt);H_int2(1:(N-i)*Mr,:);Endsvd_decom
27、pose_channel.m:假设所有的信道特性都是知道,那么传输是通过平行奇异值模型。这个函数就是将信道分解成几个这样的模型。function U, S, V = svd_decompose_channel(Mt, Mr, h_f, N);% U S V = svd_decompose_channel(Mt, Mr, h_f, N);% 将信道按奇异值分解% Mt 发送天线数% Mr 接收天线数% h_f MIMO 冲击响应- Mr 行, Mt*L 列 ,其中 L 是信道有效时间% N 子载波数U = ;S = ;V = ;for i = 1:NUtmp Stmp Vtmp = svd(h_
28、f(:,(i-1)*Mt+1:i*Mt);U=U Utmp;V=V Vtmp;S=S Stmp;endS = sum(S,1);BitLoad.m:应用比特分配算法根据当前的信道特性来达到所期望的比特和能量的分配。function bits_alloc,energy_alloc = BitLoad(subchan_gains,total_bits,num_subc,gap,noise,M)% 比特分配算法% -%输入 :% subchan_gains : 子载波增益% total_bits : 比特总数 % num_subc :子载波数% gap : 系统间隔% noise : 噪声功率% M
29、 : 最大星座大小%输出:% bits_alloc : 分配给每个子信道的比特数% power_alloc : 分配的总功率% -% 计算每个信道的 SNRSNR = ComputeSNR(subchan_gains,noise,gap);% 这个函数初始化系统,即根据 Chow 算法分配比特数和功率,这个算法要比 Campello算% 法有效bits_alloc, energy_alloc = chow_algo(SNR,num_subc,M);%根据目前信道的增益形成能量增加表,以供 Campello 算法使用energytable = EnergyTableInit(SNR,M);%使用
30、 Campello 算法bits_alloc,energy_alloc = campello_algo(bits_alloc,energy_alloc,energytable,total_bits,num_subc,M);ComputeSNR.m:假设子载波确定,这个简单的函数用来实现各个子信道的 SNR 值(每个单独的值是针对独立的信道) 。function SNR = ComputeSNR(subcar_gains,noise,gap)SNR = abs(subcar_gains.2)./(noise*gap);chow_algo.m:应用 Chows 算法来实现特别的比特和能量分配。fu
31、nction bits_alloc, energy_alloc = chow_algo(SNR,num_subc,M)for i = 1:num_subc% 假设每个子信道都是平坦衰落信道% 初始化每个子信道的比特数tempbits = log2(1 + abs(SNR(i); roundtempbits = round(tempbits); %取整 if (roundtempbits 8) %将比特数限制在 215 之间roundtempbits = 8;endif (mod(roundtempbits,2)= 1 endif roundtempbits 0 %计算每个子信道的功率energ
32、y_alloc(i) = (2roundtempbits-1)/SNR(i) ; elseenergy_alloc(i) = 0;endbits_alloc(i) = roundtempbits; % 更新每个子信道的比特数 endEnergyTableInit.m:根据 SNR 的值,针对每个信道产生一个能量增加的表。function energytable = EnergyTableInit(SNR,M);%输入:% subcar_gains : 子载波增益% M : 最大星座大小% Gap :系统 Gap% Noise : 噪声功率% 输出:% energytable : 能量表 %根据
33、子载波增益,我们计算 1,2,3,6,8 比特给每个子载波传输所需要的能量energytable = abs(1./SNR)*(2.(1:M+1-1);%增加能量,从 M 增加到一个未分配的更高的值energytable(:,M+1) = Inf*ones(size(energytable(:,M+1);for i = 3:2:Menergytable(:,i) = (energytable(:,i) +energytable(:,i+1)/2;energytable(:,i+1) = energytable(:,i);endcampello_algo.m:应用 Campellos 算法根据给
34、定的信道条件汇聚成最佳的比特和能量分配。%根据 campello 算法分配最优的比特数和能量数function bits_alloc, energy_alloc = campello_algo (bits_alloc,energy_alloc,energytable,total_bits,num_subc,M)bt = sum(bits_alloc);% 不能传输大于 M 的比特数if total_bits M*num_subctotal_bits = M*num_subc;endwhile (bt = total_bits)if (bt total_bits)max_val = 0;max_
35、ind = ceil(rand(1)*num_subc);for i = 1:num_subcif bits_alloc(i) = 0temp = energytable(i,bits_alloc(i) ; elsetemp = 0;endif (temp max_val)max_val = temp;max_ind = i;endendif (bits_alloc(max_ind) 0)bits_alloc(max_ind) = bits_alloc(max_ind) -1;energy_alloc(max_ind) = energy_alloc(max_ind) - max_val;bt
36、= bt-1;endelsemin_val = Inf;min_ind = ceil(rand(1)*num_subc);for i = 1:num_subcif bits_alloc(i) =0 max_ind = i;endendendmin_val = Inf;for i = 1:num_subcif (i= index endif (temp length(ofdm_symbol)error( The guard interval is greater than the ofdm symbol duration );end% The guard symbol is the copy o
37、f the end of the ofdm symbol to the beginning% of the ofdm symbol.guard_symbol = ofdm_symbol(end-guard_interval+1:end);% Add the cyclic prefix to the ofdm symbolofdm_symbol = guard_symbol ofdm_symbol;channel.m: 将信道作用于 OFDM 帧。function y = channel(sig2, Mt, Mr, x, H, N);% function y = channel(sig2, Mt
38、, Mr, x, H, N)%信道传输模型% 输入:% sig2 噪声% Mt 发射天线数% Mr 接收天线数% x 复数形式的输入信号 (对于 MIMO,输入时一个矩阵,每列都是某一时刻天线输出值)% H 频率选择性信道% N - OFDM 帧中的符号数% 输出:% y 信道输出 (也是 MIMO 矩阵,与 x 矩阵类似)%产生噪声序列(每行代表不同天线, 列代表时间) 噪声是空间时间独立的高斯白噪声noise = sqrt(sig2)*1/sqrt(2)*(randn(Mt*N,1) + j*randn(Mt*N,1);y = H*x + noise;fft_cp_rx_blk.m: OF
39、DM 系统的 FFT 模块。function rec_symbol = fft_cp_rx_blk(ofdm_symbol,num_subc,guard_interval)%-%FFT 和去除循环嵌缀% -% 输入 : % ofdm_symbol : 接收来自信道的 OFDM 符号% num_subc : 子载波数% guard_interval :保护间隔%输出 : % rec_symbol :移除循环嵌缀和经过 FFT 的接收信号在频域的形式% -if (guard_interval length(ofdm_symbol)error( The guard interval is great
40、er than the ofdm symbol duration );end% The guard symbol (cyclic prefix) is removed from the ofdm symbolrec_time_symbol = ofdm_symbol(guard_interval+1:end);% The FFT of the time domain signal after the removal of cyclic prefixrec_symbol = fft(rec_time_symbol,num_subc);shape.m:通过用信道左矩阵过滤接收到的矢量functio
41、n shaped_vals = shape(rec_symbol, Mr, U, N);% shaped_vals = shape(rec_symbol, Mr, U, N);% 在解调之前完成这个过程% 这个过程完成将信道分解成平行子信道% rec_symbol -接收经过 IFFT 的符号% Mr 接收天线数% U -子信道复用之前的矩阵% N OFDM 子信道数shaped_vals =;for i = 1:Nshaped_vals = shaped_vals; U(:,(i-1)*Mr+1:i*Mr)*transpose(rec_symbol(i-1)*Mr+1:i*Mr);endsh
42、aped_vals = transpose(shaped_vals);demodulate.m:在知道所使用的传输星座的条件下按判决域解调function y = demodulate(x, b, e, h, s2,s4,s16,s64,s256, c2,c4,c16,c64,c256);% function y = demodulate(x, b, e, s2,s4,s16,s64,s256, c2,c4,c16,c64,c256);% 找到距离接收信号最近的码字用二进制输出, 使用迫零算法% y -调制输出,以行的形式% x -调制输入,以行的形式% h -所有子信道信道值(频域,64 个
43、值)% b 子载波分配的比特 (在这个矩阵里有 64 个元素,每个反映每个子载波所分配的% 比特数% e 分配的能量(64 个元素)% s_ -星座大小% c_ - 码字y=;for i = 1:length(b)switch b(i)case 1tmp, index = min(abs(s2-1/h(i)/sqrt(e(i)*x(i);y = y c2(index,:);case 2tmp, index = min(abs(s4-1/h(i)/sqrt(e(i)*x(i);y = y c4(index,:);case 4tmp, index = min(abs(s16-1/h(i)/sqrt
44、(e(i)*x(i);y = y c16(index,:);case 6tmp, index = min(abs(s64-1/h(i)/sqrt(e(i)*x(i);y = y c64(index,:);case 8tmp, index = min(abs(s256-1/h(i)/sqrt(e(i)*x(i);y = y c256(index,:);otherwiseindex = 0;endendENC2.mat: BPSK 调制器在 workspace 里的数据为 c2:1,1,s2 :-0.70711 ,0.70711ENC4.mat: 4-QAM 调制器 (格雷编码) 在 worksp
45、ace 里的数据 c4: 0,0 s4: -0.70711 + 0.70711i0,1 0.70711 + 0.70711i1,0 -0.70711 - 0.70711i1,1 0.70711 - 0.70711iENC16.mat: 16-QAM 调制器 (格雷编码)在 workspace 里的数据 c16: 0,0,0 ,0 s16: -0.94868 + 0.94868i0,0,0 ,1 -0.31623 + 0.94868i0,0,1 ,0 0.94868 + 0.94868i0,0,1 ,1 0.31623 + 0.94868i0,1,0 ,0 -0.94868 + 0.31623i
46、0,1,0 ,1 -0.31623 + 0.31623i0,1,1 ,0 0.94868 + 0.31623i0,1,1 ,1 0.31623 + 0.31623i1,0,0 ,0 -0.94868 - 0.94868i1,0,0 ,1 -0.31623 - 0.94868i1,0,1 ,0 0.94868 - 0.94868i1,0,1 ,1 0.31623 - 0.94868i1,1,0 ,0 -0.94868 - 0.31623i1,1,0 ,1 -0.31623 - 0.31623i1,1,1 ,0 0.94868 - 0.31623i1,1,1,1 0.31623 - 0.31623
47、iENC64.mat: 64-QAM 调制器 (格雷编码)在 workspace 里的数据 c64:是 0 到 63 的二进制表示S64:ENC256.mat: 256-QAM 调制器 (格雷编码)在 workspace 里 c256:是 0 到 255 的二进制表示S256:BPSK,4-QAM,16QAM,64QAM ,256QAM 除了用以上数据加载的方法外,也可以由程序生成,以下,分别是各个调制阶数的调制与解调函数function Symbol=BPSKMod(bit)% BPSK: s m% 1 1% 0 -1%BPSK 调制bitlength=length(bit);for ii=1:bitlengthif bit(ii)=1temp(ii)=1;elsetemp(ii)=-1;endendSymbol=temp;function softbit=BPSKDemod(symbol)% BPSK