OFDM系统设计及其Matlab实现
(完整版)OFDMmatlab实现

close all;carrier_count=200;%子载波数symbols_per_carrier=12;%每子载波含符号数bits_per_symbol=4;%每符号含比特数,16QAM调制IFFT_bin_length=512;%FFT点数PrefixRatio=1/4;%保护间隔与OFDM数据的比例1/6~1/4GI=PrefixRatio*IFFT_bin_length ;%每一个OFDM符号添加的循环前缀长度为1/4*IFFT_bin_length 即保护间隔长度为128beta=1/32;%窗函数滚降系数GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度20SNR=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_car rier)';%symbols_per_carrier*carrier_count 矩阵figure(1);plot(complex_carrier_matrix,'*r');%16QAM调制后星座图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);%共轭复数映射%========================================================stem(0:IFFT_bin_length-1, abs(IFFT_modulation(2,1:IFFT_bin_length)),'b*-')%第一个OFDM符号的频谱grid onaxis ([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 onstem(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 onylabel('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);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+GIP=660subplot(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_carrierwindowed_time_wave_matrix_cp(i,:) =real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗升余弦窗endsubplot(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)=window ed_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 onylabel('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 onylabel('Amplitude (volts)')xlabel('Time (samples)')title('OFDM Time 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段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);%总共的数据分为5段,分段进行FFT,平均相加endaverage_fft_log = 20*log10(average_fft);figure (6)subplot(2,1,1);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('Magnitude (dB)')xlabel('Normalized Frequency (0.5 = fs/2)')title('OFDM Signal Spectrum without windowing')%===============加窗的发送信号频谱================================= 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段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('Magnitude (dB)')xlabel('Normalized Frequency (0.5 = fs/2)')title('Windowed OFDM Signal Spectrum')%====================添加噪声============================================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_factor; %产生正态分布噪声序列%noise=wgn(1,length(windowed_Tx_data),noise_sigma,'complex');%产生复GAUSS白噪声信号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)+GI P);%串并变换endRx_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(7);polar(Rx_phase, Rx_mag,'bd');%极坐标坐标下画出接收信号的星座图%================================================================== ====[M, N]=pol2cart(Rx_phase, Rx_mag);Rx_complex_carrier_matrix = complex(M, N);figure(8);plot(Rx_complex_carrier_matrix,'*r');%XY坐标接收信号的星座图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(9);subplot(2,1,1);stem(baseband_out(1:100));subplot(2,1,2);stem(baseband_in(1:100));%================误码率计算=============================================bit_errors=find(baseband_in ~=baseband_out);bit_error_count = size(bit_errors, 2)ber=bit_error_count/baseband_out_length。
(完整版)OFDMmatlab实现

close all;carrier_count=200;%子载波数symbols_per_carrier=12;%每子载波含符号数bits_per_symbol=4;%每符号含比特数,16QAM调制IFFT_bin_length=512;%FFT点数PrefixRatio=1/4;%保护间隔与OFDM数据的比例1/6~1/4GI=PrefixRatio*IFFT_bin_length ;%每一个OFDM符号添加的循环前缀长度为1/4*IFFT_bin_length 即保护间隔长度为128beta=1/32;%窗函数滚降系数GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度20SNR=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_car rier)';%symbols_per_carrier*carrier_count 矩阵figure(1);plot(complex_carrier_matrix,'*r');%16QAM调制后星座图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);%共轭复数映射%========================================================stem(0:IFFT_bin_length-1, abs(IFFT_modulation(2,1:IFFT_bin_length)),'b*-')%第一个OFDM符号的频谱grid onaxis ([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 onstem(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 onylabel('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);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+GIP=660subplot(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_carrierwindowed_time_wave_matrix_cp(i,:) =real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗升余弦窗endsubplot(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)=window ed_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 onylabel('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 onylabel('Amplitude (volts)')xlabel('Time (samples)')title('OFDM Time 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段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);%总共的数据分为5段,分段进行FFT,平均相加endaverage_fft_log = 20*log10(average_fft);figure (6)subplot(2,1,1);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('Magnitude (dB)')xlabel('Normalized Frequency (0.5 = fs/2)')title('OFDM Signal Spectrum without windowing')%===============加窗的发送信号频谱================================= 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段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('Magnitude (dB)')xlabel('Normalized Frequency (0.5 = fs/2)')title('Windowed OFDM Signal Spectrum')%====================添加噪声============================================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_factor; %产生正态分布噪声序列%noise=wgn(1,length(windowed_Tx_data),noise_sigma,'complex');%产生复GAUSS白噪声信号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)+GI P);%串并变换endRx_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(7);polar(Rx_phase, Rx_mag,'bd');%极坐标坐标下画出接收信号的星座图%================================================================== ====[M, N]=pol2cart(Rx_phase, Rx_mag);Rx_complex_carrier_matrix = complex(M, N);figure(8);plot(Rx_complex_carrier_matrix,'*r');%XY坐标接收信号的星座图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(9);subplot(2,1,1);stem(baseband_out(1:100));subplot(2,1,2);stem(baseband_in(1:100));%================误码率计算=============================================bit_errors=find(baseband_in ~=baseband_out);bit_error_count = size(bit_errors, 2)ber=bit_error_count/baseband_out_length。
基于MATLAB的OFDM系统仿真及分析

