【问题标题】:Encoding a long signal in MATLAB using Huffman encoding在 MATLAB 中使用 Huffman 编码对长信号进行编码
【发布时间】:2013-12-05 21:01:11
【问题描述】:

我正在 MATLAB 中进行无损数据压缩。我希望编码大约 60000 长度的信号。这是我的代码:

function sig = huffman (Y, fs)

%getting array of unique values
Z = unique (Y);

%counting occurences of each element and listing it to a new array
countElY=histc(Y,Z); %# get the count of elements
p = countElY/numel(Y); %getting the probability distribution

[dict,avglen] = huffmandict(Z,p); % Create dictionary.

comp = huffmanenco(Y,dict) % Encode the data.
dsig = huffmandeco(comp, dict) %Decode the data
sound(dsig, fs)

问题是,对于这样长度的信号,我超过了 MATLAB 的 500 次递归限制,并且在创建字典时发生了该错误。我已经尝试将信号分成几部分,但这花了很多时间,而且只占了一小部分。任何想法如何使它工作?除了扩展递归限制之外,这是相当没有意义和耗时的?

【问题讨论】:

  • 有多少个符号? huffmandict 的输入不依赖于长度。你能提供示例输入数据吗?
  • 就像我说的,它是一个包含大约 60000 个元素的向量。我认为在这里列出它是没有意义的,值范围从-1.27到1.1969。它不是?那么为什么会出现这样的异常呢?感谢回复!
  • “值范围从 -1.27 到 1.1969” - 因此您对非离散信号使用霍夫曼编码?在这些情况下,它是毫无用处的,因为没有相关的收益。 numel(Z) 是什么?这与编码的复杂性有关。
  • 不,实际上信号是离散的。 numel(Y) 是向量 Y 的多个元素。countElY 是每个唯一符号的出现次数。出现次数除以 Y 的总长度,这样我们就得到了唯一符号出现的概率。有了这个概率,我们可以建立一个字典,是什么让我们遇到了我的问题......
  • 我了解您的代码,但numel(Z)numel(countElY) 有多大?这是复杂性的相关属性。

标签: matlab recursion compression huffman-code


【解决方案1】:

首先,您需要确定您认为可以压缩数据的原因。信号流畅吗?范围有限制吗?量化有限制吗?什么使它可压缩将决定如何压缩它。

简单地将霍夫曼编码应用于一系列实数值不会压缩数据,因为每个值出现一次,或者可能有几个出现两次。霍夫曼依赖于利用相同符号的多次出现和频率偏差,其中一些符号比其他符号更常见。

压缩波形将使用不同的方法。首先是将每个样本转换为尽可能少的有效位并覆盖输入范围。其次是获取样本之间的差异或使用更高级的预测器来利用波形的平滑度(如果它是平滑的)。第三是找到一种方法来对差异进行分组,以更少的比特编码更有可能的差异。最后一步可能会使用 Huffman 编码,但前提是您已经构建了 Huffman 编码可以利用的东西。

【讨论】:

  • 你说得对,我确实用这种方法做到了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多