2017-08-01 52 views
2

我想將非常方便的函數uencode Matlabs signal封裝到C++中。將浮點範圍[-1,1]映射/量化到整數

uencode可用於將浮點範圍映射到基於2的冪的整數,而不會將其截斷。見下面的圖片:

matlap uencode plot

我目前的倍頻實現相同的功能(這是我希望以後移植到C++)的:

1; 
function ret = uencode (u, n) 
    val = power(2, n) - 1; 
    ret = ((u/2) * val) + (val/2); 
endfunction 

u = -1:0.01:1; 
y = uencode(u, 2); 
plot(u, y, '..'); 
grid on 

它產生正確的範圍,但是,我掙扎使步驟與uencode一樣順暢,roundfloorceil都不會給我正確的結果。

任何想法讚賞!

+0

,你會不得不看看UUENCODE補丁倍頻鍛造信號? http://savannah.gnu.org/support/download.php?file_id=30815 – Andy

+0

@我沒有。我只注意到uencode沒有在信號中實現。感謝您的鏈接! – Leandros

回答

2

例如, floor要做你想做的事,未接地的輸出範圍應該從0到接近4,而不是從0到3.下面的代碼(在Matlab中測試過)做你想要的。

function ret = uencode (u, n) 
    % output range 
    val = power(2,n) - 1; 

    % map input to output 
    ret = (u+1)*(val+1)/2; 

    % truncate to integer 
    ret = floor(ret); 

    % handle u~1 
    ret(u > (1-1e-12)) = power(2,n) - 1; 
end 

由於輸入範圍現在映射爲[0,4]的輸入u = 1會給4作爲輸出,因此最後一個表達式設置足夠接近1的任何值(1E-12內這裏)到最大輸出值。

編輯:用以下代替最後一個表達式,以正確處理[-1,1]範圍之外的輸入。

% handle u out of range 
ret(u >= 1) = power(2,n) - 1; 
ret(u <= -1) = 0; 

EDIT2:這裏的功能與上述修改的圖像: uencode function with clipping

+0

太棒了!謝謝,這很好! – Leandros

+0

不錯。你願意將該代碼貢獻給Octave信號包嗎? –