当前位置:文档之家› 基于matlab实现OFDM的编码.

基于matlab实现OFDM的编码.

clc;clear all;close all;fprintf('OFDM系统仿真\n');carrier_count=input('输入系统仿真的子载波数: \n');%子载波数128,64,32,16 symbols_per_carrier=30;%每子载波含符号数bits_per_symbol=4;%每符号含比特数,16QAM调制IFFT_bin_length=1024;%FFT点数PrefixRatio=1/4;%保护间隔与OFDM数据的比例1/6~1/4GI=PrefixRatio*IFFT_bin_length ;%每一个OFDM符号添加的循环前缀长度为1/4*IFFT_bin_length ,即256beta=1/32;%窗函数滚降系数GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度40SNR=10; %信噪比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( 'twister',0); %每次产生不相同得伪随机序列baseband_out=round(rand(1,baseband_out_length));%产生待调制的二进制比特流figure(1);stem(baseband_out(1:50));title('二进制比特流')axis([0, 50, 0, 1]);%==============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(2);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 运算IFFT_modulation(:,carriers ) = complex_carrier_matrix ;%未添加导频信号,子载波映射在此处IFFT_modulation(:,conjugate_carriers) =conj(complex_carrier_matrix);%共轭复数映射figure(3);stem(0:IFFT_bin_length-1, abs(IFFT_modulation(2,1:IFFT_bin_length)),'b*-')grid onaxis ([0 IFFT_bin_length -0.5 4.5]);ylabel('幅值');xlabel('频率');title('OFDM载波幅度谱');figure(4);plot(0:IFFT_bin_length-1,(180/pi)*angle(IFFT_modulation(2,1:IFFT_bin_length)),'go')hold onstem(0:carriers-1, (180/pi)*angle(IFFT_modulation(2,1:carriers)),'b*-');stem(0:conjugate_carriers-1,(180/pi)*angle(IFFT_modulation(2,1:conjugate_carriers)),'b*-');axis ([0 IFFT_bin_length -200 +200])grid onylabel('相位')xlabel('频率')title('OFDM载波相位谱')%========通过IFFT将频域转化为时域,得到时域信号=============== signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);%OFDM调制即IFFT time_wave_matrix =signal_after_IFFT;%时域波形矩阵,行为每载波所含符号数,列ITTF点数,子载波映射在其内,每一行即为一个OFDM符号figure(5);plot(0:IFFT_bin_length-1,time_wave_matrix(2,:));axis([0, 700, -0.2, 0.2]);grid on;ylabel('振幅');xlabel('时间');title('一个符号周期的时域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);endfor i=1:GI;XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循环前缀endfor j=1:GIP;XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循环后缀endendtime_wave_matrix_cp=XX;%添加了循环前缀与后缀的时域信号矩阵,此时一个OFDM符号长度为IFFT_bin_length+GI+GIPfigure(6);plot(0:length(time_wave_matrix_cp)-1,time_wave_matrix_cp(2,:));axis([0, 700, -0.2, 0.2]);grid on;ylabel('振幅');xlabel('时间');title('加入循环前缀后缀的OFDM波形');%==============OFDM符号加窗======================windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP);for i = 1:symbols_per_carrierwindowed_time_wave_matrix_cp(i,:) = real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗升余弦窗endfigure(7);plot(0:IFFT_bin_length-1+GI+GIP,windowed_time_wave_matrix_cp(2,:));axis([0, 700, -0.2, 0.2]);grid on;ylabel('振幅');xlabel('时间');title('加窗之后OFDM信号的波形');%========================生成发送信号======================== 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_bi n_length+GI+GIP),1)';%加窗后,循环前缀与后缀不叠加的串行信号temp_time1 = (symbols_per_carrier)*(IFFT_bin_length+GI+GIP);%加窗后循环前缀与后缀不叠加发送总位数figure (8)subplot(2,1,1);plot(0:temp_time1-1,Tx_data);%循环前缀与后缀不叠加发送的信号波形axis([0, 8000, -0.4, 0.4]);grid onylabel('振幅');xlabel('时间');title('循环前后缀不叠加的OFDM信号')temp_time2 =symbols_per_carrier*(IFFT_bin_length+GI)+GIP;subplot(2,1,2);plot(0:temp_time2-1,windowed_Tx_data);%循环后缀与循环前缀相叠加发送信号波形axis([0, 8000, -0.4, 0.4]);grid onylabel('振幅'); xlabel('时间');title('循环前后缀叠加的OFDM信号')%=================未加窗发送信号频谱========================= symbols_per_average = ceil(symbols_per_carrier/5);avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;averages = floor(temp_time1/avg_temp_time);average_fft(1:avg_temp_time) = 0;for a = 0:(averages-1)subset_ofdm= Tx_data_withoutwindow (((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);endaverage_fft_log = 20*log10(average_fft);figure (9)subplot(2,1,1);plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log)hold onplot(0:1/IFFT_bin_length:1, -35, 'rd')grid onaxis([0 0.5 -40 max(average_fft_log)])ylabel('幅值(dB)')xlabel('归一化频率(0.5 = fs/2)')title('OFDM不加窗信号频谱')%===============加窗的发送信号频谱======================= symbols_per_average = ceil(symbols_per_carrier/5);%符号数的1/5avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%点数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,平均相加endaverage_fft_log = 20*log10(average_fft);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_timehold onplot(0:1/IFFT_bin_length:1, -35, 'rd')grid onaxis([0 0.5 -40 max(average_fft_log)])ylabel('幅值(dB)')xlabel('归一化频率(0.5 = fs/2)')title('OFDM加窗信号频谱')%====================添加噪声=================================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);%标准差sigmanoise=randn(1,((symbols_per_carrier)*(IFFT_bin_length+GI))+GIP)*noise_scale_fac tor;%产生正态分布噪声序列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);%串并变换endRx_data_complex_matrix=Rx_data_matrix(:,GI+1:IFFT_bin_length+GI);%去除循环前缀与循环后缀,得到有用信号矩阵% OFDM解码%=================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(10);polar(Rx_phase, Rx_mag,'bd');%极坐标中接收信号的星座图title('极坐标中接收信号的星座图')[M, N]=pol2cart(Rx_phase, Rx_mag);Rx_complex_carrier_matrix = complex(M, N);figure(11);plot(Rx_complex_carrier_matrix,'*r');%直角坐标系中接收信号的星座图title('直角坐标系中接收信号的星座图')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(12);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。

相关主题