16QAM-OFDM-调制系统MATLAB

 仿真代码如下


%% =================OFDM仿真参数说明:================
% 
% 子载波数 carrier_count     ---200
% 总符号数 symbol_count      ---100
% IFFT长度 ifft_length       ---512
% 循环前缀 CP_length         ---512/4=128
% 循环后缀 CS_length         ---20
% 升余弦窗系数 alpha         ---7/32
% 调制方式                   QAM16、QPSK 可选
% 多径幅度 mult_path_am      ---[1 0.2 0.1] 
% 多径时延 mutt_path_time    ---[0 20 50]
% ====================仿真过程=======================
% 产生0-1随机序列 => 串并转换 => 映射 => 取共轭、过采样
% => IFFT => 加循环前缀和后缀 => 加窗 => 并串转换 => 
% 多径信道 =>  加AWGN => 串并转换 => 去前缀 => FFT =>
% 下采样 =>  解映射 => 求误码率 
%% ==================================================
clear all;
close all;
carrier_count = 200; % 子载波数
symbol_count = 100;
ifft_length = 512;
CP_length = 128;
CS_length = 20;
rate = [];
ber_rand = [];
SNR =0:1:20;
snr_len = length(SNR);
bit_per_symbol = 4; % 调制方式决定
alpha = 1.5/32;
%% ================产生随机序列=======================
bit_length = carrier_count*symbol_count*bit_per_symbol;
bit_sequence = round(rand(1,bit_length))'; % 列向量

%% ================子载波调制方式1========================
% 1-28置零 29-228有效 229-285置零 286-485共轭 486-512置零
carrier_position = 29:228;
conj_position = 485:-1:286;
bit_moded = qammod(bit_sequence,16,'InputType','bit');

for ii = 1:snr_len

%% =================串并转换==========================
ifft_position = zeros(ifft_length,symbol_count);
bit_moded = reshape(bit_moded,carrier_count,symbol_count);

%% ===================IFFT===========================
ifft_position(carrier_position,:)=bit_moded(:,:);
ifft_position(conj_position,:)=conj(bit_moded(:,:));
signal_time = ifft(ifft_position,ifft_length);


%% ==================加循环前缀和后缀==================
signal_time_C = [signal_time(end-CP_length+1:end,:);signal_time];
signal_time_C = [signal_time_C; signal_time_C(1:CS_length,:)];

%% =======================加窗========================
signal_window = zeros(size(signal_time_C));
% 通过矩阵点乘
signal_window = signal_time_C.*repmat(rcoswindow(alpha,size(signal_time_C,1)),1,symbol_count);

%% ===================发送信号,多径信道====================
signal_Tx = reshape(signal_window,1,[]); % 变成时域一个完整信号,待传输


% ========================加AWGN==========================
  signal_power_sig = var(signal_Tx); % 单径发送加窗信号功率  
    SNR_linear(ii) = 10^(SNR(ii)/10);   
    noise_power_sig(ii) = signal_power_sig/SNR_linear(ii);
    noise_sig = randn(size(signal_Tx))*sqrt(noise_power_sig(ii));
    Rx_data_sig = signal_Tx+noise_sig;

% =======================串并转换==========================
Rx_data_sig = reshape(Rx_data_sig,ifft_length+CS_length+CP_length,[]);
% ====================去循环前缀和后缀======================
Rx_data_sig(1:CP_length,:) = [];
Rx_data_sig(end-CS_length+1:end,:) = [];

% =========================FFT=============================
fft_sig = fft(Rx_data_sig);

% =========================降采样===========================
data_sig = fft_sig(carrier_position,:);

% =========================逆映射===========================
bit_demod_sig = reshape(qamdemod(data_sig,16,'OutputType','bit'),[],1);

% =========================误码率===========================
error_bit_sig(ii) = sum(bit_demod_sig~=bit_sequence);
error_rate_sig(ii) = error_bit_sig(ii)/bit_length;

