MATLAB中双类型输入到双类型输出的量化

MATLAB中双类型输入到双类型输出的量化,matlab,quantization,Matlab,Quantization,我试图用128级均匀量化器对一组双类型样本进行量化,我希望我的输出也是双类型的。当我尝试使用“量化”时,matlab给出了一个错误:不支持类“double”的输入。我也试过“上界代码”,但它的答案是胡说八道。我对matlab很陌生,我已经为此工作了几个小时。谢谢你的帮助。谢谢应该给出整数结果。这就是重点。但关键的一点是,它假设了一个对称范围。从-x到+x,其中x是数据集中的最大值或最小值。因此,如果你的数据是从0到10,你的结果看起来像是胡说八道,因为它量化了范围为-10到10的值 在任何情况下

我试图用128级均匀量化器对一组双类型样本进行量化,我希望我的输出也是双类型的。当我尝试使用“量化”时,matlab给出了一个错误:不支持类“double”的输入。我也试过“上界代码”,但它的答案是胡说八道。我对matlab很陌生,我已经为此工作了几个小时。谢谢你的帮助。谢谢

应该给出整数结果。这就是重点。但关键的一点是,它假设了一个对称范围。从-x到+x,其中x是数据集中的最大值或最小值。因此,如果你的数据是从0到10,你的结果看起来像是胡说八道,因为它量化了范围为-10到10的值

在任何情况下,您实际上都需要编码值和量化值。为此,我编写了一个简单的函数。它甚至没有什么帮助说明(实际上只是键入“help ValueQuantizer”)。我还使它非常灵活,所以它应该适用于任何数据大小(假设您有足够的内存),它可以是向量、2d数组、3d、4d…等等

下面是一个例子,看看它是如何工作的。我们的数字是从-0.5到3.5的均匀分布。这表明,与上界代码不同,我的函数适用于非对称数据,并且适用于负值

a = 4*rand(2,4,2) - .5
[encoded_vals, quant_values] = ValueQuantizer(a, 3)
产生

a(:,:,1) =
    0.6041    2.1204   -0.0240    3.3390
    2.2188    0.1504    1.4935    0.8615
a(:,:,2) =
    1.8411    2.5051    1.5238    3.0636
    0.3952    0.5204    2.2963    3.3372

encoded_vals(:,:,1) =
     1     4     0     7
     5     0     3     2
encoded_vals(:,:,2) =
     4     5     3     6
     1     1     5     7

quant_values(:,:,1) =
    0.4564    1.8977   -0.0240    3.3390
    2.3781   -0.0240    1.4173    0.9368
quant_values(:,:,2) =
    1.8977    2.3781    1.4173    2.8585
    0.4564    0.4564    2.3781    3.3390
因此,您可以看到它以整数形式返回编码值(与uencode类似,但没有奇怪的对称假设)。与uencode不同,它只是将所有内容作为双精度返回,而不是转换为uint8/16/32。重要的是它还返回量化值,这是您想要的

下面是函数

function [encoded_vals, quant_values] = ValueQuantizer(U, N)
% ValueQuantizer uniformly quantizes and encodes the input into N-bits
% it then returns the unsigned integer encoded values and the actual
% quantized values
%
% encoded_vals = ValueQuantizer(U,N) uniformly quantizes and encodes data
% in U. The output range is integer values in the range [0 2^N-1]
%
% [encoded_vals, quant_values] = ValueQuantizer(U, N) uniformly quantizes
% and encodes data in U. encoded_vals range is integer values [0 2^N-1]
% quant_values shows the original data U converted to the quantized level
% representing the number

    if (N<2)
        disp('N is out of range. N must be > 2')
        return;
    end

    quant_values = double(U(:));

    max_val = max(quant_values);
    min_val = min(quant_values);

    %quantizes the data
    quanta_size = (max_val-min_val) / (2^N -1);
    quant_values = (quant_values-min_val) ./ quanta_size;

    %reshapes the data
    quant_values = reshape(quant_values, size(U));
    encoded_vals = round(quant_values);

    %returns the original numbers in their new quantized form
    quant_values = (encoded_vals .* quanta_size) + min_val;
end
函数[encoded\U vals,quant\U values]=值量化器(U,N)
%值量化器将输入均匀量化并编码为N位
%然后返回无符号整数编码值和实际值
%量化值
%
%encoded_vals=值量化器(U,N)对数据进行统一量化和编码
%在U中,输出范围为[0 2^N-1]范围内的整数值
%
%[encoded_vals,quant_values]=值量化器(U,N)均匀量化
%并对U中的数据进行编码。编码的数值范围为整数值[0 2^N-1]
%quant_值显示转换为量化级别的原始数据U
%代表数字

if(来自MATLAB quantize文档:“输入X必须是……内置整数类型。”因此不能将double作为输入传递。必须先转换为整数。X=uint32(y);我不能将数据转换为整数,因为我会丢失有价值的部分。我最初的问题听起来像是我的问题是“quantize”但事实并非如此。问题是我无法从“uencode”中获得可靠的结果。结果的直方图有很多尖峰,应该是平滑的。我正在寻找另一种方法来量化,如果有的话。谢谢你的回答。