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

📄 mqam_comp.m

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

%OFDM基带调制====================================================================
%产生n个二进制数
x_tx = randint( n, 1 );
%对二进制数每k个为单位进行转换,使其成为MAQM调制的输入符号
%其中reshape是对列进行处理的,bi2de是对行进行2进制到10进制的转换
x_maqm_in_tx = bi2de( reshape( x_tx, k, n / k )', 'left-msb' );
%对MQAM的输入进行调制
x_maqm_out_tx = modulate( modem.qammod(M), x_maqm_in_tx );
%对MQAM的输出每N个为一组进行串并转换,以便进行IFFT
s_tx  = reshape( x_maqm_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' );
  %计算所产生的高斯白噪声
  noise(:, step) = y_noisy - y_tx;

  %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, : ) ];
  %对这些数据进行并串转换,作为MQAM解调的输入
  x_maqm_out_rx = reshape( s_rx, prod(size(s_rx)), 1 );
  %对输入的数据进行解调
  x_maqm_in_rx = demodulate( modem.qamdemod(M), x_maqm_out_rx );
  %对解调后的数据还原为原来的二进制位
  x_rx  = reshape( (de2bi(x_maqm_in_rx, 'left-msb'))', n, 1 );

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

%OFDM失真信号经过信道处理============================================================
for step = 1 : snr_range
  %加上AWGN信道
  ydis_noisy(:, step) = ydis_tx + noise(:, step);
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, : ) ];
    %对这些数据进行并串转换,作为MQAM解调的输入
    x_maqm_out_rx = reshape( s_rx, prod(size(s_rx)), 1 );
    %对输入的数据进行解调
    x_maqm_in_rx = demodulate( modem.qamdemod(M), x_maqm_out_rx );
    %对解调后的数据还原为原来的二进制位
    x_rx  = reshape( (de2bi(x_maqm_in_rx, 'left-msb'))', n, 1 );
  
    %误比特率
    [ e_num, e_rate(step) ] = biterr( x_maqm_in_tx, x_maqm_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, : ) ];
      %对这些数据进行并串转换,作为MQAM解调的输入
      x_maqm_out_rx = reshape( s_rx, prod(size(s_rx)), 1 );
      %对输入的数据进行解调
      x_maqm_in_rx = demodulate( modem.qamdemod(M), x_maqm_out_rx );
      
      %重新模拟OFDM发送端调制===============================================
      %对MQAM的输入进行调制
      x_maqm_out_tx = modulate( modem.qammod(M), x_maqm_in_rx );
      %对MQAM的输出每N个为一组进行串并转换,以便进行IFFT
      s_tx  = reshape( x_maqm_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, : ) ];
    %对这些数据进行并串转换,作为MQAM解调的输入
    x_maqm_out_rx = reshape( s_rx, prod(size(s_rx)), 1 );
    %对输入的数据进行解调
    x_maqm_in_rx = demodulate( modem.qamdemod(M), x_maqm_out_rx );
    %对解调后的数据还原为原来的二进制位
    x_rx  = reshape( (de2bi(x_maqm_in_rx, 'left-msb'))', n, 1 );
  
    %误比特率
    [ e_num, e_rate(step) ] = biterr( x_maqm_in_tx, x_maqm_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);

⌨️ 快捷键说明

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