基于MATLAB的OFDM的仿真Word格式.docx
《基于MATLAB的OFDM的仿真Word格式.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的OFDM的仿真Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
对上一步得到的相同分量和正交分量按照(Ich+Qch*i)进行IFFT运算。
并将得到的复数的实部作为新的Ich,虚部作为新的Qch。
在实际运用中, 信号的产生和解调都是采用数字信号处理的方法来实现的,此时要对信号进行抽样, 形成离散时间信号。
由于OFDM信号的带宽为B=N·
Δf,信号必须以Δt=1/B=1/(N·
Δf)的时间间隔进行采样。
采样后的信号用sn,i
表示, i=0,1,…,N-1,则有
从该式可以看出,它是一个严格的离散反傅立叶变换(IDFT)的表达式。
IDFT可以采用快速反傅立叶变换(IFFT)来实现
4.7加入保护间隔。
由IFFT运算后的每个符号的同相分量和正交分量分别转换为串行数据,并将符号尾部G长度的数据加到头部,构成循环前缀。
如果加入空的间隔,在多径传播的影响下,会造成载波间干扰ICI。
保护见个的长度G应该大于多径时的扩张的最大值。
图1-2 多径情况下,空闲保护间隔在子载波间造成的干扰
图1-3保护间隔的插入过程
4.8加窗
加窗是为了降低系统的PAPR,滚降系数为1/32。
通过这种方法,可以显著地改善OFDM通信系统高的PAPR分布,大大降低了峰值信号出现的概率以及对功率放大器的要求,节约成本。
经常被采用的窗函数是升余弦窗
(1-2)
图1-9经过加窗处理后的OFDM符号示意图
4.9通过信道。
信道分为多径实验信道和高斯白噪声信道。
多径时延信道直射波河延迟波对于标准时间按照固定比率递减,因此多径时延信道参数为比率和对大延迟时间。
4.10同步。
同步是决定OFDM系统高性能十分重要的方面,实际OFDM系统都有同步过称。
主要同步方法有使用导频,循环前缀,忙算法三种。
研究目的为同步的可以详细实现本步,基本的方针可以略过此步,假设接收端已经于发射端同步。
4.11去掉保护间隔。
根据同步得到的数据,分别见给每个符号的同相分量和正交分量开头的保护间隔去掉。
4.12并串转换。
将每个符号分布在子信道上的数据,还原为一路串行数据。
4.13FFT。
对每个符号的同相分量和正交分量按照(Ich+Qch*i)进行FFT运算。
并将得到的实部作为新的Ich,虚部作为新的Qch。
与发端相类似,上述相关运算可以通过离散傅立叶变换(DFT)或快速傅立叶变换(FFT)来实现,即:
4.14子载波解调
FFT后的同相粉脸感和正交分量两组数据在星座图上对饮高的点,由于噪声和信道的影响,不再是严格的发送端的星座图。
将得到的星座图上的点按照最近原则判决为原星座图上的点,并按映射规则还原为一组数据。
4.15解码解交织。
按照编码交织对应解码,解交织的方法,还原为原始数据,并进行纠错处理。
4.16计算误码率。
比较第2步产生的数据和接收到的数据,计算误码率BER
5.实现步骤
5.1 16QAM的调制函数
function [complex_qam_data]=qam16(bitdata)
%modulationof16QAM,modulate bitdatato 16QAM complex signal
X1=reshape(bitdata,4,length(bitdata)/4)'
;
d=1;
%mindistanceofsymble
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,:
));
%converttothe number1to16
end
mapping=[-3*d 3*d;
ﻩ-d3*d;
d3*d;
ﻩ3*d 3*d;
ﻩ -3*dd;
-dd;
ﻩdd;
ﻩ 3*d d;
ﻩ -3*d -d;
-d -d;
ﻩ d -d;
3*d-d;
-3*d -3*d;
-d -3*d;
d -3*d;
3*d-3*d];
fori=1:
length(bitdata)/4
qam_data(i,:
)=mapping(source(i),:
);
%datamapping
end
complex_qam_data=complex(qam_data(:
,1),qam_data(:
2));
5.216QAM的解调函数。
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*d3*d;
-d 3*d;
d3*d;
ﻩ 3*d 3*d;
ﻩ-3*d d;
ﻩ-dd;
d d;
3*dd;
ﻩ-3*d-d;
-d-d;
d -d;
3*d-d;
-3*d-3*d;
-d-3*d;
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);
%将离某星座点最近的值赋给decode_symble(i)
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;
forj=Ts+1:
(1+beta)*Ts+1;
rcosw(j-1)=0.5+0.5*cos((t(j)-Ts)*pi/(beta*Ts));
rcosw=rcosw'
;
%变换为列向量
5.4 OFDM主程序
clearall;
closeall;
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_carrier*carrier_count矩阵
figure
(1);
plot(complex_carrier_matrix,'
*r'
);
%16QAM调制后星座图
title('
16QAM调制后星座图'
)
axis([-4,4,-4,4]);
gridon
%=================IFFT===========================
IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);
%添0组成IFFT_bin_lengthIFFT运算
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);
fork=1:
symbols_per_carrier;
fori=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
forj=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);
fori= 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,:
fori =1:
symbols_per_carrier-1;
windowed_Tx_data((IFFT_bin_length+GI)*i+1:
(IFFT_bin_length+GI)*(i+1)+GIP)=windowed_time_wave_matrix_cp(i+1,:
%并串转换,循环后缀与循环前缀相叠加
%=======================================================
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 );
%循环前缀与后缀不叠加发送的信号波形
gridon
ylabel('
Amplitude(volts)'
xlabel('
Time(samples)'
循环前后缀不叠加的OFDMTimeSignal'
temp_time2=symbols_per_carrier*(IFFT_bin_length+GI)+GIP;
subplot(2,1,2);
temp_time2-1,windowed_Tx_data);
%循环后缀与循环前缀相叠加发送信号波形
gridon
ylabel('Amplitude(volts)'
xlabel('Time(samples)'
循环前后缀叠加的OFDMTime 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段
fora= 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
holdon
plot(0:
1/IFFT_bin_length:
1,-35,'rd')
gridon
axis([00.5-40max(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);
fori=1:
symbols_per_carrier;
Rx_data_matrix(i,:
)=Rx_data(1,(i-1)*(IFFT_bin_length+GI)+1:
i*(IFFT_bin_length+GI)+GIP);
%串并变换
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');
%极坐标坐标下画出接收信号的星座图
title('极坐标下的接收信号的星座图'
%===========================================