?? channel_dec_sch.m
字號:
function [rx_block,FLAG_SS,PARITY_CHK] = channel_dec_sacch(rx_enc)%% channel_dec: %% SYNTAX: [rx_block, FLAG_SS, PARITY_CHK] = channel_dec(rx_enc)% % INPUT: rx_enc A 78 bits long vector contaning the encoded % data sequence as estimated by the SOVA. The % format of the sequency must be according to % the GSM 05.03 encoding scheme%% OUTPUT: rx_block A 39 bits long vector contaning the final% estimated information data sequence.%% FLAG_SS Indication of correct stop state. Flag is set% to '1' if an error has occured here.%% PARITY_CHK The 10 parity check bit inserted in the % transmitter.% % SUB_FUNC: None%% WARNINGS: None%% TEST(S): Operation tested in conjunction with the channel_enc.m% module. Operation proved to be correct.%% AUTHOR: Jan H. Mikkelsen / Arne Norre Ekstr鴐% EMAIL: hmi@kom.auc.dk / aneks@kom.auc.dk%% $Id: channel_dec.m,v 1.8 1998/02/12 10:53:13 aneks Exp $L = length(rx_enc);% TEST INPUT DATA%if L ~= 78 disp(' ') disp('Input data sequence size violation. Program terminated.') disp(' ') % break;endc1 = rx_enc(1:L);% INITIALIZE VARIOUS MATRIXES%% REMEMBER THE VA DECODER OPERATES ON DI-BITS% HENCE ONLY 78/2 = 39 STATE TRANSITIONS OCCURE%START_STATE = 1;END_STATE = 1;STATE = zeros(16,39);METRIC = zeros(16,2);NEXT = zeros(16,2);zeroin = 1;onein = 9;for n = 1:2:15, NEXT(n,:) = [zeroin onein]; NEXT(n+1,:) = NEXT(n,:); zeroin = zeroin + 1; onein = onein + 1; endPREVIOUS = zeros(16,2);offset = 0;for n = 1:8, PREVIOUS(n,:) = [n+offset n+offset+1]; offset = offset + 1;endPREVIOUS = [ PREVIOUS(1:8,:) ; PREVIOUS(1:8,:)];% SETUP OF DIBIT DECODER TABLE. THE BINARY DIBITS ARE% HERE REPRESENTED USING DECIMAL NUMBER, I.E. THE DIBIT% 00 IS REPRESENTED AS 0 AND THE DIBIT 11 AS 3%% THE TABEL IS SETUP SO THAT THE CALL DIBIT(X,Y) RETURNS% THE DIBIT SYMBOL RESULTING FROM A STATE TRANSITION FROM% STATE X TO STATE Y% DIBIT = [ 0 NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN NaN NaN NaN NaN; 3 NaN NaN NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN; NaN 3 NaN NaN NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN; NaN 0 NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN NaN NaN NaN; NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN NaN NaN; NaN NaN 3 NaN NaN NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN; NaN NaN NaN 3 NaN NaN NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN; NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN NaN; NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN 2 NaN NaN NaN; NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN; NaN NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN; NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN 2 NaN NaN; NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN 2 NaN; NaN NaN NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN NaN NaN 1 NaN; NaN NaN NaN NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN NaN NaN 1; NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN 2];% SETUP OF BIT DECODER TABLE. % THE TABEL IS SETUP SO THAT THE CALL BIT(X,Y) RETURNS% THE DECODED BIT RESULTING FROM A STATE TRANSITION FROM% STATE X TO STATE Y% BIT = [ 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN; 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN; NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN; NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN; NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN; NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN; NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN; NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN; NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN; NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN; NaN NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN; NaN NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN; NaN NaN NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1; NaN NaN NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN 1]; % STARTUP METRIK CALCULATIONS.%% THIS IS TO REDUCE THE NUMBER OF CALCULATIONS REQUIRED% AND IT IT RUN ONLY FOR THE FIRST 4 DIBIT PAIRS% VISITED_STATES = START_STATE;for n = 0:3, rx_DIBITXy = c1(2*n + 1); rx_DIBITxY = c1(2*n + 1 + 1); for k = 1:length(VISITED_STATES), PRESENT_STATE = VISITED_STATES(k); next_state_0 = NEXT(PRESENT_STATE,1); next_state_1 = NEXT(PRESENT_STATE,2); symbol_0 = DIBIT(PRESENT_STATE,next_state_0); symbol_1 = DIBIT(PRESENT_STATE,next_state_1); if symbol_0 == 0 LAMBDA = xor(rx_DIBITXy,0) + xor(rx_DIBITxY,0); end if symbol_0 == 1 LAMBDA = xor(rx_DIBITXy,0) + xor(rx_DIBITxY,1); end if symbol_0 == 2 LAMBDA = xor(rx_DIBITXy,1) + xor(rx_DIBITxY,0); end if symbol_0 == 3 LAMBDA = xor(rx_DIBITXy,1) + xor(rx_DIBITxY,1); end METRIC(next_state_0,2) = METRIC(PRESENT_STATE,1) + LAMBDA; if symbol_1 == 0 LAMBDA = xor(rx_DIBITXy,0) + xor(rx_DIBITxY,0); end if symbol_1 == 1 LAMBDA = xor(rx_DIBITXy,0) + xor(rx_DIBITxY,1); end if symbol_1 == 2 LAMBDA = xor(rx_DIBITXy,1) + xor(rx_DIBITxY,0); end if symbol_1 == 3 LAMBDA = xor(rx_DIBITXy,1) + xor(rx_DIBITxY,1); end METRIC(next_state_1,2) = METRIC(PRESENT_STATE,1) + LAMBDA; STATE([next_state_0, next_state_1],n + 1) = PRESENT_STATE; if k == 1 PROCESSED = [next_state_0 next_state_1]; else PROCESSED = [PROCESSED next_state_0 next_state_1]; end end VISITED_STATES = PROCESSED; METRIC(:,1) = METRIC(:,2); METRIC(:,2) = 0; end% STARTING THE SECTION WHERE ALL STATES ARE RUN THROUGH% IN THE METRIC CALCULATIONS. THIS GOES ON FOR THE% REMAINING DIBITS RECEIVED%for n = 4:38, rx_DIBITXy = c1(2*n + 1); rx_DIBITxY = c1(2*n + 1 + 1); for k = 1:16, prev_state_1 = PREVIOUS(k,1); prev_state_2 = PREVIOUS(k,2); symbol_1 = DIBIT(prev_state_1,k); symbol_2 = DIBIT(prev_state_2,k); if symbol_1 == 0 LAMBDA_1 = xor(rx_DIBITXy,0) + xor(rx_DIBITxY,0); end if symbol_1 == 1 LAMBDA_1 = xor(rx_DIBITXy,0) + xor(rx_DIBITxY,1); end if symbol_1 == 2 LAMBDA_1 = xor(rx_DIBITXy,1) + xor(rx_DIBITxY,0); end if symbol_1 == 3 LAMBDA_1 = xor(rx_DIBITXy,1) + xor(rx_DIBITxY,1); end if symbol_2 == 0 LAMBDA_2 = xor(rx_DIBITXy,0) + xor(rx_DIBITxY,0); end if symbol_2 == 1 LAMBDA_2 = xor(rx_DIBITXy,0) + xor(rx_DIBITxY,1); end if symbol_2 == 2 LAMBDA_2 = xor(rx_DIBITXy,1) + xor(rx_DIBITxY,0); end if symbol_2 == 3 LAMBDA_2 = xor(rx_DIBITXy,1) + xor(rx_DIBITxY,1); end METRIC_1 = METRIC(prev_state_1,1) + LAMBDA_1; METRIC_2 = METRIC(prev_state_2,1) + LAMBDA_2; if METRIC_1 < METRIC_2 METRIC(k,2) = METRIC_1; STATE(k,n+1) = prev_state_1; else METRIC(k,2) = METRIC_2; STATE(k,n+1) = prev_state_2; end end METRIC(:,1) = METRIC(:,2); METRIC(:,2) = 0;end% STARTING BACKTRACKING TO DETERMINE THE MOST% PROBABLE STATE TRANSITION SEQUENCE%STATE_SEQ = zeros(1,39);[STOP_METRIC, STOP_STATE] = min(METRIC(:,1));if STOP_STATE == END_STATE FLAG_SS = 0;else FLAG_SS = 1;endSTATE_SEQ(39) = STOP_STATE;for n = 38:-1:1, STATE_SEQ(n) = STATE(STATE_SEQ(n+1), n+1);endSTATE_SEQ = [START_STATE STATE_SEQ];% RESOLVING THE CORRESPONDING BIT SEQUENCS%for n = 1:length(STATE_SEQ)-1, DECONV_DATA(n) = BIT(STATE_SEQ(n), STATE_SEQ(n+1));end% SEPARATING THE DATA ACCORDING TO THE ENCODING % RESULTING FROM THE TRANSMITTER.%DATA_I = DECONV_DATA(1:25);PARITY_CHK = DECONV_DATA(26:35);TAIL_BITS = DECONV_DATA(36:39);rx_block = [DATA_I];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -