summaryrefslogtreecommitdiff
path: root/viterbi_generator/tests/utils/viterbi_detector.m
diff options
context:
space:
mode:
Diffstat (limited to 'viterbi_generator/tests/utils/viterbi_detector.m')
-rw-r--r--viterbi_generator/tests/utils/viterbi_detector.m218
1 files changed, 218 insertions, 0 deletions
diff --git a/viterbi_generator/tests/utils/viterbi_detector.m b/viterbi_generator/tests/utils/viterbi_detector.m
new file mode 100644
index 0000000..31e8f93
--- /dev/null
+++ b/viterbi_generator/tests/utils/viterbi_detector.m
@@ -0,0 +1,218 @@
+function [ rx_burst METRIC] = viterbi_detector(SYMBOLS,NEXT,PREVIOUS,START,STOPS,Y,Rhh)
+%
+% VITERBI_DETECTOR:
+% This matlab code does the actual detection of the
+% received sequence. As indicated by the name the algorithm
+% is the viterbi algorithm, which is a MLSE. At this time
+% the approch is to use Ungerboecks modified algorithm, and
+% to return hard output only.
+%
+% SYNTAX: [ rx_burst ]
+% =
+% viterbi_detector(SYMBOLS,NEXT,PREVIOUS,START,STOPS,Y,Rhh)
+%
+% INPUT: SYMBOLS: The table of symbols corresponding the the state-
+% numbers. Format as made by make_symbols.m
+% NEXT: A transition table containing the next legal
+% states, as it is generated by the code make_next.m
+% PREVIOUS: The transition table describing the legal previous
+% states as generated by make_previous.m
+% START: The start state of the algorithm.
+% STOPS: The legal stop states.
+% Y: Complex baseband representation of the matched
+% filtered and down converted received signal, as it
+% is returned by mf.m
+% Rhh: The autocorrelation as estimated by mf.m
+%
+% OUTPUT: rx_burst: The most likely sequence of symbols.
+%
+% SUB_FUNC: make_increment
+%
+% WARNINGS: None.
+%
+% TEST(S): Tested with no noise, perfect syncronization, and channel
+% estimation/filtering. (Refer to viterbi_ill.m)
+%
+% AUTOR: Jan H. Mikkelsen / Arne Norre Ekstrøm
+% EMAIL: hmi@kom.auc.dk / aneks@kom.auc.dk
+%
+% $Id: viterbi_detector.m,v 1.7 1997/11/18 12:41:26 aneks Exp $
+
+% KNOWLEDGE OF Lh AND M IS NEEDED FOR THE ALGORITHM TO OPERATE
+%
+[ M , Lh ] = size(SYMBOLS);
+
+% THE NUMBER OF STEPS IN THE VITERBI
+%
+STEPS=length(Y);
+% INITIALIZE TABLES (THIS YIELDS A SLIGHT SPEEDUP).
+%
+METRIC = zeros(M,STEPS);
+SURVIVOR = zeros(M,STEPS);
+
+% DETERMINE PRECALCULATABLE PART OF METRIC
+%
+INCREMENT=make_increment(SYMBOLS,NEXT,Rhh);
+%INCREMENT
+% THE FIRST THING TO DO IS TO ROLL INTO THE ALGORITHM BY SPREADING OUT
+% FROM THE START STATE TO ALL THE LEGAL STATES.
+%
+PS=START;
+
+% NOTE THAT THE START STATE IS REFERRED TO AS STATE TO TIME 0
+% AND THAT IT HAS NO METRIC.
+%
+S=NEXT(START,1);
+
+METRIC(S,1)=real(conj(SYMBOLS(S,1))*Y(1))-INCREMENT(PS,S);
+SURVIVOR(S,1)=START;
+
+S=NEXT(START,2);
+METRIC(S,1)=real(conj(SYMBOLS(S,1))*Y(1))-INCREMENT(PS,S);
+SURVIVOR(S,1)=START;
+
+PREVIOUS_STATES=NEXT(START,:);
+
+% MARK THE NEXT STATES AS REAL. N.B: COMPLEX INDICATES THE POLARITY
+% OF THE NEXT STATE, E.G. STATE 2 IS REAL.
+%
+COMPLEX=0;
+
+for N = 2:Lh,
+ if COMPLEX,
+ COMPLEX=0;
+ else
+ COMPLEX=1;
+ end
+ STATE_CNTR=0;
+ for PS = PREVIOUS_STATES,
+ STATE_CNTR=STATE_CNTR+1;
+ S=NEXT(PS,1);
+ METRIC(S,N)=METRIC(PS,N-1)+real(conj(SYMBOLS(S,1))*Y(N))-INCREMENT(PS,S);
+ SURVIVOR(S,N)=PS;
+ USED(STATE_CNTR)=S;
+ STATE_CNTR=STATE_CNTR+1;
+ S=NEXT(PS,2);
+ METRIC(S,N)=METRIC(PS,N-1)+real(conj(SYMBOLS(S,1))*Y(N))-INCREMENT(PS,S);
+ SURVIVOR(S,N)=PS;
+ USED(STATE_CNTR)=S;
+ end
+ PREVIOUS_STATES=USED;
+end
+% AT ANY RATE WE WILL HAVE PROCESSED Lh STATES AT THIS TIME
+%
+PROCESSED=Lh;
+
+% WE WANT AN EQUAL NUMBER OF STATES TO BE REMAINING. THE NEXT LINES ENSURE
+% THIS.
+%
+
+if ~COMPLEX,
+ COMPLEX=1;
+ PROCESSED=PROCESSED+1;
+ N=PROCESSED;
+ for S = 2:2:M,
+ PS=PREVIOUS(S,1);
+ M1=METRIC(PS,N-1)+real(conj(SYMBOLS(S,1))*Y(N)-INCREMENT(PS,S));
+ PS=PREVIOUS(S,2);
+ M2=METRIC(PS,N-1)+real(conj(SYMBOLS(S,1))*Y(N)-INCREMENT(PS,S));
+ if M1 > M2,
+ METRIC(S,N)=M1;
+ SURVIVOR(S,N)=PREVIOUS(S,1);
+ else
+ METRIC(S,N)=M2;
+ SURVIVOR(S,N)=PREVIOUS(S,2);
+ end
+ end
+end
+
+% NOW THAT WE HAVE MADE THE RUN-IN THE REST OF THE METRICS ARE
+% CALCULATED IN THE STRAIGHT FORWARD MANNER. OBSERVE THAT ONLY
+% THE RELEVANT STATES ARE CALCULATED, THAT IS REAL FOLLOWS COMPLEX
+% AND VICE VERSA.
+%
+N=PROCESSED+1;
+while N <= STEPS,
+ for S = 1:2:M-1,
+ PS=PREVIOUS(S,1);
+ M1=METRIC(PS,N-1)+real(conj(SYMBOLS(S,1))*Y(N)-INCREMENT(PS,S));
+ PS=PREVIOUS(S,2);
+ M2=METRIC(PS,N-1)+real(conj(SYMBOLS(S,1))*Y(N)-INCREMENT(PS,S));
+ if M1 > M2,
+ METRIC(S,N)=M1;
+ SURVIVOR(S,N)=PREVIOUS(S,1);
+ else
+ METRIC(S,N)=M2;
+ SURVIVOR(S,N)=PREVIOUS(S,2);
+ end
+ end
+ N=N+1;
+ for S = 2:2:M,
+ PS=PREVIOUS(S,1);
+ M1=METRIC(PS,N-1)+real(conj(SYMBOLS(S,1))*Y(N)-INCREMENT(PS,S));
+ PS=PREVIOUS(S,2);
+ M2=METRIC(PS,N-1)+real(conj(SYMBOLS(S,1))*Y(N)-INCREMENT(PS,S));
+ if M1 > M2,
+ METRIC(S,N)=M1;
+ SURVIVOR(S,N)=PREVIOUS(S,1);
+ else
+ METRIC(S,N)=M2;
+ SURVIVOR(S,N)=PREVIOUS(S,2);
+ end
+ end
+ N=N+1;
+end
+
+
+% HAVING CALCULATED THE METRICS, THE MOST PROBABLE STATESEQUENCE IS
+% INITIALIZED BY CHOOSING THE HIGHEST METRIC AMONG THE LEGAL STOP
+% STATES.
+%
+BEST_LEGAL=0;
+for FINAL = STOPS,
+ if METRIC(FINAL,STEPS) > BEST_LEGAL,
+ S=FINAL;
+ BEST_LEGAL=METRIC(FINAL,STEPS);
+ end
+end
+
+% UNCOMMENT FOR TEST OF METRIC
+%
+% METRIC
+% BEST_LEGAL
+% S
+% pause
+
+% HAVING FOUND THE FINAL STATE, THE MSK SYMBOL SEQUENCE IS ESTABLISHED
+%
+
+IEST(STEPS)=SYMBOLS(S,1);
+N=STEPS-1;
+while N > 0,
+
+% if(N>STEPS-40),
+% previo=ceil(S/2)
+% end
+ S=SURVIVOR(S,N+1);
+ IEST(N)=SYMBOLS(S,1);
+ N=N-1;
+end
+
+% THE ESTIMATE IS NOW FOUND FROM THE FORMULA:
+% IEST(n)=j*rx_burst(n)*rx_burst(n-1)*IEST(n-1)
+% THE FORMULA IS REWRITTEN AS:
+% rx_burst(n)=IEST(n)/(j*rx_burst(n-1)*IEST(n-1))
+% FOR INITIALIZATION THE FOLLOWING IS USED:
+% IEST(0)=1 og rx_burst(0)=1
+%
+rx_burst(1)=IEST(1)/(j*1*1);
+for n = 2:STEPS,
+ rx_burst(n)=IEST(n)/(j*rx_burst(n-1)*IEST(n-1));
+end
+
+% rx_burst IS POLAR (-1 AND 1), THIS TRANSFORMS IT TO
+% BINARY FORM (0 AND 1).
+%
+
+rx_burst=(rx_burst+1)./2;
+
personal git repositories of Harald Welte. Your mileage may vary