2011-11-01 52 views
2

我一直無法找到任何接近谷歌的東西,所以我恐怕我的問題本身可能有缺陷......無論如何,這裏是:MATLAB:調整對數值圖的動態範圍

我希望在不同的固定動態範圍內顯示值的矩陣(Z)。在這種情況下,固定在0dB,10dB,...,40dB。

我目前的做法是尋找Zmag = ABS(Z)。^ 2,鋅=歸一化的(Zmag),ZDB = 10 *日誌10(1 + Zn)的

爲了查看不同的動態範圍(比如10dB)我會在找到Zdb之前包括'Zn(Zn < 0.1)= 0.1'。對於20dB,我也是這樣做的,除了感興趣的值變爲0.01。

然後,我做了一個Zn的彩色網格圖,並查看XY(從3D透視圖的頂部)圖來看到類似於圖像c(Zn)會給出的東西。目的是當我增加動態範圍時,我應該看到更詳細的情節(在這種情況下,最大和最小之間的顏色更多)。

我現在的方法進行的(我覺得)它應該10分貝:10dB dynamic range mesh 相比40分貝:40dB dynamic range mesh plot

不過,我看不到我的0,20,30之間的差異,並40分貝地塊。我預計在0dB到40dB之間會有一個逐漸增加的值。

-Dylan

編輯:這裏是一些示例代碼。這是真正的代碼SNIPPIT,但仍應運行:

%% Constants 
fnum = 1; 
Fc = 1/16; 
taup = 128; 
taumin = 1; 
taumax = 512; 
taux = taumin:taumax; 

%% Signal 
l = 1:16; %Signal length 
s = sin(2*pi*Fc*l); %Original Signal 
sig = zeros([1 taup+512]); 
sig(taup:taup+size(l,2)-1) = s; 

[mfr,fdy] = MatchedFilterResponse(sig,taup,l); 
Z = mfr; 

slices = true; 
%full dynamic range 
name = 'Short Tone Ping results with 0dB range'; 
Zmag = abs(Z).^2; 
Zn = normalizeMat(Zmag); 
Zdb = 10*log10(1+Zn); 
fnum = plotSurfaces(taux,fdy,Zdb,fnum,name,slices); 

slices = false; 
%40dB dynamic range 
name = 'Short Tone Ping results with 40dB range'; 
Z40mag = Zmag; 
Z40n = normalizeMat(Z40mag); 
Z40n(Z40n<0.0001) = 0.0001; 
Z40db = 10*log10(1+Z40n); 
fnum = plotSurfaces(taux,fdy,Z40db,fnum,name,slices); 

function [mfr,fdy] = MatchedFilterResponse(sig,taup,l) 
    Fdmin = -1/16; 
    Fdmax = 1/16; 
    Fdinc = (0.125)/(255); 
    fdy = linspace(Fdmin,Fdmax,256); 
    i = 0; 
    for tau = 1:512 
     i = i+1; 
     j = 0; 
     for Fd = Fdmin:Fdinc:Fdmax 
      j = j+1; 
      a = sig(l+taup-1); 
      b = sig(l+tau).*exp(1i*2*pi*Fd*l); 
      mfr(j,i) = sum(a.*b); 
     end 
    end 
return 
end 

function [fnum] = plotSurfaces(taux,fdy,z,fnum,name,slices) 
    fid = figure(fnum); 
    axes1 = axes('Parent',fid); 
    grid(axes1,'on'); 
    hold(axes1,'all'); 
    msh = mesh(taux,fdy,z,'Parent',axes1); 
    xlabel ('Delay - seconds'); 
    ylabel ('Frequency offset from center frequency - Cycles/sample'); 
    zlabel ('Ambiguity function (Normalized Magnitude-Squared)','Visible','off'); 
    fname = strcat(name,' (Ambiguity Function z(\tau;F_d))'); 
    title(fname); 
    ax = axis; 
    axis([50 200 ax(3) ax(4)]) 
    cb = colorbar('peer',axes1); 
    set(get(cb,'ylabel'),'String','Magnitude-Squared (dB)'); 
    hold off; 
    fnum = fnum + 1; 
    return 
end 

回答

1

有壓縮/擴展動態範圍的一些方法,和閾值從下面只是其中的一個。您可以從上面選擇閾值,或者使用更平滑的函數對動態範圍進行「更柔和」的壓縮。

你期望看到的逐漸增加取決於Zn的價值分佈,沒有數據和你使用的代碼的例子,很難找到代碼中的原因或問題(如果它是一個bug )。無論如何,如果你的目標是顯示數據(而不是你想做的任何進一步分析),我建議你壓縮色彩地圖的動態範圍,而不是數據本身。最快的方法是右鍵單擊顏色條並選擇「交互式顏色映射偏移」,這使您可以直接在colrbar上使用鼠標以更改動態範圍。

如果您想以編程方式執行此操作,請根據值的分佈創建一些自定義色彩映射。例如(爲簡單起見,我僅使用紅色值)

data = 10 .^ randn(100,100);      % large dynamic range data 
ncols = 128;          % number of colors in the colormap 
R1 = [linspace(0,1, 10)'; ones(ncols - 10, 1); ]; % colormap for the small values 
R2 = [zeros(ncols - 10, 1); linspace(0,1,10)']; % colormap for the large values 
G = zeros(ncols, 1); 
B = zeros(ncols, 1); 
cmap1 = [R1, G, B]; 
cmap2 = [R2, G, B]; 

figure 
subplot(1,2,1) 
rgbplot(cmap1) % plot the colormap values 
subplot(1,2,2) 
imagesc (data) % plot the data 
colormap(cmap1) 
colorbar 

figure 
subplot(1,2,1) 
rgbplot(cmap2) 
subplot(1,2,2) 
imagesc (data) 
colormap(cmap2) 
colorbar 
+0

示例代碼已添加到問題中。我嘗試了你在這裏發佈的內容,它似乎符合我的期望,但我希望範圍在0dB,10dB等範圍內而不是任意的。 – Dylan

+0

由於顏色映射是線性映射(值 - >映射索引),因此必須在已排序的Zn值中找到限制值的索引,並使用它來查找顏色映射中用於啓動線性更改的索引。例如,對於10dB,Zlim = 0.1,所以如果有100個數據值,第50個值(在排序數據中)爲0.1,128種顏色,則50/100 * 128 = 64,因此開始非零值的索引的色圖是64. –

+0

非常好!我會試試這個,謝謝! – Dylan