MATLAB: Настройка динамического диапазона графика логарифмических значений

Мне не удалось найти ничего подобного в 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

person Dylan    schedule 01.11.2011    source источник


Ответы (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
person Itamar Katz    schedule 01.11.2011
comment
Пример кода был добавлен к вопросу. Я попробовал то, что вы разместили здесь, и, похоже, это работает так, как я ожидал, но я хотел бы иметь диапазоны точно в 0 дБ, 10 дБ и т. д., а не произвольные. - person Dylan; 01.11.2011
comment
Поскольку карта цветов является линейной картой (значения-›индекс карты), вам нужно найти индекс предельного значения в ваших отсортированных значениях Zn и использовать его, чтобы найти индекс в карте цветов, с которого следует начать линейное изменение. Например, для 10 дБ Zlim = 0,1, поэтому, если у вас есть 100 значений данных, 50-е значение (в отсортированных данных) равно 0,1 и 128 цветов, тогда 50/100 * 128 = 64, поэтому индекс для начала ненулевых значений цветовой карты 64. - person Itamar Katz; 01.11.2011
comment
У меня проблемы с переходом от того, что вы здесь говорите, к коду. У меня есть матрица значений 128x256. Чтобы получить количество значений ниже 0,1, я использую: totsz = prod(size(Zn)); Злим = 0,01; threshsz = размер(Zn(Zn‹Zlim)); cmapidx = threshsz(1)/totsz * 128; Как мне перейти отсюда к настройке цветовой карты? Я нашел команду caxis, но не уверен, что она поможет. Я использую цвета по умолчанию. - person Dylan; 01.11.2011