(完整版)OFDMmatlab实现 联系客服

发布时间 : 星期五 文章(完整版)OFDMmatlab实现更新完毕开始阅读

clear all; close all;

carrier_count=200;%子载波数

symbols_per_carrier=12;%每子载波含符号数 bits_per_symbol=4;%每符号含比特数,16QAM调制 IFFT_bin_length=512;?T点数

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点坐标 rand( 'state',0);

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');QAM调制后星座图 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);%共轭复数映射 %========================================================

figure(2);

stem(0:IFFT_bin_length-1, abs(IFFT_modulation(2,1:IFFT_bin_length)),'b*-')%第一个OFDM符号的频谱 grid on

axis ([0 IFFT_bin_length -0.5 4.5]); ylabel('Magnitude'); xlabel('IFFT Bin');

title('OFDM Carrier Frequency Magnitude'); figure(3);

plot(0:IFFT_bin_length-1, (180/pi)*angle(IFFT_modulation(2,1:IFFT_bin_length)), 'go') hold on

stem(0:carriers-1, (180/pi)*angle(IFFT_modulation(2,1:carriers)),'b*-');%第一个OFDM符号的相位

stem(0:conjugate_carriers-1,

(180/pi)*angle(IFFT_modulation(2,1:conjugate_carriers)),'b*-'); axis ([0 IFFT_bin_length -200 +200]) grid on

ylabel('Phase (degrees)') xlabel('IFFT Bin')

title('OFDM Carrier Phase')

%================================================================= signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);%OFDM调制 即IFFT变换 time_wave_matrix =signal_after_IFFT;%时域波形矩阵,行为每载波所含符号数,列ITTF点数,N个子载波映射在其内,每一行即为一个OFDM符号 figure(4); subplot(3,1,1);

plot(0:IFFT_bin_length-1,time_wave_matrix(2,:));%第一个符号的波形 axis([0, 700, -0.2, 0.2]); grid on;

ylabel('Amplitude'); xlabel('Time');

title('OFDM Time Signal, One Symbol Period');

%=========================================================== %=====================添加循环前缀与后缀====================================

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 subplot(3,1,2);

plot(0:length(time_wave_matrix_cp)-1,time_wave_matrix_cp(2,:));%第一个符号添加循环前缀后的波形

axis([0, 700, -0.2, 0.2]); grid on;

ylabel('Amplitude'); xlabel('Time');

title('OFDM Time Signal with CP, One Symbol Period'); %==============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 subplot(3,1,3);

plot(0:IFFT_bin_length-1+GI+GIP,windowed_time_wave_matrix_cp(2,:));%第一个符号的波形

axis([0, 700, -0.2, 0.2]); grid on;

ylabel('Amplitude'); xlabel('Time');

title('OFDM Time Signal Apply a Window , One Symbol Period');

%========================生成发送信号,并串变换==================================================

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_matrix_cp(i+1,:);%并串转换,循环后缀与循环前缀相叠加 end

%======================================================= Tx_data_withoutwindow

=reshape(time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI+GIP),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 (5) 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行