实验课程

THIS NAME

实验课程

当前位置: 首页 >> 实验课程 >> 正文

移动通信-OFDM系统的Matlab仿真

发布日期:2024-08-24    作者:     来源:     点击:

实验四 OFDM系统的Matlab仿真(虚拟仿真)

一、实验目的

1、了解OFDM技术的特点。

2、理解OFDM系统的组成和工作原理。

3、掌握OFDM系统的组成仿真编程方法。

二、实验内容

1、编程建立OFDM系统的仿真过程。

2、观察单径和多径下接收信号的星座图并计算单径和多径下的误码率。

三、实验原理及说明

OFDM的工作原理是将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰(ISI) 。每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上可以看成平坦性衰落,从而可以消除码间串扰,而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。

OFDM系统框图如下:  

图4-1 OFDM系统框图图

四、实验设备

一台安装MatlabPC机。

五、实验方法

OFDM系统仿真参数为:子载波个数为 200,总符号数为100IFFT/FFT 的长度为 512,调制方式选用16QAM调制,为了最大限度的减少插入保护间隔带来的信噪比损失,一般选择符号周期长度是保护间隔长度的5倍,所以保护间隔的长度为有效符号周期的1/4,故设循环前缀的长度为128,信噪比为20dB

1、产生0-1随机序列

使用函数rand(),生成随机0-1串行序列,个数为:子载波个数总符号数4

2、串并变换、并串转换

reshape()函数用来把指定的矩阵改变形状,但是元素个数不变,串并变换、并串转换均通过调用reshape()函数。OFDM将频带划分为多个子信道并行传输数据,将高速数据流分成多个并行的低速数据流,然后调制到每个信道的子载波上进行传输。

316QAM调制解调

信号的调制方式有多种,可以通过改变发射的射频信号的幅度、相位和频率来调制信号。对于OFDM系统来说,只能采用前两种方法,而不能采用频率的调制方法,因为子载波是频率正交,并且携带独立的信息,调制子载波频率会破坏这些子载波的正交特性。本次仿真中我们采用16QAM调制的方式,由二进制变为四进制数字基带信号并进行格雷码映射,取值为-3-1,1,3。格雷码的特点是邻近的两个信号,其标识仅有一位不同,这样当误符号率一定时,误比特率最小。仿真时直接调用qammod()函数实现。

4IFFTFFT

IFFT实现OFDM中,发送端添加了IFFT模块、接收端添加了FFT模块。IFFT模块的功能相当于说:别麻烦发送N个子载波信号了,我直接算出你们在空中会叠加成啥样子吧;FFT模块的功能相当于说:别用老式的积分方法来去除其余的正交子载波了,我帮你一次把N个携带信号全算出来吧。IFFT实现OFDM的系统用数学的方法在发送端计算信号的叠加波形,在接收端去除正交子载波,从而大大简化了系统的复杂度。

5、循环前缀和循环后缀

OFDM可以有效地对抗多径时延扩展,把输入数据流中并变换到N个并行的子信道中,使得每一个调制子载波的数据周期可以扩大为原始数据符号周期的N倍,因此时延扩展与符号周期的数值比也同样降低N倍。为了最大限度的消除符号间干扰,还可以在每个OFDM符号的起始位置插入保护间隔,而且该保护间隔长度一般要大于无线信道中的最大时延扩展,这样一个符号的多径分量就不会对下一个符号造成干扰。这种保护间隔是一种循环复制,增加了符号的波形长度,在符号的数据部分,将每个OFDM符号的后Tg时间中的样点复制到OFDM符号的前面,形成前缀,因此交接点没有任何的间断。

6、滤波器(加窗函数)

根据OFDM符号的功率谱密度,其带外衰减比较慢,为了加快带外衰减的速度我们需要使用加窗技术。通常采用升余弦类型的窗函数

7、信道

仿真分析两种情况:
1
)高斯白噪声新道
2
)多径信道+高斯白噪声信道

8、计算误码率

误码率=错误的bit/序列长度,分别计算单径和多径下的误码率。

仿真代码如下:

OFDM.m

clear all;

close all;

carrier_count = 200; % 子载波数

symbol_count = 100; %总符号数

ifft_length = 512; % IFFT长度

CP_length = 128; % 循环前缀

CS_length = 20; % 循环后缀

rate = [];

SNR =20;

bit_per_symbol = 4;

alpha = 1.5/32; % 升余弦窗系数

% ================产生随机序列=======================

bit_length = carrier_count*symbol_count*bit_per_symbol;

bit_sequence = round(rand(1,bit_length))'; % 列向量

% =================串并转换==========================

% ==================16QAM调制=========================

% 1-28置零 29-228有效 229-285置零 286-485共轭 486-512置零

carrier_position = 29:228;

conj_position = 485:-1:286;

bit_moded = qammod(bit_sequence,16,'InputType','bit');

figure(1);

scatter(real(bit_moded),imag(bit_moded));

title('调制后的星座图');

grid on;

% ===================IFFT===========================

ifft_position = zeros(ifft_length,symbol_count);

bit_moded = reshape(bit_moded,carrier_count,symbol_count);

figure(2);

stem(abs(bit_moded(:,1)));

grid on;

ifft_position(carrier_position,:)=bit_moded(:,:);

ifft_position(conj_position,:)=conj(bit_moded(:,:));

signal_time = ifft(ifft_position,ifft_length);

figure(3);

subplot(3,1,1)

plot(signal_time(:,1),'b');

title('原始单个OFDM符号');

xlabel('Time');

ylabel('Amplitude');

