MATLAB: настройка динамического диапазона графика логарифмических значений - PullRequest
2 голосов
/ 01 ноября 2011

Мне не удалось найти ничего похожего на 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. </p>

Затем я делаю график цветовой сетки Zn и просматриваю график XY (сверху, с трехмерной перспективы), чтобы увидеть нечто похожее на то, что дало бы imagesc (Zn). Намерение состоит в том, чтобы по мере увеличения динамического диапазона я видел более детальный график (в данном случае больше цветов между максимумом и минимумом).

Мой текущий метод работает так (я думаю), что должен для 10dB: 10dB mesh динамического диапазона По сравнению с 40 дБ: 40 дБ для сетки с динамическим диапазоном

Однако я не вижу разницы между моими участками 0,20,30 и 40 дБ. Я ожидаю постепенного увеличения значений с 0 дБ до 40 дБ.

-Dylan

РЕДАКТИРОВАТЬ: Вот пример кода. Это фрагмент реального кода, но он все равно должен работать:

%% 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 Ответ

1 голос
/ 01 ноября 2011

Существует несколько методов сжатия / расширения динамического диапазона, и пороговое значение снизу - всего лишь один.Вы можете выполнить пороговое значение сверху или сделать более мягкое сжатие динамического диапазона, используя более плавную функцию.

Постепенное увеличение, которое вы ожидаете увидеть, зависит от распределения значений 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
...