2

我一直无法通过谷歌找到任何与此相关的东西,所以我担心我的问题本身可能有缺陷......不过,这里是:

我希望在各种固定动态范围内显示值 (Z) 矩阵。在这种情况下,固定为 0dB、10dB、...、40dB。

我目前的方法是找到 Zmag = abs(Z).^2, Zn = normalized(Zmag), Zdb = 10*log10(1+Zn)

为了查看不同的动态范围(例如 10dB),我会在找到 Zdb 之前包含“Zn(Zn<0.1)=0.1”。对于 20dB,我做同样的事情,只是感兴趣的值变为 0.01。

然后我做了一个 Zn 的彩色网格图并查看 XY(顶部,从 3D 透视图)图,以查看类似于 imagesc(Zn) 给出的结果。目的是当我增加动态范围时,我应该看到更详细的图(在这种情况下,最大值和最小值之间有更多颜色)。

我当前的方法是(我认为)它应该为 10dB:10dB 动态范围网格 与 40dB 相比:40dB 动态范围网格图

但是,我看不出我的 0、20、30 和 40dB 图之间有什么区别。我希望值会从 0dB 逐渐增加到 40dB。

-迪伦

编辑:这是一些示例代码。它是真实代码的片段,但仍应运行:

%% 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
4

1 回答 1

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
于 2011-11-01T08:08:37.230 回答