axis([0 500 -0.5 0.5])

% ==================加循环前缀和后缀==================

signal_time_C = [signal_time(end-CP_length+1:end,:);signal_time];

signal_time_C = [signal_time_C; signal_time_C(1:CS_length,:)]; % 单个完整符号为512+128+20=660

subplot(3,1,2);

plot(signal_time_C(:,1));

xlabel('Time');

ylabel('Amplitude');

title('CPCS的单个OFDM符号');

axis([0 500 -0.5 0.5])

% =======================加窗========================

signal_window = zeros(size(signal_time_C));

% 通过矩阵点乘

signal_window = signal_time_C.*repmat(rcoswindow(alpha,size(signal_time_C,1)),1,symbol_count);

subplot(3,1,3)

plot(signal_window(:,1))

title('加窗后的单个OFDM符号')

xlabel('Time');

ylabel('Amplitude');

axis([0 500 -0.5 0.5])

% ===================发送信号,多径信道====================

signal_Tx = reshape(signal_window,1,[]); % 并串转换,变成时域一个完整信号,待传输

signal_origin = reshape(signal_time_C,1,[]); % 未加窗完整信号

mult_path_am = [1 0.2 0.1]; %  多径幅度

mutt_path_time = [0 20 50]; % 多径时延

windowed_Tx = zeros(size(signal_Tx));

path2 = 0.2*[zeros(1,20) signal_Tx(1:end-20) ];

path3 = 0.1*[zeros(1,50) signal_Tx(1:end-50) ];

signal_Tx_mult = signal_Tx + path2 + path3; % 多径信号

figure(4)

subplot(2,1,1)

plot(signal_Tx)

title('单径下OFDM信号')

xlabel('Time/samples')

ylabel('Amplitude')

axis([0 1000 -0.5 0.5])

subplot(2,1,2)

plot(signal_Tx_mult)

title('多径下OFDM信号')

xlabel('Time/samples')

ylabel('Amplitude')

axis([0 1000 -0.5 0.5])

% =====================发送信号频谱========================

% 每个符号求频谱再平均,功率取对数

orgin_aver_power = 20*log10(mean(abs(fft(signal_time_C'))));

% ====================加窗信号频谱=========================

figure(5) % 归一化

orgin_aver_power = 20*log10(mean(abs(fft(signal_window'))));

plot((1:length(orgin_aver_power))/length(orgin_aver_power),orgin_aver_power)

hold on

axis([0 1 -40 5])

grid on

title('加窗信号频谱')

% ========================AWGN==========================

signal_power_sig = var(signal_Tx); % 单径发送信号功率

signal_power_mut = var(signal_Tx_mult); % 多径发送信号功率

SNR_linear = 10^(SNR/10);

noise_power_mut = signal_power_mut/SNR_linear;

noise_power_sig = signal_power_sig/SNR_linear;

noise_sig = randn(size(signal_Tx))*sqrt(noise_power_sig);

noise_mut = randn(size(signal_Tx_mult))*sqrt(noise_power_mut);

Rx_data_sig = signal_Tx+noise_sig;

Rx_data_mut = signal_Tx_mult+noise_mut;

% =======================串并转换==========================

Rx_data_mut = reshape(Rx_data_mut,ifft_length+CS_length+CP_length,[]);

Rx_data_sig = reshape(Rx_data_sig,ifft_length+CS_length+CP_length,[]);

% ====================去循环前缀和后缀======================

Rx_data_sig(1:CP_length,:) = [];

Rx_data_sig(end-CS_length+1:end,:) = [];

Rx_data_mut(1:CP_length,:) = [];

Rx_data_mut(end-CS_length+1:end,:) = [];

% =========================FFT=============================

fft_sig = fft(Rx_data_sig);

fft_mut = fft(Rx_data_mut);

% =========================恢复采样===========================

data_sig = fft_sig(carrier_position,:);

data_mut = fft_mut(carrier_position,:);

figure(6)

scatter(real(reshape(data_sig,1,[])),imag(reshape(data_sig,1,[])),'.')

grid on;

title('单径接收信号星座图')

figure(7)

scatter(real(reshape(data_mut,1,[])),imag(reshape(data_mut,1,[])),'.')

grid on;

title('多径接收信号星座图')

% =========================16QAM逆映射===========================

bit_demod_sig = reshape(qamdemod(data_sig,16,'OutputType','bit'),[],1);

bit_demod_mut = reshape(qamdemod(data_mut,16,'OutputType','bit'),[],1);

% =========================误码率===========================

error_bit_sig = sum(bit_demod_sig~=bit_sequence);

error_bit_mut = sum(bit_demod_mut~=bit_sequence);

error_rate_sig = error_bit_sig/bit_length;

error_rate_mut = error_bit_mut/bit_length;

rate = [rate; error_rate_sig error_rate_mut]

rcoswindow.m

function window=rcoswindow(alpha,bit_length)

   warning off;

   window = zeros(1,bit_length/2);

   t = 1:bit_length/2;

   T = bit_length/(2*(1+alpha));

   window(t) = 0.5*(1 - sin(pi/(2*alpha*T)*(t-T)));

   window(1:(1-alpha)*T) = 1;

   window=[fliplr(window) window]';

end

仿真结果如下:

  6图4-2 单径下接收信号的星座图

  7

图4-3 多径下接收信号的星座图

仿真单径和多径下的误码率,单径下的误码率为0、多径下的误码率为0.0184

 

上一条:通信原理-双边带调制与解调实验 下一条:移动通信-基于simulink数字通信仿真实验

关闭