📄 blast_mmse_ic.m
字号:
%for test
clc;
clear all;
Tx_n = 4;
Rx_n = 4;
%SNR_dB = 10;
SNR_dB = -5;%start point + SNR_step
SNR_step = 5;
ff_num = 0;% frame num in every run
index = 6;%for modu index:1/2/4/6 bits per symbol
frame_length = 48;
point = 0;
BER = 1;
while ( BER > 1.0e-004 )
if SNR_dB > 30
break;
end
error_temp = 0;
point = point + 1;
SNR_dB = SNR_dB + SNR_step;
while ( error_temp < 1000 || ff_num > 40000)
ff_num = ff_num + 1;
source = rand(1,Tx_n*frame_length*index)>.5;
%encoder_input = modulation(source, index);
%encoder_input = 2*source - 1;
[encoder_output,Padding_Bit_Length] = vblast_encoder(Tx_n, source);
for t=1:Tx_n
encoder_output_modu(t,:) = modulation(encoder_output(t,:), index);
end
[channel_output,H] = flat_channel(Rx_n, encoder_output_modu);
%keep the signal level at 0 dB
%it means that average of signal module is 1
module_signal = [];
for t=1:Tx_n
module_signal =[ module_signal abs(channel_output(t,:))];
end
signal_level = mean(abs(module_signal).^2);
signal_level_dB = 10*log10(signal_level);
%amplifier_for_SNR_linear = 1/signal_level;
%channel_output = channel_output * amplifier_for_SNR_linear;
if SNR_dB < 50
decoder_input = awgn(channel_output,(SNR_dB + 10*log10(index)),signal_level_dB);
else
decoder_input = channel_output;
end
decoder_output_demodu = vblast_decoder_MMSE_IC(H,decoder_input, index,SNR_dB);%demodulate already
sink = zeros(1,Tx_n*frame_length*index);
%demultiplex
for i = 1:Tx_n
sink(i:Tx_n:end)=decoder_output_demodu(i,:);
end
error_temp = sum(sink ~= source)+error_temp;
end
BER(point) = error_temp/(Tx_n*frame_length*index*ff_num);
ff_num = 0;
end
S = 0:SNR_step:(point-1)*SNR_step;
semilogy(S,BER,'r-*');
grid on;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -