logo资料库

基于MATLAB的OFDM的仿真.doc

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
1.实习题目
2.原理介绍
3.原理框图
4.功能说明
5.实现步骤
一、实习目的 1、熟悉通信相关方面的知识、学习并掌握 OFDM 技术的原理 2、熟悉 MATLAB 语言 3、设计并实现 OFDM 通信系统的建模与仿真 二、实习要求 仿真实现 OFDM 调制解调,在发射端,经串/并变换和 IFFT 变换,加上保护间隔(又称“循 环前缀”),形成数字信号,通过信道到达接收端,结束端实现反变换,进行误码分析 三、实习内容 1. 实习题目 《正交频分复用 OFDM 系统建模与仿真》 2. 原理介绍 OFDM 的基本原理就是把高速的数据流通过串并变换,分配到传输速率相对较低的若干 个子信道中进行传输。由于每个子信道中的符号周期会相对增加,因此可以减轻由无线信道 的多径时延扩展所产生的时间弥散性对系统造成的影响。并且还可以在 OFDM 符号之间插入 保护间隔,令保护间隔大于无线信道的最大时延扩展,这样就可以最大限度地消除由于多径 而带来的符号间干扰(ISI)。而且,一般都采用循环前缀作为保护间隔,从而可以避免由多 径带来的子载波间干扰((ICI) 。 3. 原理框图 RF TX DAC 并/串 插入循 环前缀 和加窗 编码 交织 解码 解交 织 数字 调制 数字 解调 插入 导频 信道 校正 串并 变换 并串 变换 IFFT FFT 串/并 去除循 环前缀 RF RX ADC 定时 和频 率同 步 图 1-1 OFDM 原理框图
4. 功能说明 4.1 确定参数 需要确定的参数为:子信道,子载波数,FFT 长度,每次使用的 OFDM 符号数,调制度水 平,符号速率,比特率,保护间隔长度,信噪比,插入导频数,基本的仿真可以不插入导频, 可以为 0。 4.2 产生数据 使 用 个 随 机 数 产 生 器 产 生 二 进 制 数 据 , 每 次 产 生 的 数 据 个 数 为 carrier_count * symbols_per_carrier * bits_per_symbol。 4.3 编码交织 交织编码可以有效地抗突发干扰。 4.4 子载波调制 OFDM 采用 BPSK、QPSK、16QAM、64QAM4 种调制方式。按照星座图,将每个子信道上 的数据,映射到星座图点的复数表示,转换为同相 Ich 和正交分量 Qch。 其实这是一种查表的方法,以 16QAM 星座为例,bits_per_symbol=4,则每个 OFDM 符号的 每个子信道上有 4 个二进制数{d1,d2,d3,d4},共有 16 种取值,对应星座图上 16 个点,每个点 的实部记为 Qch。为了所有的映射点有相同高的平均功率,输出要进行归一化,所以对应 BPSK,PQSK,16QAM,64QAM,分别乘以归一化系数系数 1, 2 .输出的复数 10 42 1 1 , 1 , 序列即为映射后的调制结果。 4.5 串并转换。 将一路高速数据转换成多路低速数据 4.6 IFFT。 对上一步得到的相同分量和正交分量按照(Ich+Qch*i)进行 IFFT 运算。并将得到的复数的 实部作为新的 Ich,虚部作为新的 Qch。 在实际运用中, 信号的产生和解调都是采用数字信号处理的方法来实现的, 此时要对信号 进行抽样, 形成离散时间信号。 由于 OFDM 信号的带宽为 B=N·Δf, 信号必须以Δ t=1/B=1/(N·Δf)的时间间隔进行采样。 采样后的信号用 sn,i 表示, i = 0, 1, …, N-1,则有 s , in  1 1 N  N 0  k S , kn e 2j Nik  / 从该式可以看出,它是一个严格的离散反傅立叶变换(IDFT)的表达式。IDFT 可以采用快 速反傅立叶变换(IFFT)来实现 4.7 加入保护间隔。 由 IFFT 运算后的每个符号的同相分量和正交分量分别转换为串行数据,并将符号尾部 G 长 度的数据加到头部,构成循环前缀。如果加入空的间隔,在多径传播的影响下,会造成载波 间干扰 ICI。保护见个的长度 G 应该大于多径时的扩张的最大值。 1
子载波1 延迟的子载波2 子载波2对子载波1的 干扰部分 保护时间 FFT积分时间 OFDM符号周期 图 1-2 多径情况下,空闲保护间隔在子载波间造成的干扰 复制 IFFT 保护 间隔 IFFT输出 保护 间隔 IFFT Tg TFFT Ts 符号N 符号N-1 时间 符号N+1 图 1-3 保护间隔的插入过程 4.8 加窗 加窗是为了降低系统的 PAPR,滚降系数为 1/32。通过这种方法,可以显著地改善 OFDM 通 信系统高的 PAPR 分布,大大降低了峰值信号出现的概率以及对功率放大器的要求,节约成 本。经常被采用的窗函数是升余弦窗   tw   5.05.0   0.1   5.05.0   cos  T  s   t   cos   Tt  s  T  s    0 t T   s T Tt   s s  1 t T  s  s T  (1-2) 图 1-9 经过加窗处理后的 OFDM 符号示意图 4.9 通过信道。 2
信道分为多径实验信道和高斯白噪声信道。多径时延信道直射波河延迟波对于标准时间按照 固定比率递减,因此多径时延信道参数为比率和对大延迟时间。 4.10 同步。 同步是决定 OFDM 系统高性能十分重要的方面,实际 OFDM 系统都有同步过称。主要同步 方法有使用导频,循环前缀,忙算法三种。研究目的为同步的可以详细实现本步,基本的方 针可以略过此步,假设接收端已经于发射端同步。 4.11 去掉保护间隔。 根据同步得到的数据,分别见给每个符号的同相分量和正交分量开头的保护间隔去掉。 4.12 并串转换。 将每个符号分布在子信道上的数据,还原为一路串行数据。 4.13 FFT。 对每个符号的同相分量和正交分量按照(Ich+Qch*i)进行 FFT 运算。并将得到的实部作为 新的 Ich,虚部作为新的 Qch。 与发端相类似,上述相关运算可以通过离散傅立叶变换(DFT)或快速傅立叶变换(FFT)来 实现, 即: R , kn  1 1 N  N 0 i   /π2j Nik r , in e 4.14 子载波解调 FFT 后的同相粉脸感和正交分量两组数据在星座图上对饮高的点,由于噪声和信道的影响, 不再是严格的发送端的星座图。将得到的星座图上的点按照最近原则判决为原星座图上的 点,并按映射规则还原为一组数据。 4.15 解码解交织。 按照编码交织对应解码,解交织的方法,还原为原始数据,并进行纠错处理。 4.16 计算误码率。 比较第 2 步产生的数据和接收到的数据,计算误码率 BER 5. 实现步骤 16QAM 的调制函数 5.1 function [complex_qam_data]=qam16(bitdata) %modulation of 16QAM,modulate bitdata to 16QAM complex signal X1=reshape(bitdata,4,length(bitdata)/4)'; d=1;%min distance of symble for i=1:length(bitdata)/4; for j=1:4 X1(i,j)=X1(i,j)*(2^(4-j)); end source(i,1)=1+sum(X1(i,:));%convert to the number 1 to 16 end mapping=[-3*d 3*d; -d d 3*d; 3*d; 3
3*d -3*d -d d 3*d -3*d -d d 3*d -3*d -d d 3*d 3*d; d; d; d; d; -d; -d; -d; -d; -3*d; -3*d; -3*d; -3*d]; for i=1:length(bitdata)/4 qam_data(i,:)=mapping(source(i),:);%data mapping 16QAM 的解调函数。 end complex_qam_data=complex(qam_data(:,1),qam_data(:,2)); 5.2 function [demodu_bit_symble]=demoduqam16(Rx_serial_complex_symbols) %将得到的串行 16QAM 数据解调成二进制比特流 complex_symbols=reshape(Rx_serial_complex_symbols,length(Rx_serial_complex_symbols),1); d=1; mapping=[-3*d 3*d; -d d 3*d -3*d -d d 3*d -3*d -d d 3*d -3*d -d d 3*d 3*d; 3*d; 3*d; d; d; d; d; -d; -d; -d; -d; -3*d; -3*d; -3*d; -3*d]; complex_mapping=complex(mapping(:,1),mapping(:,2)); for i=1:length(Rx_serial_complex_symbols); for j=1:16; metrics(j)=abs(complex_symbols(i,1)-complex_mapping(j,1)); end [min_metric decode_symble(i)]= min(metrics) ; % 将 离 某 星 座 点 最 近 的 值 赋 给 4
decode_symble(i) end decode_bit_symble=de2bi((decode_symble-1)','left-msb'); demodu_bit_symble=reshape(decode_bit_symble',1,length(Rx_serial_complex_symbols)*4); 5.3 加窗函数 function [rcosw]=rcoswindow(beta, Ts) %定义升余弦窗,其中 beta 为滚降系数,Ts 为包含循环前缀的 OFDM 符号的长度,Ts 为正偶 数 t=0:(1+beta)*Ts; rcosw=zeros(1,(1+beta)*Ts); for i=1:beta*Ts; rcosw(i)=0.5+0.5*cos(pi+ t(i)*pi/(beta*Ts)); end rcosw(beta*Ts+1:Ts)=1; for j=Ts+1:(1+beta)*Ts+1; rcosw(j-1)=0.5+0.5*cos((t(j)-Ts)*pi/(beta*Ts)); end rcosw=rcosw';%变换为列向量 5.4 OFDM 主程序 clear all; close all; carrier_count=200;%子载波数 symbols_per_carrier=12;%每子载波含符号数 bits_per_symbol=4;%每符号含比特数,16QAM 调制 IFFT_bin_length=512;%FFT 点数 PrefixRatio=1/4;%保护间隔与 OFDM 数据的比例 1/6~1/4 GI=PrefixRatio*IFFT_bin_length ;% 每 一 个 OFDM 符 号 添 加 的 循 环 前 缀 长 度 为 1/4*IFFT_bin_length 即保护间隔长度为 128 beta=1/32;%窗函数滚降系数 GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度 20 SNR=15; %信噪比 dB %================================================== %================信号产生=================================== baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;%所输入的比特 数目 carriers = (1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2));%共轭对称子载 波映射 复数数据对应的 IFFT 点坐标 conjugate_carriers = IFFT_bin_length - carriers + 2;%共轭对称子载波映射 共轭复数对应的 IFFT 点坐标 baseband_out=round(rand(1,baseband_out_length));%输出待调制的二进制比特流 %==============16QAM 调制==================================== complex_carrier_matrix=qam16(baseband_out);%列向量 5
complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier)';%s ymbols_per_carrier*carrier_count 矩阵 figure(1); plot(complex_carrier_matrix,'*r');%16QAM 调制后星座图 title('16QAM 调制后星座图') axis([-4, 4, -4, 4]); grid on %=================IFFT=========================== IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);% 添 0 组 成 IFFT_bin_length IFFT 运算 IFFT_modulation(:,carriers ) = complex_carrier_matrix ;%未添加导频信号 ,子载波映射在此 处 IFFT_modulation(:,conjugate_carriers ) = conj(complex_carrier_matrix);%共轭复数映射 %================================================================= signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);%OFDM 调制 即 IFFT 变换 time_wave_matrix =signal_after_IFFT;%时域波形矩阵,行为每载波所含符号数,列 ITTF 点 数,N 个子载波映射在其内,每一行即为一个 OFDM 符号 %=========================================================== %===================== 缀 与 ==================================== XX=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP); for k=1:symbols_per_carrier; for i=1:IFFT_bin_length; 加 循 环 前 添 后 缀 XX(k,i+GI)=signal_after_IFFT(k,i); end for i=1:GI; XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循环前缀 end for j=1:GIP; XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循环后缀 end end time_wave_matrix_cp=XX;%添加了循环前缀与后缀的时域信号矩阵,此时一个 OFDM 符号长 度为 IFFT_bin_length+GI+GIP=660 %==============OFDM 符号加窗========================================== windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP); for i = 1:symbols_per_carrier windowed_time_wave_matrix_cp(i,:) real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗 升余弦窗 end %======================== 生 成 发 送 信 号 , 并 串 变 换 ================================================== windowed_Tx_data=zeros(1,symbols_per_carrier*(IFFT_bin_length+GI)+GIP); = 6
windowed_Tx_data(1:IFFT_bin_length+GI+GIP)=windowed_time_wave_matrix_cp(1,:); for i = 1:symbols_per_carrier-1 ; windowed_Tx_data((IFFT_bin_length+GI)*i+1:(IFFT_bin_length+GI)*(i+1)+GIP)=windowed_ti me_wave_matrix_cp(i+1,:);%并串转换,循环后缀与循环前缀相叠加 end %======================================================= Tx_data=reshape(windowed_time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI +GIP),1)';%加窗后 循环前缀与后缀不叠加 的串行信号 %================================================================= temp_time1 = (symbols_per_carrier)*(IFFT_bin_length+GI+GIP);%加窗后 循环前缀与后缀不 叠加 发送总位数 figure (2) subplot(2,1,1); plot(0:temp_time1-1,Tx_data );%循环前缀与后缀不叠加 发送的信号波形 grid on ylabel('Amplitude (volts)') xlabel('Time (samples)') title('循环前后缀不叠加的 OFDM Time Signal') temp_time2 =symbols_per_carrier*(IFFT_bin_length+GI)+GIP; subplot(2,1,2); plot(0:temp_time2-1,windowed_Tx_data);%循环后缀与循环前缀相叠加 发送信号波形 grid on ylabel('Amplitude (volts)') xlabel('Time (samples)') title('循环前后缀叠加的 OFDM Time Signal') %===============加窗的发送信号频谱================================= symbols_per_average = ceil(symbols_per_carrier/5);%符号数的 1/5,10 行 avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%点数,10 行数据,10 个 符号 averages = floor(temp_time1/avg_temp_time); average_fft(1:avg_temp_time) = 0;%分成 5 段 for a = 0:(averages-1) subset_ofdm = Tx_data(((a*avg_temp_time)+1):((a+1)*avg_temp_time));%利用循环前缀后缀 未叠加的串行加窗信号计算频谱 subset_ofdm_f = abs(fft(subset_ofdm));%分段求频谱 average_fft = average_fft + (subset_ofdm_f/averages);%总共的数据分为 5 段,分段进行 FFT, 平均相加 end average_fft_log = 20*log10(average_fft); figure (3) subplot(2,1,2) plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log)% 归 一 化 0/avg_temp_time (avg_temp_time-1)/avg_temp_time : 7
分享到:
收藏