diff options
Diffstat (limited to 'viterbi_generator/tests/utils/viterbi_detector.m')
-rw-r--r-- | viterbi_generator/tests/utils/viterbi_detector.m | 218 |
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; + |