%% LS信道估计 与 MMSE均衡 for i_ofdm = 1:Nofdm % LS信道估计 LS_est(:,i_ofdm) = rsig_freq(pilot_loc,i_ofdm)./pilot; H_LS(:,i_ofdm) = interpolate(LS_est(:,i_ofdm),pilot_loc,Nfft,'spline'); % Linear/Spline interpolation %MMSE均衡 H_mmse(:,i_ofdm) = conj(H_LS(:,i_ofdm))./((abs(H_LS(:,i_ofdm))).^2 + noise_var); rsig_equal = rsig_freq.*H_mmse; end dsym_no_est = rsig_freq(data_loc,:); % 没有信道估计 dsym = rsig_equal(data_loc,:); % 去除导频,直流子载波和空子载波 %% 解调 dmsg_no_est = qamdemod(dsym_no_est, M, 'UnitAveragePower', true, 'OutputType', 'bit'); % 没有信道估计 dmsg = qamdemod(dsym, M, 'UnitAveragePower', true, 'OutputType', 'bit'); 是什么意思
时间: 2024-04-02 07:35:19 浏览: 39
这段代码是对接收到的OFDM信号进行LS信道估计和MMSE均衡,并进行解调。首先,LS信道估计使用导频信号和接收到的OFDM符号计算信道的频域响应。然后,使用线性/样条插值将估计的频率响应插值到所有子载波处。接下来,使用MMSE均衡器通过估计的频率响应对接收到的信号进行均衡,得到均衡后的OFDM符号。最后,使用解调器将均衡后的OFDM符号解调为比特流。其中,代码中还分别计算了没有进行信道估计的OFDM符号解调结果,以便进行比较。
相关问题
SNRdB = 0:5:30; num_runs = zeros(1,length(SNRdB));%发送次数 bernum_no_est = zeros(1,length(SNRdB));%错误比特数 ber_no_est = zeros(1,length(SNRdB));%误码率 blenum = zeros(1,length(SNRdB));%错误块数 bernum = zeros(1,length(SNRdB));%错误比特数 ber = zeros(1,length(SNRdB));%误码率 LS_est = zeros(length(pilot),Nofdm); % 导频信道 H_LS = zeros(Nfft,Nofdm); % 估计信道 H_mmse = zeros(Nfft,Nofdm); rsig_equal = zeros(Nfft,Nofdm); dsym = zeros(Nused,Nofdm); dsym_no_est = zeros(Nused,Nofdm); dmsg_no_est = zeros(Nused*log2(M),Nofdm); dmsg = zeros(Nused*log2(M),Nofdm); tic for ii = 1:length(SNRdB) for i_run = 1 : max_runs if mod(i_run, max_runs/resolution) == 1 disp(['Simualtion Running = ' num2str(i_run/max_runs)]) disp(['SNRdB = ' num2str(SNRdB(ii))]); disp(['blenum = ' num2str(blenum(ii))]); disp(['num_runs = ' num2str(num_runs(ii))]); disp(['ber = ' num2str(ber(ii))]); end什么意思?
这段代码是一个用于模拟无线通信系统的程序。它将会模拟在不同信噪比下的通信情况。具体来说,程序中的变量SNRdB是信噪比的取值范围,max_runs是每个信噪比下模拟的发送次数。程序将会统计每个信噪比下的误码率、错误比特数、错误块数等性能指标,并将其存储在对应的变量中。程序中还包含了信道估计和信道均衡的过程,以及用于数据传输的调制解调过程。最后,程序中的tic和toc函数用于计算程序的运行时间。
clear all; close all; clc;ticits_option = 2;noise_option = 1;raw_bit_len = 2592-6;interleaving_num = 72;deinterleaving_num = 72;N_frame = 1e4;SNRdBs = [0:2:20];sq05 = sqrt(0.5);bits_options = [0, 1, 2]; % 三种bits-option情况obe_target = 500;BER_target = 1e-3;for i_bits = 1:length(bits_options) bits_option = bits_options(i_bits); BER = zeros(size(SNRdBs)); for i_SNR = 1:length(SNRdBs) sig_power = 1; SNRdB = SNRdBs(i_SNR); sigma2 = sig_power * 10^(-SNRdB/10); sigma = sqrt(sigma2/2); nobe = 0; for i_frame = 1:N_frame switch bits_option case 0 bits = zeros(1, raw_bit_len); case 1 bits = ones(1, raw_bit_len); case 2 bits = randi([0,1], 1, raw_bit_len); end encoding_bits = convolution_encoder(bits); interleaved = []; for i = 1:interleaving_num interleaved = [interleaved encoding_bits([i:interleaving_num:end])]; end temp_bit = []; for tx_time = 1:648 tx_bits = interleaved(1:8); interleaved(1:8) = []; QAM16_symbol = QAM16_mod(tx_bits, 2); x(1,1) = QAM16_symbol(1); x(2,1) = QAM16_symbol(2); if rem(tx_time - 1, 81) == 0 H = sq05 * (randn(2,2) + j * randn(2,2)); end y = H * x; if noise_option == 1 noise = sigma * (randn(2,1) + j * randn(2,1)); y = y + noise; end W = inv(H' * H + sigma2 * diag(ones(1,2))) * H'; K_tilde = W * y; x_hat = QAM16_slicer(K_tilde, 2); temp_bit = [temp_bit QAM16_demapper(x_hat, 2)]; end deinterleaved = []; for i = 1:deinterleaving_num deinterleaved = [deinterleaved temp_bit([i:deinterleaving_num:end])]; end received_bit = Viterbi_decode(deinterleaved); for EC_dummy = 1:1:raw_bit_len if nobe >= obe_target break; end if received_bit(EC_dummy) ~= bits(EC_dummy) nobe = nobe + 1; end end if nobe >= obe_target break; end end BER(i_SNR) = nobe / (i_frame * raw_bit_len); fprintf('bits-option: %d, SNR: %d dB, BER: %1.4f\n', bits_option, SNRdB, BER(i_SNR)); end figure; semilogy(SNRdBs, BER); xlabel('SNR (dB)'); ylabel('BER'); title(['Bits-Option: ', num2str(bits_option)]); grid on;end注释这段matlab代码
这是一段 Matlab 代码,以下是对其的注释:
```
% 清空所有变量、关闭所有图形窗口、清空命令行窗口、开始计时
clear all; close all; clc; tic
% 设置模拟参数
its_option = 2; % 暂时不知道其含义
noise_option = 1; % 噪声选项,1表示添加高斯白噪声,0表示不添加
raw_bit_len = 2592-6; % 原始比特长度,不包括尾部比特
interleaving_num = 72; % 扰码器长度
deinterleaving_num = 72; % 解扰码器长度
N_frame = 1e4; % 帧数
SNRdBs = [0:2:20]; % 信噪比范围
sq05 = sqrt(0.5); % sqrt(0.5)的值
bits_options = [0, 1, 2]; % 三种bits-option情况
obe_target = 500; % 最大误比特数目
BER_target = 1e-3; % 误比特率目标
% 循环处理三种bits-option情况
for i_bits = 1:length(bits_options)
bits_option = bits_options(i_bits);
BER = zeros(size(SNRdBs)); % 初始化误比特率
for i_SNR = 1:length(SNRdBs)
sig_power = 1; % 信号功率
SNRdB = SNRdBs(i_SNR); % 当前信噪比
sigma2 = sig_power * 10^(-SNRdB/10); % 方差
sigma = sqrt(sigma2/2); % 标准差
nobe = 0; % 误比特数目
for i_frame = 1:N_frame
switch bits_option
case 0
bits = zeros(1, raw_bit_len);
case 1
bits = ones(1, raw_bit_len);
case 2
bits = randi([0,1], 1, raw_bit_len);
end
encoding_bits = convolution_encoder(bits); % 卷积编码
% 扰码器
interleaved = [];
for i = 1:interleaving_num
interleaved = [interleaved encoding_bits([i:interleaving_num:end])];
end
temp_bit = [];
for tx_time = 1:648
tx_bits = interleaved(1:8);
interleaved(1:8) = [];
QAM16_symbol = QAM16_mod(tx_bits, 2); % 16QAM调制
x(1,1) = QAM16_symbol(1);
x(2,1) = QAM16_symbol(2);
if rem(tx_time - 1, 81) == 0 % 每81个时隙变化一次信道
H = sq05 * (randn(2,2) + j * randn(2,2));
end
y = H * x; % 信道传输
if noise_option == 1 % 添加高斯白噪声
noise = sigma * (randn(2,1) + j * randn(2,1));
y = y + noise;
end
W = inv(H' * H + sigma2 * diag(ones(1,2))) * H'; % MMSE检测
K_tilde = W * y;
x_hat = QAM16_slicer(K_tilde, 2); % 16QAM解调
temp_bit = [temp_bit QAM16_demapper(x_hat, 2)]; % 16QAM解调映射
end
% 解扰码器
deinterleaved = [];
for i = 1:deinterleaving_num
deinterleaved = [deinterleaved temp_bit([i:deinterleaving_num:end])];
end
received_bit = Viterbi_decode(deinterleaved); % Viterbi译码
% 统计误比特数目
for EC_dummy = 1:1:raw_bit_len
if nobe >= obe_target
break;
end
if received_bit(EC_dummy) ~= bits(EC_dummy)
nobe = nobe + 1;
end
end
if nobe >= obe_target
break;
end
end
BER(i_SNR) = nobe / (i_frame * raw_bit_len); % 计算误比特率
fprintf('bits-option: %d, SNR: %d dB, BER: %1.4f\n', bits_option, SNRdB, BER(i_SNR));
end
% 画图
figure;
semilogy(SNRdBs, BER);
xlabel('SNR (dB)');
ylabel('BER');
title(['Bits-Option: ', num2str(bits_option)]);
grid on;
end
% 结束计时
toc
```
注释解释:
- `%` 表示单行注释,用于注释代码的某一行。
- `clear all; close all; clc; tic` 表示清空所有变量、关闭所有图形窗口、清空命令行窗口、开始计时。
- `its_option = 2;` 表示设置模拟参数 `its_option`,但是没有注释说明其具体含义。
- `noise_option = 1;` 表示设置噪声选项,`1` 表示添加高斯白噪声,`0` 表示不添加。
- `raw_bit_len = 2592-6;` 表示设置原始比特长度,不包括尾部比特。
- `interleaving_num = 72;` 表示设置扰码器长度。
- `deinterleaving_num = 72;` 表示设置解扰码器长度。
- `N_frame = 1e4;` 表示设置帧数。
- `SNRdBs = [0:2:20];` 表示设置信噪比范围。
- `sq05 = sqrt(0.5);` 表示设置 sqrt(0.5) 的值。
- `bits_options = [0, 1, 2];` 表示设置三种 `bits-option` 情况。
- `obe_target = 500;` 表示设置最大误比特数目。
- `BER_target = 1e-3;` 表示设置误比特率目标。
- `for i_bits = 1:length(bits_options)` 开始循环处理三种 `bits-option` 情况。
- `switch bits_option` 根据 `bits-option` 的值选择不同的情况。
- `QAM16_symbol = QAM16_mod(tx_bits, 2);` 表示进行 16QAM 调制。
- `if rem(tx_time - 1, 81) == 0` 表示每 81 个时隙变化一次信道。
- `if noise_option == 1` 表示添加高斯白噪声。
- `x_hat = QAM16_slicer(K_tilde, 2);` 表示进行 16QAM 解调。
- `temp_bit = [temp_bit QAM16_demapper(x_hat, 2)];` 表示进行 16QAM 解调映射。
- `received_bit = Viterbi_decode(deinterleaved);` 表示进行 Viterbi 译码。
- `BER(i_SNR) = nobe / (i_frame * raw_bit_len);` 表示计算误比特率。
- `semilogy(SNRdBs, BER);` 表示画图,使用对数坐标轴。
- `toc` 表示结束计时。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)