2015-03-27 3 views
1

Я пытаюсь квантовать набор образцов двойного типа с равномерным квантованием на 128 уровней, и я хочу, чтобы мой вывод также был двойным. Когда я пытаюсь использовать «квантование», matlab дает ошибку: Входы класса «double» не поддерживаются. Я попробовал «uencode», но его ответ был вздор. Я совершенно новичок в Matlab, и я работал над этим часами. Любая помощь appriciated. СпасибоКвантование ввода двойного типа для вывода двойного типа в MATLAB

+1

Из документации MATLAB для квантования: «Вход X должен быть ... встроенным целым типом». Таким образом, вы не можете передавать двойной вход. Сначала вы должны перенести на целое число. x = uint32 (y); – siliconwafer

+0

Я не могу отличить свои данные до целого числа, так как я потеряю ценную часть. Мой оригинальный вопрос звучал так, как будто моя проблема заключается в «квантовании», чего нет. Проблема в том, что я не могу получить надежный результат от «uencode». Гистограмма результата имеет множество шипов, где предполагается, что они будут гладкими. Я ищу другой метод для квантования, если он есть. Спасибо за ответ. – csg

ответ

0

uencode должен дать целочисленные результаты. Вот и все. но ключевым моментом является то, что он принимает симметричный диапазон. переход от -x к + x, где x - наибольшее или наименьшее значение в вашем наборе данных. Поэтому, если ваши данные от 0 до 10, ваш результат выглядит как бессмыслица, потому что он квантует значения в диапазоне от -10 до 10.

В любом случае вы действительно хотите получить закодированное значение и квантованное значение. Я написал простую функцию для этого. Он даже имеет небольшие инструкции (действительно просто введите «help ValueQuantizer»). Я также сделал его очень гибким, чтобы он работал с любым размером данных (при условии, что у вас достаточно памяти) это может быть вектор, 2d-массив, 3d, 4d .... и т. Д.

вот пример того, как это сделать работает. Наш номер является равномерным распределением от -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. Важной частью является также возвращает квантованных значений, что является то, что вы хотели

здесь функция

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 

Насколько я могу сказать, что это всегда должно работать, но я не сделал обширное тестирование , удачи

Смежные вопросы