【发布时间】: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