#matlab #plot #range #mesh #decibel
#matlab #график #диапазон #сетка #децибел
Вопрос:
Я не смог найти ничего похожего на это с помощью Google, поэтому я боюсь, что сам мой вопрос может быть ошибочным… Тем не менее, здесь идет:
Я хочу отобразить матрицу значений (Z) в различных фиксированных динамических диапазонах. В этом случае фиксируется на 0 дБ, 10 дБ, …, 40 дБ.
Мой текущий подход заключается в том, чтобы найти Zmag = abs (Z). ^ 2, Zn = нормализованный (Zmag), Zdb = 10 * log10 (1 Zn)
Чтобы просмотреть другой динамический диапазон (скажем, 10 дБ), я бы включил ‘Zn (Zn<0,1) = 0,1’ перед поиском Zdb. Для 20 дБ я делаю то же самое, за исключением того, что значение интереса изменяется на 0,01.
Затем я делаю график цветной сетки Zn и просматриваю график XY (сверху, с точки зрения 3D), чтобы увидеть что-то похожее на то, что даст imagesc (Zn). Цель состоит в том, что по мере увеличения динамического диапазона я должен видеть более подробный график (в данном случае с большим количеством цветов между максимальным и минимальным).
Мой текущий метод работает так, как (я думаю) и должен работать для сетки динамического диапазона 10 дБ: 10 дБ по сравнению с графиком сетки динамического диапазона 40 дБ: 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;
@dB 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 , и без примера данных и используемого вами кода трудно найти причину или проблему в коде (если это вообще ошибка).
В любом случае, если ваша цель — отобразить данные (в отличие от любого дальнейшего анализа, который вы, возможно, захотите выполнить), я предлагаю вам сжать динамический диапазон цветовой карты, а не самих данных. Самый быстрый способ сделать это — щелкнуть правой кнопкой мыши на цветовой панели и выбрать «Интерактивный сдвиг цветовой карты», который позволяет вам использовать мышь непосредственно на цветовой панели, чтобы изменить динамический диапазон.
Если вы хотите сделать это программно, создайте несколько пользовательских цветовых карт в соответствии с распределением ваших значений. Например (для простоты я использую только красные значения)
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
Комментарии:
1. К вопросу был добавлен пример кода. Я попробовал то, что вы опубликовали здесь, и, похоже, оно работает так, как я ожидал, но я хотел бы, чтобы диапазоны были ровно 0 дБ, 10 дБ и т.д. диапазоны вместо произвольных.
2. Поскольку цветовая карта представляет собой линейную карту (значения-> индекс карты), вам необходимо найти индекс до предельного значения в отсортированных значениях Zn и использовать его для поиска индекса в цветовой карте, с которого начинается линейное изменение. Например, для 10 дБ Zlim = 0,1, поэтому, если у вас 100 значений данных, 50-е значение (в отсортированных данных) равно 0,1, и 128 цветов, тогда 50 / 100 * 128 = 64, таким образом, индекс для начала ненулевых значений цветовой карты равен 64.
3. У меня возникли проблемы с переходом от того, что вы говорите здесь, к кодированию. У меня есть матрица значений 128×256. Чтобы получить количество значений ниже 0,1, я использую: totsz = prod(size(Zn)); Zlim = 0,01; threshsz = size(Zn(Zn<Zlim)); cmapidx = threshsz(1) / totsz * 128; Как мне перейти отсюда к настройке цветовой карты? Я нашел команду caxis, но я не уверен, поможет ли это. Я использую цвета по умолчанию.