基于MATLAB的OFDM系统仿真及分析OFDM(正交频分复用)是一种广泛应用于无线通信系统中的多载波调制技术。
在OFDM系统中,信号被分为多个独立的子载波,并且每个子载波之间正交。
这种正交的特性使得OFDM系统具有抗频率选择性衰落和多径干扰的能力。
本文将基于MATLAB对OFDM系统进行仿真及分析。
首先,我们需要确定OFDM系统的参数。
假设我们使用256个子载波,其中包括8个导频符号用于信道估计,每个OFDM符号的时域长度为128个采样点。
接下来,我们需要生成调制信号。
假设我们使用16QAM调制方式,每个子载波可以传输4个比特。
在MATLAB中,我们可以使用randi函数生成随机的比特序列,然后将比特序列映射为16QAM符号。
生成的符号序列可以通过IFFT(Inverse Fast Fourier Transform)将其转换为时域信号。
OFDM系统的发射端包括窗函数、导频符号插入、IFFT和并行到串行转换等模块。
窗函数用于增加OFDM符号之间的过渡带,导频符号用于信道估计和符号同步。
通过将符号序列与导频图案插入到OFDM符号序列中,然后进行IFFT变换,再进行并行到串行转换即可得到OFDM信号的时域波形。
接下来,我们需要模拟OFDM信号在信道中传输和接收。
假设信道是Additive White Gaussian Noise(AWGN)信道。
在接收端,OFDM信号的时域波形通过串行到并行转换,然后进行FFT(Fast Fourier Transform)变换得到频域信号。
通过在频域上对导频符号和OFDM信号进行正交插值,可以进行信道估计和等化。
最后将频域信号进行解调,得到接收后的比特序列。
通过比较发送前和接收后的比特序列,我们可以计算比特误码率(BER)来评估OFDM系统的性能。
比特误码率是接收到错误比特的比特数与总传输比特数之比。
通过改变信噪比(SNR)值,我们可以评估OFDM系统在不同信道条件下的性能。
基于MATLAB的OFMD仿真实验-OFDM系统设计1

GI, TG (frac of TU)
24.6%
SubC 1K/2K
spacing/Hz
(子载波间隔)
4K/8K
1⁄4, 1⁄32
1⁄8,
1⁄16,
1⁄4, 1⁄32
1⁄8,
1⁄16,
1⁄4,
1⁄6,
1⁄9
4, 464 1, 116
4,464, 2,232, 1,116
2,000
1/128, 1/32, 1/16, 19/256, 1/8, 19/128, 1/4.
(CFO):
f
f
tx c
f
rx c
Doppler Shift (多普勒偏移)
CFO Estimation & Compensation
(先估计出偏移然后补偿,然后就可以消除频偏CFO实现同步)
Time/Frequency Synchronization
Find the start point of OFDM symbols (ISI free) CFO Estimation & Compensation (ICI free)
Noise Figure
SNR -- Signal to Noise Ratio -- 信噪比
Tx/Rx process of OFDM system
Time Synchronization
(时间同步)
Inter-symbol Interference (ISI)
N
N
N
Find the start point of OFDM symbols
Physical Layer System Design
基于MATLAB的OFDM系统设计与仿真综述

