Skip to content

Commit c4db094

Browse files
author
Alex
committed
Changed simulator structure. Config file.
1 parent 7548096 commit c4db094

4 files changed

Lines changed: 113 additions & 67 deletions

File tree

config.m

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,35 @@
11
timestamp = [num2str(start_time(1),'%04d') '_' num2str(start_time(2),'%02d') '_' num2str(start_time(3),'%02d') '_' num2str(start_time(4),'%02d') '_' num2str(start_time(5),'%02d') '_' num2str(start_time(6),'%2.0f')];
22
result_path = './results/';
33
addpath('support');
4-
fast_run = 1; %1:run of optimal-matlab code, 0:run of hardware-code (suboptimal f/g)
4+
%% Configure parameters
5+
%Polar-Code values
6+
capacity = 0.5; %I(W), Channel's W Capacity
7+
n_values = [4,5,6,7,8,9,10]; %value of N
8+
code_rate = 1/4;
9+
%EbNo
10+
EbNo_dB = 0:5; %AWGN -4:2 %Fading 0:2:10
11+
%Channel
512
Fading_Channel = 0; %0: AWGN, 1:Fading Channel
13+
%fading only parameters
614
Fading_Independent = 0; %if Fading_Channel = 1
715
quasi = 0; % quasi channel
816
fading_channel = 'TU120'; %custom matlab channel
17+
918
fix_seed = 1; %1:fix data, 0:random data
10-
code_rate = 1/4;
1119
if fix_seed
1220
rng(sum(100*clock));
1321
else
1422
rand('seed',123456);
1523
end
1624
%Simulation values
17-
min_fer_errors = 100;
18-
min_codewords = 100;
19-
NbitsPerSymbol = 1;
20-
constDims = 1;
21-
%EbNo
22-
EbNo_dB = -2:4;
25+
fast_run = 1; %1:run of optimal-matlab code, 0:run of hardware-code (suboptimal f/g)
26+
min_fer_errors = 100; %minimum frame errors to count
27+
min_codewords = 100; %minimum codewords to count
28+
NbitsPerSymbol = 1; %modulation parameter
29+
constDims = 1; %modulation parameter
2330
snrdb_values =EbNo_dB+10*log10(double(code_rate*NbitsPerSymbol*2/constDims));
24-
%Polar-Code values
25-
capacity = 0.5; %I(W), Channel's W Capacity
31+
%% Variable Initializations
32+
bit_error_rate = zeros(length(n_values),length(snrdb_values));
33+
fer_error_rate = zeros(length(n_values),length(snrdb_values));
34+
legends = strings(1,length(n_values));
35+
codewords = zeros(1,length(snrdb_values));

main.m

