0

所以这是我的代码,我在其中尝试在 AWGN 通道中使用 BPSK 调制获得软判决 Vitrebi 解码的 BER,码率为 1/3:

输入大小 = 400;

terminate_length = 3;
total_input_size = 403;
kin = 1;
n = 3;
v = 3;
total_states = 2^v;
current_state = 0;
SNR = 1:1:12;
% Data generation
data = [randi([0 1], 12, input_size), zeros(12, terminate_length)];
% BPSK Modulation
% Decoder
temp_reg = randn(12, 1209);
trellis_poly = poly2trellis(4, {'x3 + x2 + 1', 'x3 + x + 1', 'x3 + 1'});
for i = 1:length(SNR)
    % Add noise
    codeword(i,:) = convenc(data(i,:),trellis_poly);
    codeword_bpsk(i,:) = codeword(i,:) * 2 -1;
    corrupted_codeword(i, :) = sqrt(0.5*(1./SNR(i)))*codeword_bpsk(i, :) + temp_reg(i, :);
    decoded(i,:) = vitdec(corrupted_codeword(i, :), trellis_poly, 3, 'term', 'unquant');
    BER(i) = biterr(data(i, 1:end-3),decoded(i,3+1:end))/403;
end

输入大小为 400 位 + 3 位以返回状态 0。因此我生成 12x403 数据位。我定义了格子多项式并开始 for 循环。

对于从 1 到 12 的每个 SNR 值,我对数据进行卷积编码,将其转换为 BPSK,然后添加噪声。这是通过将自定义方差乘以数据并添加一些从正态分布中提取的噪声来完成的。

然后我使用我的格子多项式对其进行解码corrupted_codeword,回溯长度为 3,因为这是返回状态 0 所需的最大位数。术语意味着它应该在状态 0 处终止,从示例中我看到 MATLAB 用于'unquant'软解码. 我知道你可以使用'soft',但这只能让你使用我不太理解的正整数,因为我认为软解码的全部意义在于你可以使用任何类型的值使用 Vitrebi 经济地做到这一点。

无论如何,然后我计算原始数据和解码数据之间的位错误数,不包括尾随位,因此1:end-3,然后除以位数。但是,对于每个 SNR 值,我得到的误码率大约为 0.5,这显然是不正确的。我尝试将 403 更改为 400 以解决丢失的尾随位,但这没有区别。如果我也尝试只是做data(i,:),我仍然会得到同样的东西decoded(i,:)biterr我不太明白哪里出了问题,因为我使用的是 MATLAB 的内置函数,而且解码的数据看起来也是正确的,因为它们以对应于状态 0 的数据开始和终止,但它与实际数据不匹配.

4

0 回答 0