基于MATLAB的OFDM系统设计与仿真摘要:随着通信产业的逐步发展,4G时代已经来临。
作为第四代移动通信技术的核心,OFDM得到了前所未有的关注。
它具有频谱利用率高、抗干扰能力强等优点。
本文首先简要介绍了OFDM的发展状况以及优缺点,然后详细分析了OFDM的工作原理及其相应的各个模块,并介绍了它的关键技术。
最后,分别利用M函数和Simulink做了OFDM 系统的设计与仿真,并对误码率进行了分析,得到了BER性能曲线。
关键词:正交频分复用;MATLAB;仿真;BERDesign and Simulation of OFDM System Based on MATLABAbstract:With the gradual development of the communication industry, 4G era has come. As the key technology of the fourth generation mobile communications,OFDM has received unprecedented attention. It has a high spectrum utilization, strong ability of anti-interference and so on. This article describes the development of OFDM and it’s advantages and disadvantages briefly, analysis the working principles of OFDM and each module detailed,and describes it’s key tec hnology.At last, design and simulate OFDM system with the M function and Simulink separately, analysis the error rate and obtain BER performance curve .Keywords: OFDM; MATLAB; Simulation; BER目录1 引言 (4)1.1 OFDM概述 (4)1.1.1 OFDM技术发展历史 (4)1.1.2 OFDM技术的优缺点 (5)2 OFDM基本原理及关键技术 (5)2.1 OFDM基本原理及系统构成 (5)2.1.1 OFDM基本原理 (5)2.1.2 串并转换 (6)2.1.3 调制与解调 (6)2.1.4 保护间隔与循环前缀 (8)2.2 OFDM的关键技术 (10)2.2.1 信道估计概述 (10)2.2.2 基于导频的信道估计方法 (10)2.2.3 信道的插值方法 (11)3 OFDM的系统设计与仿真 (12)3.1 MATLAB概述 (12)3.2 OFDM系统设计与仿真 (12)3.2.1 随机序列的产生 (12)3.2.2 串并转换 (14)3.2.3 QPSK调制 (14)3.2.4 QPSK调制星座图 (14)3.2.5 IFFT/FFT运算 (15)3.2.6 保护间隔和循环前缀 (16)3.2.7 并串转换 (16)3.2.8 加入高斯白噪声 (17)3.2.9 QPSK解调 (17)3.2.10 接收信号 (18)3.3 系统误码率的分析 (18)3.4 基于Simulink的系统仿真 (19)4 总结 (21)参考文献 (21)附录 (22)1 引言1.1 OFDM概述随着移动通信和无线网需求的不断增长,需要越来越高速的无线系统设计,而这其中一个最直接的挑战就是克服无线信道带来的严重的频率选择性衰落。
OFDM系统设计及其Matlab实现

