?? jacenc.m
字號:
function b=jacenc(x)% Usage: b=jacenc(x)% JPEG AC coefficient encoding routine% x: AC coefficient sequence % b: corresponding bit stream% copyright (c) 1997 by Yu Hen Hu%% created: 11/25/97%b=[];% run - category - length - bsae code length - base codetable=[... 0 1 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 6 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 4 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 5 10 5 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 6 12 6 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 14 7 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 8 18 10 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 9 25 16 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 10 26 16 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 5 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 8 6 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 3 10 7 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 4 13 9 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 5 16 11 1 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 6 22 16 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 7 23 16 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 8 24 16 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 9 25 16 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 10 26 16 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 2 1 6 5 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 2 2 10 8 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 2 3 13 10 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 2 4 20 16 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 1 2 5 21 16 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0 2 6 22 16 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 2 7 23 16 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 2 8 24 16 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 1 2 9 25 16 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0 2 10 26 16 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 3 1 7 6 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 3 2 11 9 1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 3 3 14 11 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 3 4 20 16 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 3 5 21 16 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 3 6 22 16 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 3 7 23 16 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 3 8 24 16 1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 0 3 9 25 16 1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 1 3 10 26 16 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 4 1 7 6 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 4 2 12 10 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 4 3 19 16 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 4 4 20 16 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 4 5 21 16 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 4 6 22 16 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 4 7 23 16 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 4 8 24 16 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 0 4 9 25 16 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 4 10 26 16 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 5 1 8 7 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 5 2 12 10 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 5 3 19 16 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 5 4 20 16 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 5 5 21 16 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 5 6 22 16 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0 5 7 23 16 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 5 8 24 16 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 5 9 25 16 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 5 10 26 16 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0 6 1 8 7 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 6 2 13 11 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 6 3 19 16 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 6 4 20 16 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 6 5 21 16 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 6 6 22 16 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 6 7 23 16 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 6 8 24 16 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 0 6 9 25 16 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 6 10 26 16 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 7 1 9 8 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 7 2 14 12 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 7 3 19 16 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 7 4 20 16 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 7 5 21 16 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 7 6 22 16 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 0 7 7 23 16 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 1 7 8 24 16 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 0 7 9 25 16 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 7 10 26 16 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 8 1 9 8 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 8 2 17 15 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 8 3 19 16 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 8 4 20 16 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 8 5 21 16 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 8 6 22 16 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 8 7 23 16 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 8 8 24 16 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 8 9 25 16 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 8 10 26 16 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 9 1 10 9 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 9 2 18 16 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 9 3 19 16 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 9 4 20 16 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 9 5 21 16 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 9 6 22 16 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 9 7 23 16 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 9 8 24 16 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 9 9 25 16 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 9 10 26 16 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 110 1 10 9 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 10 2 18 16 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 010 3 19 16 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 110 4 20 16 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 010 5 21 16 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 110 6 22 16 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 010 7 23 16 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 110 8 24 16 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 010 9 25 16 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 110 10 26 16 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 011 1 10 9 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 11 2 18 16 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 111 3 19 16 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 011 4 20 16 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 111 5 21 16 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 011 6 22 16 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 111 7 23 16 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 011 8 24 16 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 111 9 25 16 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 011 10 26 16 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 112 1 11 10 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 12 2 18 16 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 012 3 19 16 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 112 4 20 16 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 012 5 21 16 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 112 6 22 16 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 012 7 23 16 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 112 8 24 16 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 012 9 25 16 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 112 10 26 16 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 013 1 12 11 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 13 2 18 16 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 113 3 19 16 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 013 4 20 16 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 113 5 21 16 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 013 6 22 16 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 113 7 23 16 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 013 8 24 16 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 113 9 25 16 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 013 10 26 16 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 114 1 13 12 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 014 2 18 16 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 014 3 19 16 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 114 4 20 16 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 014 5 21 16 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 114 6 22 16 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 014 7 23 16 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 114 8 24 16 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 014 9 25 16 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 114 10 26 16 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 015 1 17 16 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 115 2 18 16 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 015 3 19 16 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 115 4 20 16 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 015 5 21 16 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 115 6 22 16 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 015 7 23 16 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 115 8 24 16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 015 9 25 16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 115 10 26 16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 4 4 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 015 0 11 11 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0];ix = find(x~=0); % index of next non-zero entry 找到不為零的數值的坐標例如x=[0,0,0,1,1,0,0],ix = find(x~=0),值為ix=[4,5] %即第4位以及第5位部位零。Nx = length(ix); % # of non-zero entries 非零數的個數% if first ac coefficient has no leading zeros% then encode x(1)!% note much details have been left out here% we did not concern what if Nx=1 and x(1)=EoB% 在程序tobdel中有詳細的處理,但是對它們對EoB都沒有處理,開頭if ix(1)==1, run=0; % no leading zero 游程長度 tmp=int2bin(x(1)); % tmp is 1 by (c+1) 把非零數值由10進制轉化為2進制;這里的這個函數是自己寫的int2bin(12)=01100;int2bin(-12)= 11100 cat=length(tmp)-1; % first bit is sign bit (數值的絕對值所占用的位數,即是相當于組號) row=run*10+cat; %通過游程長度確定該數據在表中的行的位置。(因為每一個游程對應的是10行) prefix=table(row,5:table(row,4)+4); %prefix,是對AC系數的符號1進行查表編碼,5:table(row,4)+4對應的碼字的坐標,從第5列開始,結束的坐標位置是 %table(row,4)為每一行的第4列,對應的值是符號1對應的碼字的 %碼長,加上4是碼字的最后一位對應的坐標 if tmp(1)==1, %if current x is negative 利用函數int2bin轉化之后第一位為1則是負數,else是整數 tmp=ones(1,cat+1)-tmp; % 1's complement ,這里利用減法實現了編碼,其實對其取反效果是一樣的(注意補碼&反碼的不同,都可以通過減法來實現) end %正數不需要處理 b=[prefix tmp(2:cat+1)]; %AC編碼完畢,其中一位的編碼完畢endfor n=2:Nx, % loop through each non-zero entry Nx是非零數的個數,對每一個位數進行編碼 prefix=[]; % 1. ck # of leading zeros run=ix(n)-ix(n-1)-1; %兩個非零數字之間的游程數目 %因為編碼中符號1中用來表示游程的長短的位數是4位,所以只能到(15,0)就是連續15個零,當游程的長度超過15是可以考慮 %在其中間添加碼字(15,0) % 2. ck if run > 16; % run of 0s longer than 15, will be broken down into repeated % run-of-15-0 symbol while run > 15, b=[b 1 1 1 1 1 1 1 1 0 0 1]; run=run-15; end % check if end of block if x(ix(n))==999, b = [b 1 0 1 0]; % append EoB symbol else tmp=int2bin(x(ix(n))); % tmp is 1 by (c+1) cat=length(tmp)-1; % first bit is sign bit row=run*10+cat; % row number of the prefix Hoffman code prefix=table(row,5:table(row,4)+4); if tmp(1)==1, % if current x is negative tmp=ones(1,cat+1)-tmp; % 1's complement end b=[b prefix tmp(2:cat+1)]; %處理同上面的第一位的處理 endend
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -