当前位置:文档之家› OFDM仿真

OFDM仿真

OFDM仿真
OFDM仿真

一、题目

OFDM系统的Matlab仿真

二、仿真要求

要求一:OFDM系统的数据传输

①传输的数据随机产生;

②调制方式采用16QAM;

③必须加信道的衰落

④必须加高斯白噪声

⑤接收端要对信道进行均衡。

要求二:要求对BER的性能仿真

设计仿真方案,得到在数据传输过程中不同信噪比的BER性能结论,要求得到的BER曲线较为平滑。

三、仿真方案详细设计

(一)基于IFFT/FFT 实现的OFDM 系统方框图:

(二)详细设计方案: 1确定参数

需要确定的参数为:子信道,子载波数,FFT 长度,每次使用的OFDM 符号数,调制度水平,符号速率,比特率,保护间隔长度,信噪比,插入导频数,基本的仿真可以不插入导频,可以为0。

2产生数据

使用个随机数产生器产生二进制数据,每次产生的数据个数为carrier_count * symbols_per_carrier * bits_per_symbol 。

3编码交织

交织编码可以有效地抗突发干扰。 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,21, 101

, 421

.输出的复数

序列即为映射后的调制结果。

5串并转换。

将一路高速数据转换成多路低速数据 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,则有

∑-==

1

0/2j ,,e 1N k N

ik k

n i

n S

N

s π

从该式可以看出,它是一个严格的离散反傅立叶变换(IDFT )的表达式。IDFT 可以采用快速反傅立叶变换(IFFT)来实现

7加入保护间隔。

由IFFT 运算后的每个符号的同相分量和正交分量分别转换为串行数据,并将符号尾部G 长度的数据加到头部,构成循环前缀。如果加入空的间隔,在多径传播的影响下,会造成载波间干扰ICI 。保护见个的长度G 应该大于多径时的扩张的最大值。

图 1-2 多径情况下,空闲保护间隔在子载波间造成的干扰

8加窗

加窗是为了降低系统的PAPR ,滚降系数为1/32。通过这种方法,可以显著地改善OFDM 通信系统高的PAPR 分布,大大降低了峰值信号出现的概率以及对功率放大器的要求,节约成本。经常被采用的窗函数是升余弦窗

())()()()()?????-+++=s s s T T t T t t w βπβππc o s 5.05.00.1c o s 5.05.0 ()s s s

s s

T t T T t T T t βββ+≤≤≤≤≤≤10 (1-2) 图1-3 保护间隔的插入过程

图1-9 经过加窗处理后的OFDM符号示意图

9通过信道。

信道分为多径实验信道和高斯白噪声信道。多径时延信道直射波河延迟波对于标准时间按照固定比率递减,因此多径时延信道参数为比率和对大延迟时间。

10同步。

同步是决定OFDM系统高性能十分重要的方面,实际OFDM系统都有同步过称。主要同步方法有使用导频,循环前缀,忙算法三种。研究目的为同步的可以详细实现本步,基本的方针可以略过此步,假设接收端已经于发射端同步。

11去掉保护间隔。

根据同步得到的数据,分别见给每个符号的同相分量和正交分量开头的保护间隔去掉。

12并串转换。

将每个符号分布在子信道上的数据,还原为一路串行数据。

13 FFT。

对每个符号的同相分量和正交分量按照(Ich+Qch*i)进行FFT运算。并将得到的实部作为新的Ich,虚部作为新的Qch。

与发端相类似,上述相关运算可以通过离散傅立叶变换(DFT)或快速傅立叶变换(FFT)来实现,即:

∑-=-

=

1

/

π

2j

,

,

e

1N

i

N

ik

i

n

k

n

r N

R

14子载波解调

FFT后的同相粉脸感和正交分量两组数据在星座图上对饮高的点,由于噪声和信道的影响,不再是严格的发送端的星座图。将得到的星座图上的点按照最近原则判决为原星座图上的点,并按映射规则还原为一组数据。

15解码解交织。

按照编码交织对应解码,解交织的方法,还原为原始数据,并进行纠错处理。

16计算误码率。

比较第2步产生的数据和接收到的数据,计算误码率BER

17统计误码率

使用for循环,将SNR从0dB到30dB逐五变化,运行主函数,统计误码率,画出误码率曲线。

四、仿真结果及结论

-4-3-2-101234

-4-3-2-101

23

416QAM 调制后星座图

010002000

3000400050006000

70008000

-0.5

0.5A m p l i t u d e (v o l t s )

Time (samples)

循环前后缀不叠加的OFDM Time Signal

0.5

p l i t u d e (v o l t s )循环前后缀叠加的OFDM Time Signal

0.05

0.1

0.150.20.250.30.350.40.450.5

M a g n i t u d e (d B )

Normalized Frequency (0.5 = fs/2)加窗的发送信号频谱

90

270

180

极坐标下的接收信号的星座图

-4-3-2-10123

4X Y 坐标接收信号的星座图

0.5

1

输出待调制的二进制比特流

0.5

1

接收解调后的二进制比特流