(7)
[ ] 显然,这
N 个样值{ {s
n
}N −1 n=0
与序列
S
=
{S
}N −1
K n=0
的
IDFT,除
了系数外完全一样。由于对每个连续 OFDM 码元采样 N 个
样本,正好满足 Nyquist 采样定理,所以可以通过这些样值
重构原始的连续信号。这样样值可以通过 IDFT 来得到,这
就是用 IDFT 和 DFT 可以实现 OFDM 系统的根源[2]。
量相乘,构成最终的子信道信号和合成的 OFDM 符号[1]。
在接收端对应 OFDM 解调,其第 k 路子载波信号解调过
程为:将接收信号与第
k
路的解调载波
exp
⎛ ⎜⎝
−
jπ
2k
− T
N
t
⎞ ⎟⎠
相
乘,然后将得到的结果在 OFDM 符号的持续时间 T 内进行
积分,即可获得相应的发送信号 d′k。实际上,式(2)中定 义的 OFDM 复等效基带信号可以采用离散逆傅里叶变换
2008 年第 11 期,第 41 卷 总第 203 期
通信技术 Communications Technology
Vol.41,No.11,2008 No.203,Totally
OFDM 系统设计及其 Matlab 实现
丁龙刚
(南京工业职业技术学院 电气与自动化系,江苏 南京 210016 )
【摘 要】文章对 OFDM 系统调制与解调技术进行了解析,得到了 OFDM 符号的一般表达式,给出了 OFDM 系统参数设计公
nb ⋅ Nsc = Nbit
简单的推导,可以得到:
⎧nb ⋅ Nsc = Rd (T + Tg ),
ofdm的matlab实现

ofdm的matlab实现OFDM(正交频分复用)是一种常用的调制解调技术,被广泛应用于无线通信和数字电视等领域。
在本篇文章中,我们将探讨OFDM的基本原理,并介绍如何使用Matlab实现OFDM系统。
一、OFDM基本原理OFDM是一种基于频域的多载波调制技术,通过将高速数据流分成多个较低速的子流,并将这些子流分配到不同的频率载波上来传输数据。
通过这种方式,OFDM可以有效地抵抗频率选择性衰落和多径传播引起的时域间隔干扰,提供更好的抗干扰性能。
OFDM系统的主要构成部分包括信源、调制器(调制器和反调制器)和调制解调器(调制器和解调器)。
在发送端,调制器将输入数据流分为多个子流,并进行调制后输出。
在接收端,解调器对接收到的信号进行解调并还原为原始数据流。
OFDM调制器的实现主要依赖于以下两个关键概念:正交性和多载波调制。
1. 正交性:在OFDM系统中,子载波之间需要满足正交性条件,即相邻子载波之间的正弦波形式相互垂直,相位差为0或π。
这样可以确保子载波之间的干扰最小。
2. 多载波调制:OFDM系统中,将整个频率带宽划分为多个子载波,每个子载波都可以用不同的调制方式来传输数据。
常见的调制方式有BPSK、QPSK、16-QAM等。
二、Matlab实现OFDM系统下面我们将使用Matlab来实现OFDM系统。
按照OFDM系统的基本原理,需要完成以下几个步骤:1. 生成原始数据:首先,我们需要生成一组原始数据作为输入。
可以使用随机数生成器来生成一个指定长度的数据序列。
2. 子载波生成:根据系统设置,生成需要的子载波。
可以使用fft函数计算离散傅里叶变换,得到频域上的正弦波。
3. 数据调制:将原始数据按照设定的调制方式进行调制,得到对应的调制符号。
可以使用BPSK、QPSK或其他调制方式。
4. 倍频:将调制符号乘以子载波的复数载波,得到OFDM的时域信号。
5. CP(循环前缀)添加:为了避免多径效应引起的信号间干扰,在时域信号的开头添加一个与其末尾相同的循环前缀。
基于MATLAB的OFMD仿真实验-OFDM系统设计2

The interleaver is defined by a two-step permutation (置换). The first permutation ensures that adjacent coded bits are
mapped onto nonadjacent subcarriers. The second ensures that adjacent coded bits are mapped
Convolutional code
[1 0 1 1 0 1 1]=(133)8
1/2编码,约束长度为7
[1 1 1 1 0 0 1]=(171)8
test_coding.m
Puncturing (打孔)
# 1/2编码,多一倍 然后打孔punctuate
# 进去9个,出来12个 就有 r = 3/4
Main Parameters of 802.11a
Tg 4
Ttotal 5Tg
f 20MHz 64 312.5KHz
B f 54 16.875MHz
Tx/Rx process of OFDM system
Modulation: BPSK/QPSK/16QAM/64QAM Coding: 1/2 Convolutional code Coding Rate (Punctuate (打孔)): 1/2、2/3、3/4
alternately onto less and more significant bits of the constellation and, thereby, long runs of low reliability (LSB) bits are avoided. ( Least Significant Bit 还需要好好理解!)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计。
课程设计名称:嵌入式系统课程设计专业班级: 07级电信1-1****:__**__________学号:_____107_____指导教师:李国平,陈涛,金广峰,韩琳课程设计时间:—|1 需求分析运用模拟角度调制系统的分析进行频分复用通信系统设计。
从OFDM系统的实现模型可以看出,输入已经过调制的复信号经过串/并变换后,进行IDFT或IFFT和并/串变换,然后插入保护间隔,再经过数/模变换后形成OFDM调制后的信号s(t)。
该信号经过信道后,接收到的信号r(t)经过模/数变换,去掉保护间隔,以恢复子载波之间的正交性,再经过串/并变换和DFT或FFT后,恢复出OFDM的调制信号,再经过并/串变换后还原出输入符号2 概要设计1.简述OFDM通信系统的基本原理2.简述OFDM的调制和解调方法3.概述OFDM系统的优点和缺点4.基于MATLAB的OFDM系统的实现代码和波形:3 运行环境硬件:Windows XP 软件:MATLAB4 详细设计OFDM基本原理一个完整的OFDM系统原理如图1所示。
OFDM的基本思想是将串行数据,并行地调制在多个正交的子载波上,这样可以降低每个子载波的码元速率,增大码元的符号周期,提高系统的抗衰落和干扰能力,同时由于每个子载波的正交性,大大提高了频谱的利用率,所以非常适合移动场合中的高速传输。
在发送端,输入的高比特流通过调制映射产生调制信号,经过串并转换变成N条并行的低速子数据流,每N个并行数据构成一个OFDM符号。
插入导频信号后经快速傅里叶反变换(IFFT)对每个OFDM符号的N个数据进行调制,变成时域信号为:[式式1中:m为频域上的离散点;n为时域上的离散点;N为载波数目。
为了在接收端有效抑制码间干扰(InterSymbol Interference,ISI),通常要在每一时域OFDM符号前加上保护间隔(Guard Interval,GI)。
加保护间隔后的信号可表示为式,最后信号经并/串变换及D/A转换,由发送天线发送出去。
式接收端将接收的信号进行处理,完成定时同步和载波同步。
经A/D转换,串并转换后的信号可表示为:yGI(n)=xGI(n)*h(n)+z(n)+w(n) 式然后,在除去CP后进行FFT解调,同时进行信道估计(依据插入的导频信号),接着将信道估计值和FFT解调值一同送入检测器进行相干检测,检测出每个子载波上的信息符号,最后通过反映射及信道译码恢复出原始比特流。
除去循环前缀(CP)经FFT变换后的信号可表示为:式—2.OFDM的调制和解调方法OFDM是一种多载波调制技术,其原理是用N个子载波把整个信道分割成N 个子信道,即将频率上等间隔的N个子载波信号调制并相加后同时发送,实现N个子信道并行传输信息。
这样每个符号的频谱只占用信道带宽的1/N,且使各子载波在OFDM符号周期T内保持频谱的正交性。
如图a所示为一个OFDM符号内包含5个子载波的实例。
其中,所有的子载波都具有相同的幅值和相位,但在实际应用中,经过数字基带调制后,每个子载波不可能都有相同的幅值和相位。
从图中可以看出,每个子载波在一个OFDM 符号周期内都包含整数倍个周期,而且各个相邻的子载波之间相差1个周期。
这一特性可以用来解释子载波间的正交性,即满足:式这种正交性还可以从频域角度来解释,图给出了互相覆盖的各个子信道内经过矩形波成形得到的符号sinc函数频谱。
每个子载波频率最大值处,所有其他子信道的频谱值恰好为零。
因为在对OFDM符号进行解调的过程中,需要计算这些点上所对应的每个子载波频率的最大值,所以可以从多个互相重叠的子信道符号中提取每一个子信道符号,而不会受到其他子信道的干扰。
从图b中可以看出,OFDM符号频谱实际上可以满足奈奎斯特准则,即多个子信道频谱之间不存在互相干扰。
因此这种一个子信道频谱出现最大值而其他子信道频谱为零的特点可以避免载波间干扰(ICI)的出现。
】( b)OFDM子载波时域图与FDM子载波频域图在发送端,串行码元序列经过数字基带调制、串并转换,将整个信道分成N个子信道。
N个子信道码元分别调制在N个子载波频率上,设为最低频率,相邻频率相差1/N,则,,角频率为,。
待发送的OFDM信号为:式接收端对接收到的信号进行如下解调:式由于OFDM符号周期内各子载波是正交的,正交关系如式所示。
所以,当时,调制载波与解调载波为同频载波,满足相干解调的条件,,恢复了原始信号;当时,接收到的不同载波之间互不干扰,无法解调出信号。
这样就在接收端完成了信号的提取,实现了信号的传输。
在式中,设式若1个内以采样频率(其中)被采样,则可得个采样点。
设,,则式式正是序列的N点离散傅里叶反变换(IDFT)的结果,这表明IDFT运算可完成OFDM基带调制过程。
而其解调过程可通过离散傅里叶变换(DFT)实现。
因此,OFDM系统的调制和解调过程等效于IDFT和DFT。
在实际应用中,一般用IFFT/FFT来代替IDFT/DFT,这是因为IFFT/FFT 变换与IDFT/DFT变换的作用相同,并且有更高的计算效率,适用于所有的应用系统。
3.OFDM系统的优点和缺点(a)OFDM的优点—1.频谱利用率较高OFDM技术可以被看作是一种调制技术,也可以被当作一种复用技术。
传统的频分复用(FDM)多载波调制技术(如图(a)所示)中各个子载波的频谱是互不重叠的,同时,为了减少各子载波之间的相互干扰,子载波之间需要保留足够的频率间隔,频谱利用率较低;而OFDM多载波调制技术(如图(b)所示)中各子载波的频谱是互相重叠的,并且在整个符号周期内满足正交性,不但减小了子载波间的相互干扰,还大大减少了保护带宽,提高了频谱利用率。
2.抗码间干扰(ISI,Inter-Symbol Interference)能力强码间干扰是数字通信系统中除噪声干扰之外最主要的干扰,它与加性的噪声干扰不同,是一种乘性的干扰。
造成码间干扰的原因有很多,实际上,只要传输信道的频带是有限的,就会造成一定的码间干扰。
OFDM通过在传输的数据块之间插入一个大于信道脉冲响应时间的保护间隔,消除了由于多径时延扩展引起的符号间干扰。
3.抗频率选择性衰落和窄带干扰能力强在单载波系统中,一次衰落或者干扰会导致整个链路失效,但是在多载波系统中,某一时刻只会有少部分的子信道受到深衰落的影响。
OFDM把信息通过多个子载波传输,在每个子载波上的信号时间就相应地比同速率的单载波系统上的信号时间长很多倍,使OFDM对脉冲噪声和信道快速衰落的抵抗力更强。
(b)OFDM的缺点:由于OFDM系统存在多个正交的子载波,而且其输出信号是多个子信道的叠加,因此与单载波系统相比,存在如下缺点:(1)易受频率偏差的影响。
(2)存在较高的峰值平均功率比5调试分析OFDM系统实现模型利用离散反傅里叶变换(IDFT)或快速反傅里叶变换(IFFT)实现的OFDM系统,如图所示。
从OFDM系统的实现模型可以看出,输入已经过调制的复信号经过串/并变换后,进行IDFT或IFFT和并/串变换,然后插入保护间隔,再经过数/模变换后形成OFDM调制后的信号s(t)。
该信号经过信道后,接收到的信号r(t)经过模/数变换,去掉保护间隔,以恢复子载波之间的正交性,再经过串/并变换和DFT或FFT后,恢复出OFDM的调制信号,再经过并/串变换后还原出输入符号。
图中串行输入数据为经过信道编码后的序列,将该序列转换成包含 R 个比特的块,每块再分成N D个组,每个组对应一个子载波。
根据所采用调制方式的不同,每个组包含的比特数可以不同。
设第K 组的比特数为m k则有。
采用ASK、PSK、QAM等调试方式将这m k个比特映射成复值符号。
除了上述经过数据调制的信息符号外,还有NP个不需要经过数据调制的用于同步与信道估计的导频符号,一共有NU = ND + NP组有用数据。
在适当的位置上添加一定数量的零使得总的信息符号个数为刚好大于NU的 2 的整数幂,记为 N,即有N −NU个子信道不用,其上传输的复值符号为 0。
这样处理的目的一方面是为了采用 IFFT/FFT,另一方面是为防止谱外泄。
对于连续的OFDM信号模型,假设系统的总带宽是W ,OFDM 码元周期为Ts,Tg 为保护间隔。
一个 OFDM 基带带码元可以表示为:@式式中的信号以 1/Δ(Δt = T / N )的速率开始采样,所得的N 个样本为:式显然,这N个样值的IDFT,除了系数外完全一样。
由于对每个连续 OFDM 码元采样N 个样本,正好满足 Nyquist 采样定理,所以可以通过这些样值重构原始的连续信号。
这样样值可以通过 IDFT 来得到,这就是用 IDFT 和 DFT 可以实现 OFDM 系统的根源。
OFDM 系统参数及设计公式首先确定信道带宽、信道时延特性和数据传输率这三个参数,在此基础上得到其他几个关键参数。
假设:Rd表示数据传输率,W表示信道带宽,表示信道的最大时延。
这里定义:(1)N sc为一个 OFDM 符号中子载波个数;(2)T为有效码元宽度;3)∆f 为子载波间隔;4)R symbol为 OFDM的符号速率;(5)N total为一个 OFDM 符号含有的采样点数;(6)N FFT为IFFT/FFT 的运算点数;(7)N g为保护间隔含有的点数。
根据推导得到以下关系式:式数据传输率Rd和 OFDM 符号速率的比值表示了一个OFDM 符号传送的比特数,即。
N bit为各个子载波上映射的比特数之和,为了简单起见,假设每个子载波使用一样的编码方式(码率为R c)、一样的调制方案(M进制,每个星座点映射k=log2 M 比特),那么每个子载波上携带的信息比特数n b =k *R c,同时有:n b*N sc =N bit简单的推导,可以得到::式需要注意的是,确定Tg 的大小很关键,它取得越大,就越有利于消除子信道间干扰(ICI)和符号间干扰(ISI),但是Tg 越大的,也会降低频谱利用率,带来发送功率和信息速率的损失,所以限定Tg ≤T / 4 ;其次,通常使用基 2 或者基 4 的 FFT/IFFT 来实现 OFDM 的调制和解调,所以一般限定N FFT∈{64,128,256,512} 。
M进制的 QAM调制(QPSK,16QAM)在取Rsymbol时,要考虑信道的衰落速率,一般的,要求符号速率大于信道衰落速率的 10~20 倍。
综上所述,有以下的一些约束条件:式OFDM基本参数的选择各种OFDM参数的选择就是需要在多项要求冲突中进行折衷考虑。
通常来讲(如前所述),首先要确定三个参数:带宽、比特率以及保护间隔。
按照惯例,保护间隔的时间长度应该为应用移动环境信道下时延均方根值的2~4倍。
主要参数:(1)有用符号持续时间(2)子载波数…(3)调制模式6 测试结果% Faculty of Engineering, University of Fukui. 2003/11/11% coded by Sokthai Chan)% OFDM signal and its spectrum ( Guard Interval insertion )clear all;Fd=1; % symbol rate (1Hz)>Fs=1*Fd; % number of sample per symbolM=4; % kind(range) of symbol (0,1,2,3)Ndata=1024; % all transmitted data symbolSdata=64; % 64 data symbol per frame to ifftSlen=128; % 128 length symbol for IFFTNsym=Ndata/Sdata; % number of frame -> Nsym frameGIlen=144; % symbol with GI insertionGI=16; % guard interval length<% vector initializationX=zeros(Ndata,1);Y1=zeros(Ndata,1);Y2=zeros(Ndata,1);Y3=zeros(Slen,1);z0=zeros(Slen,1);z1=zeros(Ndata/Sdata*Slen,1);g=zeros(GIlen,1);、z2=zeros(GIlen*Nsym,1);z3=zeros(GIlen*Nsym,1);% random integer generation by M kindsX = randint(Ndata, 1, M);% digital symbol mapped as analog symbolY1 = modmap(X, Fd, Fs, 'qask', M);% covert to complex numberY2=amodce(Y1,1,'qam');!for j=1:Nsym;for i=1:Sdata;Y3(i+Slen/2-Sdata/2,1)=Y2(i+(j-1)*Sdata,1); endz0=ifft(Y3);for i=1:Slen;z1(((j-1)*Slen)+i)=z0(i,1);、end%for i=1:Slen;g(i+16)=z0(i,1);endfor i=1:GI;g(i)=z0(i+Slen-GI,1);{endfor i=1:GIlen;z2(((j-1)*GIlen)+i)=g(i,1);endend% graph on time domainfigure(1);》f = linspace(-Sdata,Sdata,length(z1)); plot(f,abs(z1));Y4 = fft(z1);% if Y4 is under Y4=for j=1:Ndata/Sdata*Slen;if abs(Y4(j)) <Y4(j)=;&endendY4 = 10*log10(abs(Y4));% graph on frequency domainfigure(2);f = linspace(-Sdata,Sdata,length(Y4)); plot(f,Y4);axis([-Slen/2 Slen/2 -20 20]);7 参考文献[1]伊泽明,等。