Lines changed: 54 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,57 @@
1-
clc;clear;
1+
clc;clear all;
22
start_time = clock;
33
config;
4-
for n = [7,8,9,10] %N=2^n
5-
N = power(2,n); %Code Length
6-
K = N* code_rate; %Code keyword length
7-
mat_file = [result_path 'polar_N' num2str(N) '_K' num2str(K) '_' timestamp '.mat'];
8-
bit_error_rate = zeros(1,length(snrdb_values));
9-
fer_error_rate = zeros(1,length(snrdb_values));
10-
codewords = zeros(1,length(snrdb_values));
11-
%Polar-code initializations
12-
Fn = fkronecker(N);
13-
frozen_bits = initialize_frozen_bits(N,K,capacity); %0=frozen, 1=not_frozen
14-
partial_sum_adders = partial_sums_initialize(N); %!!!!! NOT bit_reversed array -- %outputs(z,i,l) -- l stage ,bit Ui is added,z is the number of g adder
15-
[sc_functions,sc_2nd_indxs] = sc_array_initialize(N);
16-
for i_index = 1:length(snrdb_values) %[0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5]
17-
%Initialize temporary variables
18-
codewords_tmp = 0;
19-
fer_errors = 0;
20-
bit_errors = 0;
21-
snr = snrdb_values(i_index);
22-
while (fer_errors<min_fer_errors || codewords_tmp<min_codewords)
23-
codewords_tmp = codewords_tmp + 1;
24-
inputs = rand(1,K)>0.5; %write random inputs
25-
%transform inputs
26-
inputs_to_encode = transform_inputs(inputs,frozen_bits,N);
27-
%encode
28-
encoded_inputs = encode(inputs_to_encode,Fn); %Reversed Polar Encoding
29-
%modulate
30-
modulated_inputs = modulate(encoded_inputs);%encoded_inputs); %BPSK = 1-2*encoded_inputs(i)
31-
%noise
32-
noised_inputs = add_noise(modulated_inputs,constDims,Fading_Channel,Fading_Independent,fading_channel,snrdb_values(i_index));
33-
%demodulate
34-
llr = (2 * power(10,snrdb_values(i_index)/10))*noised_inputs; %CARE NEGATIVE SIGN.2*yi/(s^2) = ln(Li), s^2 = 1/ 10^ (SNRdb/10)
35-
%decode
36-
if(fast_run)
37-
%optimal version (optimal-calculations of f/g)
38-
outputs = decode2(llr,frozen_bits);
39-
else
40-
%hardware-version (suboptimal-calculations of f/g)
41-
outputs = decode(llr,frozen_bits,partial_sum_adders,sc_functions,sc_2nd_indxs);
4+
%% N LOOP
5+
for index_n = 1:length(n_values) %N=2^n
6+
N = power(2,n_values(index_n)); %Code Length
7+
K = N* code_rate; %Code keyword length
8+
mat_file = [result_path 'polar_N' num2str(N) '_K' num2str(K) '_' timestamp '.mat'];
9+
%Polar-code initializations
10+
[Fn,frozen_bits,partial_sum_adders, sc_functions, sc_2nd_indxs] = polar_initialization(N, K, capacity);
11+
fprintf("Polar Code %d/%d running:\n",N,K);
12+
%% SNR LOOP
13+
for i_index = 1:length(snrdb_values)
14+
%Initialize temporary variables
15+
codewords_tmp = 0;fer_errors = 0;bit_errors = 0;
16+
snr = snrdb_values(i_index);
17+
while (fer_errors<min_fer_errors || codewords_tmp<min_codewords)
18+
codewords_tmp = codewords_tmp + 1;
19+
inputs = rand(1,K)>0.5; %write random inputs
20+
%transform inputs
21+
inputs_to_encode = transform_inputs(inputs,frozen_bits,N);
22+
%encode
23+
encoded_inputs = encode(inputs_to_encode,Fn); %Reversed Polar Encoding
24+
%modulate
25+
modulated_inputs = modulate(encoded_inputs);%encoded_inputs); %BPSK = 1-2*encoded_inputs(i)
26+
%noise
27+
noised_inputs = add_noise(modulated_inputs,constDims,Fading_Channel,Fading_Independent,fading_channel,snrdb_values(i_index));
28+
%demodulate
29+
llr = (2 * power(10,snrdb_values(i_index)/10))*noised_inputs; %CARE NEGATIVE SIGN.2*yi/(s^2) = ln(Li), s^2 = 1/ 10^ (SNRdb/10)
30+
%decode
31+
if(fast_run)
32+
%optimal version (optimal-calculations of f/g)
33+
outputs = decode2(llr,frozen_bits);
34+
else
35+
%hardware-version (suboptimal-calculations of f/g)
36+
outputs = decode(llr,frozen_bits,partial_sum_adders,sc_functions,sc_2nd_indxs); %or decode2(llr,frozen_bits); for the other algorithm
37+
end
38+
%Calculate temporary bit/frame errors
39+
final_outputs = transform_outputs(outputs,frozen_bits,N);
40+
temp_bit_errors = size(find(final_outputs ~= inputs),2);
41+
bit_errors = bit_errors + temp_bit_errors;
42+
fer_errors = fer_errors + (temp_bit_errors>0);
43+
end
44+
%Calculate snr bit/frame errors
45+
bit_error_rate(index_n,i_index) = bit_errors/(codewords_tmp*K);
46+
fer_error_rate(index_n,i_index) = fer_errors/(codewords_tmp);
47+
codewords(index_n,i_index) = codewords_tmp;
48+
legends(index_n) = [num2str(N), '/', num2str(K)];
49+
%Update plot figures
50+
%Save results for particular n & snr
51+
save(mat_file,'snrdb_values','EbNo_dB','bit_error_rate','fer_error_rate','codewords','N','K','Fading_Channel','Fading_Independent','fading_channel');
52+
%Display
53+
fprintf('EbNo = %.1f\tber=%0.5f,fer=%0.5f\n',EbNo_dB(i_index),bit_error_rate(index_n,i_index),fer_error_rate(index_n,i_index));
54+
end
55+
% file = fopen([result_path 'results_N=' num2str(N) '_SNR=' num2str(snrdb_values(1)) '-' num2str(snrdb_values(end)) '.txt'],'w');
4256
end
43-
%or decode(llr,frozen_bits); for the other algorithm
44-
%choose A set (not frozen bits)
45-
%Calculate bit/frame errors
46-
final_outputs = transform_outputs(outputs,frozen_bits,N);
47-
temp_bit_errors = size(find(final_outputs ~= inputs),2);
48-
bit_errors = bit_errors + temp_bit_errors;
49-
fer_errors = fer_errors + (temp_bit_errors>0);
50-
end
51-
bit_error_rate(i_index) = bit_errors/(codewords_tmp*K);
52-
fer_error_rate(i_index) = fer_errors/(codewords_tmp);
53-
codewords(i_index) = codewords_tmp;
54-
save(mat_file,'snrdb_values','bit_error_rate','fer_error_rate','codewords','N','K');
55-
fprintf('SNRdb = %.1f\tber=%0.2f,fer=%0.2f\n',snrdb_values(i_index),bit_error_rate(i_index),fer_error_rate(i_index));
56-
end
57-
% file = fopen([result_path 'results_N=' num2str(N) '_SNR=' num2str(snrdb_values(1)) '-' num2str(snrdb_values(end)) '.txt'],'w');
58-
% fprintf(file,'0]\n');
59-
end
60-
57+
plot_script;

support/plot_script.m

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
% % draw the BER vs Eb/N0 plot
2+
if(Fading_Channel)
3+
channel_str = 'Fading';
4+
else
5+
channel_str = 'AWGN';
6+
end
7+
figure(1)
8+
semilogy(EbNo_dB(1:length(find(bit_error_rate(index_n,:) ~= 0))), bit_error_rate(:,1:length(find(bit_error_rate(index_n,:) ~= 0))),'LineWidth', 2, 'MarkerSize',10);
9+
% axis([EbNo_dB(1) EbNo_dB(length(find(BER_list_1 ~= 0))) min(min(BER_list_1((BER_list_1 ~= 0))),min(BER_list_2((BER_list_2 ~= 0)))) max(max(BER_list_2((BER_list_1 ~= 0))),max(BER_list_1((BER_list_2 ~= 0))))])
10+
hold on;
11+
xlabel('Eb/N0 [dB]');
12+
ylabel('BER');
13+
14+
title(['Polar codes ,' channel_str]);
15+
if(index_n == length(legends))
16+
legend(legends,'Location','SouthWest');
17+
end
18+
grid on;
19+
% % draw the FER vs Eb/N0 plot
20+
figure(2)
21+
semilogy(EbNo_dB(1:length(find(fer_error_rate(index_n,:) ~= 0))), fer_error_rate(:,1:length(find(fer_error_rate(index_n,:) ~= 0))),'LineWidth', 2, 'MarkerSize',10);
22+
% axis([EbNo_dB(1) EbNo_dB(length(find(FER_list_1 ~= 0))) min(min(FER_list_1((FER_list_1 ~= 0))),min(FER_list_2((FER_list_2 ~= 0)))) max(max(FER_list_2((FER_list_1 ~= 0))),max(FER_list_1((FER_list_2 ~= 0))))])
23+
hold on;
24+
xlabel('Eb/N0 [dB]');
25+
ylabel('FER');
26+
title(['Polar codes ,' channel_str]);
27+
if(index_n == length(legends))
28+
legend(legends,'Location','SouthWest');
29+
end
30+
grid on;

support/polar_initialization.m

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
function [ Fn,frozen_bits,partial_sum_adders, sc_functions, sc_2nd_indxs] = polar_initialization( N, K, capacity )
2+
%POLAR_INITIALIZATION Summary of this function goes here
3+
% Detailed explanation goes here
4+
Fn = fkronecker(N);
5+
frozen_bits = initialize_frozen_bits(N,K,capacity); %0=frozen, 1=not_frozen
6+
partial_sum_adders = partial_sums_initialize(N); %!!!!! NOT bit_reversed array -- %outputs(z,i,l) -- l stage ,bit Ui is added,z is the number of g adder
7+
[sc_functions,sc_2nd_indxs] = sc_array_initialize(N);
8+
end
9+

0 commit comments

Comments
 (0)