对图像 香农费诺编码 matlab 实现,香农编码费诺编码.doc

实 验 目 的: 通过该实验,掌握通过计算机实验可变长信源编码方法,进一步熟悉香农编码,费诺编码以及霍夫曼编码方法。

实 验 环 境: Matlab7.1

实 验 内 容 及 过 程:

1.对于给定的信源的概率分布,用MATLAB语言实现香农编码。

2. 对于给定的信源的概率分布,用MATLAB语言实现霍夫曼编码。

3. 对于给定的信源的概率分布,用MATLAB语言实现游程编码。

以下为M文件:

1.

function c = shannon(p)% p = [0.2 0.15 0.15 0.1 0.1 0.1 0.1 0.1]% shannon(p)[p , index] = sort(p) ;p = fliplr(p) ; n = length(p) ;pa = 0 ; for i = 2:n??? pa(i) = pa(i - 1) + p(i - 1) ;?? endk = ceil(-log2(p)) ; c = cell(1,n) ; for i = 1:n??? c{i} = '' ;??? tmp = pa(i) ;??? for j = 1:k(i)??????? tmp = tmp * 2 ;??????? if tmp >= 1 ??????????? tmp = tmp - 1 ;??????????? c{i}(j) = '1' ;??????? else??????????? c{i}(j) = '0' ;??????? end??? endendc = fliplr(c) ;c(index) = c ;

2.

function c = huffman(p)n = size(p ,

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Matlab实现香农-费诺编码对二进制序列进行编码的代码: ```matlab function [code, dict] = shannon_fano_encode(binary_seq) % binary_seq: 待编码的二进制序列 % 统计每个符号出现的概率 symbols = unique(binary_seq); prob = histc(binary_seq, symbols) / numel(binary_seq); % 对概率进行降序排列 [prob, index] = sort(prob, 'descend'); symbols = symbols(index); % 递归地进行划分 [~, dict] = shannon_fano_split(symbols, prob); % 对序列进行编码 code = ''; for i = 1:length(binary_seq) symbol = binary_seq(i); code = strcat(code, dict{symbols == symbol}); end ``` 其中,shannon_fano_split函数用于递归地进行划分,代码如下: ```matlab function [left, right] = shannon_fano_split(symbols, prob) % symbols: 待划分的符号集合 % prob: 符号集合中每个符号出现的概率 if numel(symbols) == 1 left = {}; right = {''}; else cum_prob = cumsum(prob); split_index = find(cum_prob <= 0.5, 1, 'last'); left_symbols = symbols(1:split_index); right_symbols = symbols(split_index+1:end); [left_left, left_right] = shannon_fano_split(left_symbols, prob(1:split_index)); [right_left, right_right] = shannon_fano_split(right_symbols, prob(split_index+1:end)); left = cellfun(@(x) strcat('0', x), left_right, 'UniformOutput', false); right = cellfun(@(x) strcat('1', x), right_right, 'UniformOutput', false); left = [left_left left]; right = [right_left right]; end ``` 使用示例: ```matlab binary_seq = [1 0 1 1 0 1 0 0]; [code, dict] = shannon_fano_encode(binary_seq); ``` 其中,binary_seq是待编码的二进制序列,code是编码后的结果,dict是生成的编码字典。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值