⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpsk_comp.m

📁 使用matlab实现ofdm经过PA后在接收端进行失真抵消算法的仿真
💻 M
字号:
%OFDM参数====================================================================
clear;
%时域符号数
P = 1000;
%子载波数
N = 64;
%PSK调制数
M = 64;
%每个OFDM符号含有的比特数
k = log2(M);
%总共输入的比特数
n = P * N * k;
%采样频率
nsamp = 1;
%过采样需要插入的0的个数
insert_zeros = zeros( N * (nsamp - 1), P );
%SNR起始值
snr_begin = 10;
%SNR范围
snr_range = 10;
%输入信号的时域平均功率
P_in = 1 / ( N * ( nsamp ^ 2 ) );
%削波比
r = 1.2;
%功放门限
A = r * sqrt( P_in );
%衰减因子
a_ideal = 1 - exp( - r ^ 2 ) + sqrt(pi) * r * erfc(r) / 2;   
%迭代次数
iteras = 3;
%对过程的处理
pro = [0, 1, 1];
%1代表有失真,无补偿
%2代表有失真,bussgang补偿
%3代表有失真,额外判决补偿


%OFDM基带调制====================================================================
%产生n个二进制数
x_tx = randint( n, 1 );
%对二进制数每k个为单位进行转换,使其成为MAQM调制的输入符号
%其中reshape是对列进行处理的,bi2de是对行进行2进制到10进制的转换
x_mpsk_in_tx = bi2de( reshape( x_tx, k, n / k )', 'left-msb' ); 
%对MPSK的输入进行调制
x_mpsk_out_tx = modulate( modem.pskmod(M), x_mpsk_in_tx );
%对MPSK的输出每N个为一组进行串并转换,以便进行IFFT
s_tx  = reshape( x_mpsk_out_tx, N, P );
%频域内插0
s_tx_up   = s_tx( 1 : (N / 2), :);                  
s_tx_down = s_tx( (N / 2) + 1 : N, :);
s_tx      = [ s_tx_up; insert_zeros; s_tx_down ];
%进行IFFT运算
b_tx  = ifft( s_tx ); 
%对IFFT运算后的数据进行并串转换
y_tx  = reshape( b_tx, prod(size(b_tx)), 1 );

%OFDM经过PA后的失真信号========================================================
ydis_tx = pa_nonlinear( y_tx, A );

%OFDM无失真基带解调============================================================
for step = 1 : snr_range
  %计算所需的EbNo
  EbNo(step) = snr_begin + step;  
  %根据相应的EbNo转化成相应的SNR
  SNR = EbNo(step) + 10 * log10(k) - 10 * log10(nsamp);
  %根据SNR计算接收端所接收到的数据
  y_noisy = awgn( y_tx, SNR, 'measured' );

  %OFDM信号接收处理
  y_rx = y_noisy;
  %对接收到的数据进行并串转换
  b_rx = reshape( y_rx, nsamp * N, P );
  %进行FFT运算
  s_rx = fft( b_rx );
  %进行去零操作
  s_rx = [ s_rx( 1 : N / 2, : ); s_rx( nsamp * N - N / 2 + 1: nsamp * N, : ) ];
  %对这些数据进行并串转换,作为MPSK解调的输入
  x_mpsk_out_rx = reshape( s_rx, prod(size(s_rx)), 1 );
  %对输入的数据进行解调
  x_mpsk_in_rx = demodulate( modem.pskdemod(M), x_mpsk_out_rx );
  %对解调后的数据还原为原来的二进制位
  x_rx  = reshape( (de2bi(x_mpsk_in_rx, 'left-msb'))', n, 1 );

  %误比特率
  [ e_num, e_rate(step) ] = biterr( x_mpsk_in_tx, x_mpsk_in_rx );
end
%画出误码率曲线
semilogy( EbNo, e_rate, '-or');
grid on;
hold on;

%OFDM失真信号经过信道处理============================================================
for step = 1 : snr_range
  %计算所需的EbNo
  EbNo(step) = snr_begin + step;  
  %根据相应的EbNo转化成相应的SNR
  SNR = EbNo(step) + 10 * log10(k) - 10 * log10(nsamp);
  %根据SNR计算接收端所接收到的数据
  ydis_noisy(:, step) = awgn( ydis_tx, SNR, 'measured' );
end


if pro(1) == 1
%OFDM失真无补偿基带解调=============================================================
for step = 1 : snr_range
  %OFDM信号接收处理
  y_rx = ydis_noisy(:, step);
  %对接收到的数据进行并串转换
  b_rx = reshape( y_rx, nsamp * N, P );
  %进行FFT运算
  s_rx = fft( b_rx );
  %进行去零操作
  s_rx = [ s_rx( 1 : N / 2, : ); s_rx( nsamp * N - N / 2 + 1: nsamp * N, : ) ];
  %对这些数据进行并串转换,作为MPSK解调的输入
  x_mpsk_out_rx = reshape( s_rx, prod(size(s_rx)), 1 );
  %对输入的数据进行解调
  x_mpsk_in_rx = demodulate( modem.pskdemod(M), x_mpsk_out_rx );
  %对解调后的数据还原为原来的二进制位
  x_rx  = reshape( (de2bi(x_mpsk_in_rx, 'left-msb'))', n, 1 );

  %误比特率
  [ e_num, e_rate(step) ] = biterr( x_mpsk_in_tx, x_mpsk_in_rx );
end
%画出误码率曲线
semilogy( EbNo, e_rate, '-xb');
end


if pro(2) == 1
%OFDM失真bussgang后置补偿基带解调=============================================================
for step = 1 : snr_range
  %OFDM信号接收处理
  y_rx = ydis_noisy(:, step);
  %初始化失真信号
  distortion = zeros( size(y_rx) );
  %初始化迭代变量
  y_rx_temp = ( y_rx - distortion ) / a_ideal;
  
  for it = 1 : iteras
    %重新模拟OFDM接收端解调===============================================
    %对接收到的数据进行并串转换
    b_rx = reshape( y_rx_temp, nsamp * N, P );
    %进行FFT运算
    s_rx = fft( b_rx );
    %进行去零操作
    s_rx = [ s_rx( 1 : N / 2, : ); s_rx( nsamp * N - N / 2 + 1: nsamp * N, : ) ];
    %对这些数据进行并串转换,作为MPSK解调的输入
    x_mpsk_out_rx = reshape( s_rx, prod(size(s_rx)), 1 );
    %对输入的数据进行解调
    x_mpsk_in_rx = demodulate( modem.pskdemod(M), x_mpsk_out_rx );
    
    %重新模拟OFDM发送端调制===============================================
    %对MPSK的输入进行调制
    x_mpsk_out_tx = modulate( modem.pskmod(M), x_mpsk_in_rx );
    %对MPSK的输出每N个为一组进行串并转换,以便进行IFFT
    s_tx  = reshape( x_mpsk_out_tx, N, P );
    %频域内插0
    s_tx_up   = s_tx( 1 : (N / 2), :);                  
    s_tx_down = s_tx( (N / 2) + 1 : N, :);
    s_tx      = [ s_tx_up; insert_zeros; s_tx_down ];
    %进行IFFT运算
    b_tx  = ifft( s_tx ); 
    %对IFFT运算后的数据进行并串转换
    y_tx  = reshape( b_tx, prod(size(b_tx)), 1 );
    %OFDM经过PA后的失真信号
    ydis_tx = pa_nonlinear( y_tx, A );
    
    %修改迭代变量==========================================================
    distortion = ydis_tx - a_ideal * y_tx;
    y_rx_temp = ( y_rx - distortion ) / a_ideal;
  end
  
  %获取计算得到的数据
  y_rx = y_rx_temp;
  %对接收到的数据进行并串转换
  b_rx = reshape( y_rx, nsamp * N, P );
  %进行FFT运算
  s_rx = fft( b_rx );
  %进行去零操作
  s_rx = [ s_rx( 1 : N / 2, : ); s_rx( nsamp * N - N / 2 + 1: nsamp * N, : ) ];
  %对这些数据进行并串转换,作为MPSK解调的输入
  x_mpsk_out_rx = reshape( s_rx, prod(size(s_rx)), 1 );
  %对输入的数据进行解调
  x_mpsk_in_rx = demodulate( modem.pskdemod(M), x_mpsk_out_rx );
  %对解调后的数据还原为原来的二进制位
  x_rx  = reshape( (de2bi(x_mpsk_in_rx, 'left-msb'))', n, 1 );

  %误比特率
  [ e_num, e_rate(step) ] = biterr( x_mpsk_in_tx, x_mpsk_in_rx );
end
%画出误码率曲线
semilogy( EbNo, e_rate, '-*c');
end


if pro(3) == 1
%OFDM失真额外判决补偿基带解调=============================================================
for step = 1 : snr_range
  %OFDM信号接收处理
  y_rx = ydis_noisy(:, step);
  %初始化失真信号
  distortion = zeros( size(y_rx) );
  %初始化迭代变量
  y_rx_temp = ( y_rx - distortion ) / a_ideal;
  
  for it = 1 : iteras
    %重新模拟OFDM接收端解调===============================================
    %对接收到的数据进行并串转换
    b_rx = reshape( y_rx_temp, nsamp * N, P );
    %进行FFT运算
    s_rx = fft( b_rx );
    %进行去零操作
    s_rx = [ s_rx( 1 : N / 2, : ); s_rx( nsamp * N - N / 2 + 1: nsamp * N, : ) ];
    %对这些数据进行并串转换,作为MPSK解调的输入
    x_mpsk_out_rx = reshape( s_rx, prod(size(s_rx)), 1 );
    %对输入的数据进行解调
    x_mpsk_in_rx = demodulate( modem.pskdemod(M), x_mpsk_out_rx );
    
    %重新模拟OFDM发送端调制===============================================
    %对MPSK的输入进行调制
    x_mpsk_out_tx = modulate( modem.pskmod(M), x_mpsk_in_rx );
    %对MPSK的输出每N个为一组进行串并转换,以便进行IFFT
    s_tx  = reshape( x_mpsk_out_tx, N, P );
    %频域内插0
    s_tx_up   = s_tx( 1 : (N / 2), :);                  
    s_tx_down = s_tx( (N / 2) + 1 : N, :);
    s_tx      = [ s_tx_up; insert_zeros; s_tx_down ];
    %进行IFFT运算
    b_tx  = ifft( s_tx ); 
    %对IFFT运算后的数据进行并串转换
    y_tx  = reshape( b_tx, prod(size(b_tx)), 1 );
    
    %修改迭代变量=========================================================
    for its = 1 : length( y_tx )
      if abs(y_tx(its)) >= A
        y_rx_temp(its) = y_tx(its);
      end
    end
  end
  
  %获取计算得到的数据
  y_rx = y_rx_temp;
  %对接收到的数据进行并串转换
  b_rx = reshape( y_rx, nsamp * N, P );
  %进行FFT运算
  s_rx = fft( b_rx );
  %进行去零操作
  s_rx = [ s_rx( 1 : N / 2, : ); s_rx( nsamp * N - N / 2 + 1: nsamp * N, : ) ];
  %对这些数据进行并串转换,作为MPSK解调的输入
  x_mpsk_out_rx = reshape( s_rx, prod(size(s_rx)), 1 );
  %对输入的数据进行解调
  x_mpsk_in_rx = demodulate( modem.pskdemod(M), x_mpsk_out_rx );
  %对解调后的数据还原为原来的二进制位
  x_rx  = reshape( (de2bi(x_mpsk_in_rx, 'left-msb'))', n, 1 );

  %误比特率
  [ e_num, e_rate(step) ] = biterr( x_mpsk_in_tx, x_mpsk_in_rx );
end
%画出误码率曲线
semilogy( EbNo, e_rate, '-^k');
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -