summaryrefslogtreecommitdiff
path: root/viterbi_generator/utils/lower_utils
diff options
context:
space:
mode:
Diffstat (limited to 'viterbi_generator/utils/lower_utils')
-rw-r--r--viterbi_generator/utils/lower_utils/equations_gen.m124
-rw-r--r--viterbi_generator/utils/lower_utils/generate_increment.m72
-rw-r--r--viterbi_generator/utils/lower_utils/lower_utils/complex_vect2number.m44
-rw-r--r--viterbi_generator/utils/lower_utils/lower_utils/generate_previous.m35
-rw-r--r--viterbi_generator/utils/lower_utils/lower_utils/make_symbols.m35
5 files changed, 310 insertions, 0 deletions
diff --git a/viterbi_generator/utils/lower_utils/equations_gen.m b/viterbi_generator/utils/lower_utils/equations_gen.m
new file mode 100644
index 0000000..af7d37e
--- /dev/null
+++ b/viterbi_generator/utils/lower_utils/equations_gen.m
@@ -0,0 +1,124 @@
+function [increment, pm_candidates_imag, pm_candidates_real]= equations_gen(Lh)
+
+ ###########################################################################
+ # Copyright (C) 2008 by Piotr Krysik #
+ # pkrysik@stud.elka.pw.edu.pl #
+ # #
+ # This program is free software; you can redistribute it and/or modify #
+ # it under the terms of the GNU General Public License as published by #
+ # the Free Software Foundation; either version 3 of the License, or #
+ # (at your option) any later version. #
+ # #
+ # This program is distributed in the hope that it will be useful, #
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of #
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+ # GNU General Public License for more details. #
+ # #
+ # You should have received a copy of the GNU General Public License #
+ # along with this program; if not, write to the #
+ # Free Software Foundation, Inc., #
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+ ###########################################################################
+
+INCREMENT_NUM=2**(Lh-1);
+
+SYMBOLS = make_symbols(Lh);
+PREVIOUS = generate_previous(Lh);
+
+load tests/data/rhh.dat
+
+[INCREMENT NUMBERS] = generate_increment(SYMBOLS,PREVIOUS);
+
+function_real="real";
+function_imag="imag";
+sign="";
+fction="";
+equation_num="";
+increment = { };
+equation="";
+
+for equation_num=1:INCREMENT_NUM,
+ for part_num=1:Lh,
+ coefficient=INCREMENT(equation_num,part_num);
+ if(coefficient==1 || coefficient==-1),
+ fction=function_real;
+ else
+ fction=function_imag;
+ coefficient=coefficient*j;
+ end
+
+ if(coefficient==1 && part_num != 1),
+ sign="+";
+ elseif(coefficient==-1),
+ sign="-";
+ else
+ sign="";
+ end
+
+ equation = [equation " " sign "rhh[" int2str(part_num) "]." fction "()" ];
+ end
+
+ increment(equation_num) = ["increment[" int2str(equation_num-1) "] =" equation];
+ equation="";
+end
+
+
+BRANCH_NUM=2**(Lh+1);
+
+
+%make path metrics
+pm_candidates_real={};
+pm_candidates_imag={};
+for symbol_num=1:BRANCH_NUM,
+
+ inc1_num=NUMBERS(PREVIOUS(symbol_num,1),symbol_num);
+ inc2_num=NUMBERS(PREVIOUS(symbol_num,2),symbol_num);
+
+ symbol=SYMBOLS(symbol_num,1);
+
+ if(inc1_num<0)
+ inc1_sign="+";
+ inc1_num=-inc1_num;
+ else
+ inc1_sign="-";
+ end
+
+ if(inc2_num<0)
+ inc2_sign="+";
+ inc2_num=-inc2_num;
+ else
+ inc2_sign="-";
+ end
+
+ inc1_num=inc1_num-1;
+ inc2_num=inc2_num-1;
+
+ if(symbol==1 || symbol==-1),
+ fction=function_real;
+ else
+ fction=function_imag;
+ symbol=symbol*(-j);
+ end
+
+ if(symbol==1),
+ symbol_sign="+";
+ else
+ symbol_sign="-";
+ end
+
+ branch_metric1=[" " symbol_sign " input_symbol_" fction " " inc1_sign " increment[" int2str(inc1_num) "]" ];
+ branch_metric2=[" " symbol_sign " input_symbol_" fction " " inc2_sign " increment[" int2str(inc2_num) "]" ];
+
+ num = ceil((symbol_num)/2);
+ prev1_num = ceil((PREVIOUS(symbol_num,1))/2)-1;
+ prev2_num = ceil((PREVIOUS(symbol_num,2))/2)-1;
+
+ if(mod(symbol_num,2)==1),
+ pm_candidates_imag(num, 1)=[ "pm_candidate1 = old_path_metrics[" int2str(prev1_num) "]" branch_metric1 ];
+ pm_candidates_imag(num, 2)=[ "pm_candidate2 = old_path_metrics[" int2str(prev2_num) "]" branch_metric2 ];
+ else
+ pm_candidates_real(num, 1)=[ "pm_candidate1 = old_path_metrics[" int2str(prev1_num) "]" branch_metric1 ];
+ pm_candidates_real(num, 2)=[ "pm_candidate2 = old_path_metrics[" int2str(prev2_num) "]" branch_metric2 ];
+ end
+end
+
diff --git a/viterbi_generator/utils/lower_utils/generate_increment.m b/viterbi_generator/utils/lower_utils/generate_increment.m
new file mode 100644
index 0000000..9575796
--- /dev/null
+++ b/viterbi_generator/utils/lower_utils/generate_increment.m
@@ -0,0 +1,72 @@
+function [INCREMENT NUMBERS] = generate_increment(SYMBOLS,PREVIOUS)%,Rhh)
+
+ ###########################################################################
+ # Copyright (C) 2008 by Piotr Krysik #
+ # pkrysik@stud.elka.pw.edu.pl #
+ # #
+ # This program is free software; you can redistribute it and/or modify #
+ # it under the terms of the GNU General Public License as published by #
+ # the Free Software Foundation; either version 3 of the License, or #
+ # (at your option) any later version. #
+ # #
+ # This program is distributed in the hope that it will be useful, #
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of #
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+ # GNU General Public License for more details. #
+ # #
+ # You should have received a copy of the GNU General Public License #
+ # along with this program; if not, write to the #
+ # Free Software Foundation, Inc., #
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+ ###########################################################################
+
+MSK_STATES_NUM=4; % 1,-1,j,-j
+[POSIBLE_SEQ_NUM,Lh]=size(SYMBOLS);
+INCREMENT_NUM=2**(Lh-1);
+%Lh - channel memory length
+%POSIBLE_SEQ_NUM - number of posible sequences of MSK symbols (1,-1,j,-j) for given Lh
+
+%INCREMENT=zeros(2,Lh,POSIBLE_SEQ_NUM/8);
+
+% Rhh IS STORED AS:
+% [ Rhh(1) Rhh(2) Rhh(3) ... Rhh(Lh) ]
+INCREMENT=zeros(INCREMENT_NUM, Lh);
+
+for n=1:POSIBLE_SEQ_NUM,
+ % ONLY TWO LEGAL PREVIOUS STATES EXIST, SO THE LOOP IS UNROLLED
+ m=PREVIOUS(n,1);
+ vector=[conj(SYMBOLS(n,1))* SYMBOLS(m,:)];
+ number=complex_vect2number(vector);
+ if(number>0)
+ INCREMENT(number,:)=vector;
+ end
+
+ NUMBERS(m,n)=number;
+
+ m=PREVIOUS(n,2);
+ vector=[conj(SYMBOLS(n,1))* SYMBOLS(m,:)];
+ number=complex_vect2number(vector);
+ if(number>0)
+ INCREMENT(number,:)=vector;
+ end
+ NUMBERS(m,n)=number;
+end
+
+%test_inc=zeros(2**(Lh+1),2**(Lh+1));
+%for n=1:2**(Lh+1),
+% for m=1:2**(Lh+1),
+% number=NUMBERS(m,n);
+
+% if(number!=0)
+% sign=1;
+% if(number<0),
+% sign=-1;
+% number=-number;
+% end
+% test_inc(m,n)=real(sign*INCREMENT(number,:)*Rhh(2:Lh+1).');
+% end
+% end
+%end
+%INCREMENT
+%test_inc
+%NUMBERS
diff --git a/viterbi_generator/utils/lower_utils/lower_utils/complex_vect2number.m b/viterbi_generator/utils/lower_utils/lower_utils/complex_vect2number.m
new file mode 100644
index 0000000..f0d6d25
--- /dev/null
+++ b/viterbi_generator/utils/lower_utils/lower_utils/complex_vect2number.m
@@ -0,0 +1,44 @@
+function [ number ] = complex_vect2number(vector)
+
+ ###########################################################################
+ # Copyright (C) 2008 by Piotr Krysik #
+ # pkrysik@stud.elka.pw.edu.pl #
+ # #
+ # This program is free software; you can redistribute it and/or modify #
+ # it under the terms of the GNU General Public License as published by #
+ # the Free Software Foundation; either version 3 of the License, or #
+ # (at your option) any later version. #
+ # #
+ # This program is distributed in the hope that it will be useful, #
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of #
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+ # GNU General Public License for more details. #
+ # #
+ # You should have received a copy of the GNU General Public License #
+ # along with this program; if not, write to the #
+ # Free Software Foundation, Inc., #
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+ ###########################################################################
+
+% Change complex vector of values: 1,-1 or j,-j
+% into a integer number.
+
+ number=0;
+ [r,Lh] = size(vector);
+ for l=1:Lh,
+ position=2**(l-1);
+ if(vector(l)==1),
+ number=number+position*(1);
+ elseif(vector(l)==-1),
+ number=number+position*(-1);
+ elseif(vector(l)==-j),
+ number=number+position*(1);
+ elseif(vector(l)==j),
+ number=number+position*(-1);
+ end
+ end
+ if number < 0,
+ number=floor(number/2);
+ else
+ number=ceil(number/2);
+ end
diff --git a/viterbi_generator/utils/lower_utils/lower_utils/generate_previous.m b/viterbi_generator/utils/lower_utils/lower_utils/generate_previous.m
new file mode 100644
index 0000000..942c4dc
--- /dev/null
+++ b/viterbi_generator/utils/lower_utils/lower_utils/generate_previous.m
@@ -0,0 +1,35 @@
+function [ PREVIOUS ] = generate_previous(Lh)
+
+ ###########################################################################
+ # Copyright (C) 2008 by Piotr Krysik #
+ # pkrysik@stud.elka.pw.edu.pl #
+ # #
+ # This program is free software; you can redistribute it and/or modify #
+ # it under the terms of the GNU General Public License as published by #
+ # the Free Software Foundation; either version 3 of the License, or #
+ # (at your option) any later version. #
+ # #
+ # This program is distributed in the hope that it will be useful, #
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of #
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+ # GNU General Public License for more details. #
+ # #
+ # You should have received a copy of the GNU General Public License #
+ # along with this program; if not, write to the #
+ # Free Software Foundation, Inc., #
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+ ###########################################################################
+
+SYMBOLS_NUM = 2**(Lh+1);
+n=1;
+for i=1:4:SYMBOLS_NUM,
+ PREVIOUS(i,1) = n+1;
+ PREVIOUS(i,2) = n+SYMBOLS_NUM/2+1;
+ PREVIOUS(i+1,1) = n;
+ PREVIOUS(i+1,2) = n+SYMBOLS_NUM/2;
+ PREVIOUS(i+2,1) = n+1;
+ PREVIOUS(i+2,2) = n+SYMBOLS_NUM/2+1;
+ PREVIOUS(i+3,1) = n;
+ PREVIOUS(i+3,2) = n+SYMBOLS_NUM/2;
+ n=n+2;
+end
diff --git a/viterbi_generator/utils/lower_utils/lower_utils/make_symbols.m b/viterbi_generator/utils/lower_utils/lower_utils/make_symbols.m
new file mode 100644
index 0000000..3849fbd
--- /dev/null
+++ b/viterbi_generator/utils/lower_utils/lower_utils/make_symbols.m
@@ -0,0 +1,35 @@
+function [ SYMBOLS ] = make_symbols(Lh)
+
+ ###########################################################################
+ # Copyright (C) 2008 by Piotr Krysik #
+ # pkrysik@stud.elka.pw.edu.pl #
+ # #
+ # This program is free software; you can redistribute it and/or modify #
+ # it under the terms of the GNU General Public License as published by #
+ # the Free Software Foundation; either version 3 of the License, or #
+ # (at your option) any later version. #
+ # #
+ # This program is distributed in the hope that it will be useful, #
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of #
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+ # GNU General Public License for more details. #
+ # #
+ # You should have received a copy of the GNU General Public License #
+ # along with this program; if not, write to the #
+ # Free Software Foundation, Inc., #
+ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+ ###########################################################################
+
+BRANCH_NUM=2**(Lh+1);
+SYMBOLS=ones(BRANCH_NUM, Lh);
+
+for column=1:Lh,
+ for i=1:(2**column),
+ SYMBOLS(i:(2**(column+1)):BRANCH_NUM,column)=-1;
+ end
+
+end
+
+SYMBOLS(1:2:BRANCH_NUM, 1:2:Lh) = SYMBOLS(1:2:BRANCH_NUM, 1:2:Lh).*(-j);
+SYMBOLS(2:2:BRANCH_NUM, 2:2:Lh) = SYMBOLS(2:2:BRANCH_NUM, 2:2:Lh).*(-j);
+
personal git repositories of Harald Welte. Your mileage may vary