1

128 レベルの均一量子化器を使用して double 型のサンプルのセットを量子化しようとしていますが、出力も double 型にしたいと考えています。「量子化」を使用しようとすると、matlab でエラーが発生します。クラス 'double' の入力はサポートされていません。「uencode」も試してみましたが、その答えはナンセンスでした。私はmatlabを初めて使用し、これに何時間も取り組んできました。任意の助けが必要です。ありがとう

4

1 に答える 1

0

uencodeは整数の結果を返すはずです。それがポイントです。ただし、重要な点は、対称範囲を想定しているということです。-x から +x まで。x はデータ セット内の最大値または最小値です。したがって、データが 0 ~ 10 の場合、-10 ~ 10 の範囲の値を量子化するため、結果はナンセンスに見えます。

いずれにせよ、実際にはエンコードされた値と量子化された値が必要です。これを行うための簡単な関数を書きました。ヘルプの説明もほとんどありません (実際には「help ValueQuantizer」と入力するだけです)。また、非常に柔軟にしたので、どんなデータサイズでも動作するはずです(十分なメモリがあると仮定します)。ベクトル、2次元配列、3次元、4次元....などにすることができます

これがどのように機能するかを示す例です。私たちの数値は -0.5 から 3.5 までの一様分布です。これは、uencode とは異なり、私の関数が非対称データで機能し、負の値で機能することを示しています。

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 に変換するのではなく、すべてを double として返すだけです。重要な部分は、あなたが望んでいた量子化された値も返すことです

ここに関数があります

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

私が知る限り、これは常に機能するはずですが、大規模なテストは行っていません。幸運を祈ります

于 2015-03-27T22:04:59.110 に答える