rate = [rate; error_rate_sig(ii)]
ber_rand = [ber_rand; error_rate_sig(ii)];
end
%% ==========画图=================
figure()
semilogy(SNR,ber_rand,'-r*','Linewidth',2);
xlabel('SNR(dB)');
ylabel('Ber');
grid on
title('16QAM-OFDM-rand');
save('OFDM-16QAM-rand','SNR','ber_rand');
% ==========================================================
% ==========================================================
function window=rcoswindow(alpha,bit_length)
    warning off;
    window = zeros(1,bit_length/2);
    t = 1:bit_length/2;
    T = bit_length/(2*(1+alpha));
    window(t) = 0.5*(1 - sin(pi/(2*alpha*T)*(t-T)));
    window(1:(1-alpha)*T) = 1;
    window=[fliplr(window) window]';
end

 

参考:https://blog.csdn.net/qq_43157190/article/details/103383431

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用16QAM-OFDM接收系统MATLAB仿真代码。其中,选择性合并分集技术用于接收,而AWGN信道用于信道传输。在仿真过程中,我们还计算了理论误码率和误比特率曲线,并将它们与仿真结果进行了比较。 ```matlab clear all; close all; % 设置仿真参数 M = 16; % 16QAM调制 num_carriers = 64; % OFDM子载波数 num_symbols = 1000; % 仿真的OFDM符号数 snr_vec = 0:2:20; % 信噪比向量 % 生成16QAM调制表 qam_table = qammod(0:M-1, M); % 生成OFDM调制器和解调器 ofdm_mod = comm.OFDMModulator('FFTLength', num_carriers, 'NumGuardBandCarriers', [0;0], 'NumSymbols', 1); ofdm_demod = comm.OFDMDemodulator(ofdm_mod); % 初始化误码率和误比特率计数器 ber_vec = zeros(size(snr_vec)); bit_err_vec = zeros(size(snr_vec)); % 开始仿真 for i = 1:length(snr_vec) % 生成AWGN信道 snr = snr_vec(i); channel = comm.AWGNChannel('NoiseMethod', 'Signal to noise ratio (SNR)', 'SNR', snr); % 生成随机OFDM符号序列 data = randi([0, M-1], num_carriers, num_symbols); % 将OFDM符号调制16QAM信号 tx = qam_table(data+1); % 将16QAM信号转换为OFDM符号 tx_ofdm = ofdm_mod(tx); % 传输OFDM符号 rx_ofdm = channel(tx_ofdm); % 接收OFDM符号 rx_qam = ofdm_demod(rx_ofdm); % 应用选择性合并分集技术 rx_qam = select_div(rx_qam); % 将接收到的16QAM信号解调为OFDM符号 rx = qamdemod(rx_qam, M); % 计算误码率和误比特率 [~, ber] = biterr(data(:), rx(:)); ber_vec(i) = ber; bit_err_vec(i) = ber*num_carriers*log2(M); end % 计算理论误码率和误比特率曲线 theory_ber = berawgn(snr_vec, 'qam', M); theory_bit_err = bercoding(snr_vec, 'qam', M, 'hard', 'row'); % 绘制误码率曲线 figure; semilogy(snr_vec, ber_vec, 'b-o', snr_vec, theory_ber, 'r'); grid on; xlabel('SNR (dB)'); ylabel('BER'); legend('Simulation', 'Theory'); % 绘制误比特率曲线 figure; semilogy(snr_vec, bit_err_vec, 'b-o', snr_vec, theory_bit_err, 'r'); grid on; xlabel('SNR (dB)'); ylabel('BER'); legend('Simulation', 'Theory'); % 定义选择性合并分集函数 function [output] = select_div(input) % 计算两个分集分支的信噪比 snr1 = sum(abs(input(:,1)).^2)./sum(abs(input(:,1)-input(:,2)).^2); snr2 = sum(abs(input(:,2)).^2)./sum(abs(input(:,1)-input(:,2)).^2); % 根据信噪比大小选择合并分支 if snr1 > snr2 output = input(:,1); else output = input(:,2); end end ``` 运行此代码将生成误码率和误比特率曲线,并将其与理论曲线进行比较。在AWGN信道下,仿真结果与理论结果非常接近。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值