• 云虹
    了解作者
  • matlab
    开发工具
  • 4KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2020-12-16 21:14
    上传日期
用matlab编写出ofdm信号,包括时域图,星座图等9个图形的仿真
OFDM.zip
  • OFDM
  • qam16.m
    716B
  • demoduqam16.m
    893B
  • rcoswindow.m
    372B
  • Untitled2.m
    7.3KB
内容介绍
clear all; 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/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]); 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);%共轭复数映射 %================================================================= 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); 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 %==============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 %========================生成发送信号,并串变换================================================== 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=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 );%循环前缀与后缀不叠加 发送的信号波形 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行 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,平均相加 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 hold on plot(0:1/IFFT_bin_length:1, -35, 'rd') grid on axis([0 0.5 -40 max(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); 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);%串并变换 end 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('极坐标下的接收信号的星座图') %====================================================================== [M, N]=pol2cart(Rx_phase, Rx_mag); Rx_complex_carrier_matrix = complex(M, N); figure(5); plot(Rx_complex_carrier_matrix,'*r');%XY坐标接收信号的星座图 title('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(6); 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
评论
    相关推荐
    • OFDMMATLAB仿真
      1.使用Matlab实现一个OFDM系统。 OFDM系统具体参数参照LTE标准,具体为: 系统带宽:5MHz; OFDM符号长度:0.0714ms; 子载波间隔:15kHz; CP长度:OFDM符号长度的7 ; FFT点数:512; 2.选择一种降低OFDM系统峰...
    • 基于matlabofdm信号生成.zip
      使用matlab,通过串并转换等步骤产生ofdm信号 输出为windowed_Tx_data
    • ofdm.matlab.rar
      基于ofdm-MIMO的代码仿真程序,包括信道函数,可以使用
    • ofdm符号生成:QPSK子符号的ofdm符号生成-matlab开发
      用于测试 PAPR 降低算法的 QPSK 子符号的 ofdm 符号生成
    • ofdmMatlab源代码设计
      这是一个相对完整的OFDM通信系统的仿真设计,包括编码,调制,IFFT,上下变频,高斯信道建模,FFT,PAPR抑制,各种同步,解调和解码等模块,并统括系统性能的仿真验证了系统设计的可靠性。
    • OFDM系统MATLAB仿真.zip
      压缩包中含OFDM系统的完整仿真程序(MATLAB仿真),可直接运行OFDM.m文件可得到信号在各个阶段的状态波形图,代码注释详细! 还有对应与代码对应的报告文档,详细介绍了OFDM的基本原理及各部分的作用以及程序代码的...
    • OFDMMATLAB代码
      本代码是关于OFDM通信系统的仿真源程序,其中信道编码,QPSK调制,QPSK解调,FFT,IFFT,viterbi编译码,误比特统计,滤波等模块。
    • ofdm_matlab_tx_rx
      demodulation.m depuncture.m Downconverter.m framework_withOFDM.m Hviterbi_zp_3.m 。。。。。。。。
    • OFDM _matlab.zip
      程序包括导频、循环前缀、IFFT、上下变频、信道估计、峰均比抑制等比较全面完整
    • lzw_soft.zip
      lzw压缩解压算法源码