clear
close all
% clc
channel = nrTDLChannel;
channel.Seed = 0;
channel.DelayProfile = "TDL-A";
channel.DelaySpread = 30e-9;
channel.MaximumDopplerShift = 50;
channel.NumTransmitAntennas = 1;
channel.NumReceiveAntennas = 1;
% 采样率与OFDM参数对齐
channel.SampleRate = 30.76e6;
channel.RandomStream = 'mt19937ar with seed'; % 固定随机种子
%% 参数设置
N = 612; % 子载波数量
cp_len = 40;
num_symbols = 14;
mod_order = 16;
% 导频配置
pilot_symbol_indices = [3, 12]; % 导频符号位置(TypeA位置+附加位置)
pilot_interval = 6; % 每组间隔6子载波
pilot_group = [1,2]; % 每组前2子载波为导频
% 生成导频子载波索引(满足:连续2导频 + 间隔4子载波)
pilot_subcarriers = [];
for k = 0:pilot_interval:(N-max(pilot_group))
current_group = k + pilot_group;
pilot_subcarriers = [pilot_subcarriers current_group];
end
pilot_subcarriers = unique(pilot_subcarriers(pilot_subcarriers <= N));
num_pilot_subcarriers = length(pilot_subcarriers);
%% 1. 生成随机数据(排除导频位置)
% 创建数据掩码矩阵
data_mask = true(N, num_symbols);
for i = 1:length(pilot_symbol_indices)
data_mask(pilot_subcarriers, pilot_symbol_indices(i)) = false;
end
total_data_symbols = sum(data_mask(:));
num_bits = total_data_symbols * log2(mod_order);
tx_bits = randi([0 1], num_bits, 1);
%% 2. QAM调制数据
tx_data_symbols = qammod(tx_bits, mod_order, 'InputType', 'bit', 'UnitAveragePower', true);
%% 3. 构建OFDM矩阵并插入导频
tx_symbols_matrix = zeros(N, num_symbols);
tx_symbols_matrix(data_mask) = tx_data_symbols;
% 生成QPSK导频符号
pilot_bits = randi([0 1], 2*num_pilot_subcarriers*length(pilot_symbol_indices), 1);
pilot_symbols = qammod(pilot_bits, 4, 'InputType', 'bit', 'UnitAveragePower', true);
pilot_symbols = reshape(pilot_symbols, num_pilot_subcarriers, []);
% 插入导频到指定位置
for i = 1:length(pilot_symbol_indices)
sym_idx = pilot_symbol_indices(i);
tx_symbols_matrix(pilot_subcarriers, sym_idx) = pilot_symbols(:,i);
end
tx_pilot = pilot_symbols; % 新增:存储发送的导频符号
%% 4. IFFT变换
tx_time = ifft(tx_symbols_matrix, N);
%% 5. 添加循环前缀
tx_with_cp = [tx_time(end-cp_len+1:end, :); tx_time];
%% 6. 并串转换
ofdm_signal = tx_with_cp(:); % 转换为列向量
y=ofdm_signal;%输入信号
y1=channel(y);
% SNR = 20; % 示例SNR值(单位dB)
% y1 = awgn(y1, SNR, 'measured'); % 在卷积后添加噪声
N1 = length(y1); % 信号长度,假设 x 是输入信号
SNR = 10; % 使用训练时的最大SNR
signal_power = mean(abs(y1).^2); % 测量信号实际功率
N0 = sqrt(signal_power/(2*SNR)); % 适用于复高斯噪声
noise = N0*(randn(size(y1)) + 1i*randn(size(y1)))/sqrt(2);
y1 = y1 + noise; % 在信道输出后添加精确控制的高斯噪声
theoretical_ber = berawgn(SNR, 'qam', mod_order);
fprintf('理论误码率: %.4f\n', theoretical_ber);这是第一段代码,两端代码是一个程序