📄 mqam_comp.m
字号:
%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 + -