我一直無法找到任何接近谷歌的東西,所以我恐怕我的問題本身可能有缺陷......無論如何,這裏是: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
示例代碼已添加到問題中。我嘗試了你在這裏發佈的內容,它似乎符合我的期望,但我希望範圍在0dB,10dB等範圍內而不是任意的。 – Dylan
由於顏色映射是線性映射(值 - >映射索引),因此必須在已排序的Zn值中找到限制值的索引,並使用它來查找顏色映射中用於啓動線性更改的索引。例如,對於10dB,Zlim = 0.1,所以如果有100個數據值,第50個值(在排序數據中)爲0.1,128種顏色,則50/100 * 128 = 64,因此開始非零值的索引的色圖是64. –
非常好!我會試試這個,謝謝! – Dylan