Мне не удалось найти ничего подобного в Google, поэтому я боюсь, что сам мой вопрос может быть ошибочным... Тем не менее, вот:
Я хочу отобразить матрицу значений (Z) в различных фиксированных динамических диапазонах. В данном случае фиксируется на уровне 0 дБ, 10 дБ, ..., 40 дБ.
Мой текущий подход состоит в том, чтобы найти Zmag = abs(Z).^2, Zn = normalized(Zmag), Zdb = 10*log10(1+Zn)
Чтобы просмотреть другой динамический диапазон (скажем, 10 дБ), я бы включил «Zn (Zn‹0,1) = 0,1», прежде чем находить Zdb. Для 20 дБ я делаю то же самое, за исключением того, что интересующее значение меняется на 0,01.
Затем я делаю график цветовой сетки Zn и просматриваю график XY (сверху, с трехмерной точки зрения), чтобы увидеть что-то похожее на то, что дало бы imagesc(Zn). Намерение состоит в том, что по мере увеличения динамического диапазона я должен видеть более подробный график (в данном случае с большим количеством цветов между максимумом и минимумом).
Мой текущий метод работает так, как (я думаю), он должен работать для 10 дБ: сетка динамического диапазона 10 дБ 40 дБ: график сетки динамического диапазона 40 дБ
Однако я не вижу разницы между графиками 0, 20, 30 и 40 дБ. Я ожидаю постепенного увеличения значений от 0 дБ до 40 дБ.
-Дилан
РЕДАКТИРОВАТЬ: Вот пример кода. Это фрагмент реального кода, но он все равно должен работать:
%% 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