该函数基本能实现本次实验的要求,概括了OFDM 主要的实现过程,能画出每一个步骤的图像,更具体形象地反应了OFDM 的过程。同时也能统计并绘制出在不同信噪比情况下的误码率曲线。

1010

10

10

SNR1

B e r

五、总结与体会

本程序没有添加信道估计部分,与峰均值仿真,如果添加了将更加完善对OFDM的研究。且通过本次仿真实验,让我更加清楚地明白了OFDM调制技术的过程与其优缺点。

OFDM技术的优点主要有:

(1) OFDM调制方式适用于多径和衰落信道中的高速数据传输。当信道因为多径的影响出现频率选择性衰落时,只有落在频率凹陷处的载波及其携带的信息受到影响,其它子载波未受损害;。

(2) 在OFDM调制方式中,通过插入保护间隔,可以很好地克服符号间干扰(ISI)和载波间干扰(ICI)

(3) 由于OFDM各子载波相互正交,允许各子载波有1/2重叠,因此可以大大提高频谱利用率:

(4) 由于深度衰落而丢失的一些子载波可通过编码、交织等措施来很好的恢复,提高系统抗误码性能,且通过各子载波的联合编码,具有很强的抗衰落能力;

(5)OFDM技术抗脉冲及窄带干扰的能力很强,因为这些干扰仅仅影响到很小一部分的子信道;

(6) 与单载波系统相比,对采样定时偏移不敏感。

OFDM技术的缺点主要有:

(1) 由于要求各子载波正交,所以对频率偏移和相位噪声很敏感;

(2) 由于各子载波相互独立,峰值功率与均值功率比相对较大,且随子载波数目的增加而增加。高峰均比信号通过功放时,为了避免信号的非线性失真和带外频谱再生,功放需要具有较大的线性范围,导致射频放大器的功率效率降低。

六、主要仿真代码

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);%列向量

complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier)';%symbols_per_ca rrier*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;

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);

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_time_wave_matri x_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行

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

hold on

plot(0:1/IFFT_bin_length:1, -35, 'rd')

grid on

axis([0 0.5 -40 max(average_fft_log)])

ylabel('Magnitude (dB)')

xlabel('Normalized Frequency (0.5 = fs/2)')

title('加窗的发送信号频谱')

%====================添加噪声=================================

Tx_signal_power = var(windowed_Tx_data);%发送信号功率

linear_SNR=10^(SNR/10);%线性信噪比

noise_sigma=Tx_signal_power/linear_SNR;

noise_scale_factor = sqrt(noise_sigma);%标准差sigma

noise=randn(1,((symbols_per_carrier)*(IFFT_bin_length+GI))+GIP)*noise_scale_factor;%产生正态分布噪声序列

Rx_data=windowed_Tx_data +noise;%接收到的信号加噪声

%=====================接收信号串/并变换去除前缀与后缀==========================================

Rx_data_matrix=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);

for i=1:symbols_per_carrier;

Rx_data_matrix(i,:)=Rx_data(1,(i-1)*(IFFT_bin_length+GI)+1:i*(IFFT_bin_length+GI)+GIP);%串并变换end

Rx_data_complex_matrix=Rx_data_matrix(:,GI+1:IFFT_bin_length+GI);%去除循环前缀与循环后缀,得到有用信号矩阵

%==============================================================

% OFDM解码16QAM解码

%=================FFT变换=================================

Y1=fft(Rx_data_complex_matrix,IFFT_bin_length,2);%OFDM解码即FFT变换

Rx_carriers=Y1(:,carriers);%除去IFFT/FFT变换添加的0,选出映射的子载波

Rx_phase =angle(Rx_carriers);%接收信号的相位

Rx_mag = abs(Rx_carriers);%接收信号的幅度

figure(4);

polar(Rx_phase, Rx_mag,'bd');%极坐标坐标下画出接收信号的星座图

%====================================================================== [M, N]=pol2cart(Rx_phase, Rx_mag);

Rx_complex_carrier_matrix = complex(M, N);

figure(5);

plot(Rx_complex_carrier_matrix,'*r');%XY坐标接收信号的星座图

title('XY坐标接收信号的星座图')

axis([-4, 4, -4, 4]);

grid on

%====================16qam解调=======================================

Rx_serial_complex_symbols=reshape(Rx_complex_carrier_matrix',size(Rx_complex_carrier_matrix, 1)*size(Rx_complex_carrier_matrix,2),1)' ;

Rx_decoded_binary_symbols=demoduqam16(Rx_serial_complex_symbols);

%============================================================

baseband_in = Rx_decoded_binary_symbols;

figure(6);

subplot(2,1,1);

stem(baseband_out(1:100));

title('输出待调制的二进制比特流')

subplot(2,1,2);

stem(baseband_in(1:100));

title('接收解调后的二进制比特流')

%================误码率计算==========================================

bit_errors=find(baseband_in ~=baseband_out);

bit_error_count = size(bit_errors, 2)

ber=bit_error_count/baseband_out_length

相关主题
文本预览
相关文档 最新文档