clear all;
close all;
carrier_count=200;%这个程序中OFDM子载波个数为512,其中400即carrier_count*2为数据符号,其余赋0值
symbols_per_carrier=20;%每个子载波上的符号数,在这里即是OFDM符号的个数
bits_per_symbol=4;%OFDM符号的每个子载波上传输的比特数。4bit通常采用16QAM调制
IFFT_bin_length=512;%FFT长度,也即一个OFDM符号的子载波个数
PrefixRatio=1/4;%循环前缀的比值,即循环前缀与OFDM符号长度的比值,通常在1/6到1/4之间
GI=PrefixRatio*IFFT_bin_length;%保护间隔的长度,这里是128
beta=1/32;%升余弦窗的滚降系数
GIP=beta*(IFFT_bin_length+GI);%循环前缀的长度,这里是20
SNR=30;%本程序考虑加性高斯白噪声信道,信噪比30dB
%===========OFDM信号产生=============
baseband_out_length=carrier_count*symbols_per_carrier*bits_per_symbol;%计算传输数据总的比特数,为200*20*4bit=16000bit。16000bit的构成为20个OFDM符号,
%每个OFDM符号200个子载波,每个子载波传输4bit信息
carriers=(1:carrier_count)+(floor(IFFT_bin_length/4)-floor(carrier_count/2));%计算OFDM符号子载波序号,carrier中存放的序号是29到228
conjugate_carriers=IFFT_bin_length-carriers+2;%计算每个子载波的序号,conjugate_carrier中存放的序号是282到481
rand('twister',0);
baseband_out=round(rand(1,baseband_out_length));%产生16000bit待传输的二进制比特流。这里存放的是发送的二进制信号和后面解调后的二进制信号比较,可计算误码率
%16QAM调制并绘制星座图
complex_carrier_matrix=qam16(baseband_out);%调用子程序qam16进行16QAM调制,将baseband_out中的二进制比特流,每4bit转换为一个16QAM信号,
%即将二进制比特流每4bit转换为-3-3j、-3+3j、3-3j、3+3j、-1-3j、-1+3j、1-3j、1+3j、-3-j、-3+j、3-j、3+j、-1-j、-1+j、1-j、1+j中的一个,
%转换后comolex_carrier_matrix为1*4000矩阵
comolex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier)';
%转换complex_carrier_matrix中的数据为carrier_count*symbols_per_carrier矩阵,这里为20*200矩阵
figure(1);
plot(complex_carrier_matrix,'*r');%绘制16QAM星座图
axis([-4,4,-4,4]);
title('16QAM调制后星座图');
grid on
%IFFT,即进行OFDM调制
IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%将symbols_per_carrier*IFFT_bin_length矩阵赋0值,这里将20*512矩阵赋0值。
%这里512是IFFT的长度,也是OFDM符号的子载波个数
IFFT_modulation(:,carriers)=complex_carrier_matrix;%将20*200的complex_carrier_matrix的数据赋给IFFT_modulation的第29到228列
%即给512个子载波中的29到229个子载波赋值
close all;
carrier_count=200;%这个程序中OFDM子载波个数为512,其中400即carrier_count*2为数据符号,其余赋0值
symbols_per_carrier=20;%每个子载波上的符号数,在这里即是OFDM符号的个数
bits_per_symbol=4;%OFDM符号的每个子载波上传输的比特数。4bit通常采用16QAM调制
IFFT_bin_length=512;%FFT长度,也即一个OFDM符号的子载波个数
PrefixRatio=1/4;%循环前缀的比值,即循环前缀与OFDM符号长度的比值,通常在1/6到1/4之间
GI=PrefixRatio*IFFT_bin_length;%保护间隔的长度,这里是128
beta=1/32;%升余弦窗的滚降系数
GIP=beta*(IFFT_bin_length+GI);%循环前缀的长度,这里是20
SNR=30;%本程序考虑加性高斯白噪声信道,信噪比30dB
%===========OFDM信号产生=============
baseband_out_length=carrier_count*symbols_per_carrier*bits_per_symbol;%计算传输数据总的比特数,为200*20*4bit=16000bit。16000bit的构成为20个OFDM符号,
%每个OFDM符号200个子载波,每个子载波传输4bit信息
carriers=(1:carrier_count)+(floor(IFFT_bin_length/4)-floor(carrier_count/2));%计算OFDM符号子载波序号,carrier中存放的序号是29到228
conjugate_carriers=IFFT_bin_length-carriers+2;%计算每个子载波的序号,conjugate_carrier中存放的序号是282到481
rand('twister',0);
baseband_out=round(rand(1,baseband_out_length));%产生16000bit待传输的二进制比特流。这里存放的是发送的二进制信号和后面解调后的二进制信号比较,可计算误码率
%16QAM调制并绘制星座图
complex_carrier_matrix=qam16(baseband_out);%调用子程序qam16进行16QAM调制,将baseband_out中的二进制比特流,每4bit转换为一个16QAM信号,
%即将二进制比特流每4bit转换为-3-3j、-3+3j、3-3j、3+3j、-1-3j、-1+3j、1-3j、1+3j、-3-j、-3+j、3-j、3+j、-1-j、-1+j、1-j、1+j中的一个,
%转换后comolex_carrier_matrix为1*4000矩阵
comolex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier)';
%转换complex_carrier_matrix中的数据为carrier_count*symbols_per_carrier矩阵,这里为20*200矩阵
figure(1);
plot(complex_carrier_matrix,'*r');%绘制16QAM星座图
axis([-4,4,-4,4]);
title('16QAM调制后星座图');
grid on
%IFFT,即进行OFDM调制
IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%将symbols_per_carrier*IFFT_bin_length矩阵赋0值,这里将20*512矩阵赋0值。
%这里512是IFFT的长度,也是OFDM符号的子载波个数
IFFT_modulation(:,carriers)=complex_carrier_matrix;%将20*200的complex_carrier_matrix的数据赋给IFFT_modulation的第29到228列
%即给512个子载波中的29到229个子载波赋值