2011-11-01 3 views
2

Google과 관련하여 아무 것도 찾을 수 없었으므로 내 질문 자체에 결함이있을 수 있습니다.MATLAB : 대수 값 플롯의 동적 범위 조정

다양한 고정 동적 범위에 값 (Z) 행렬을 표시하고자합니다. 이 경우 0dB, 10dB, ..., 40dB로 고정됩니다.

나의 현재 접근 Zmag = ABS (Z)을 찾는 것이다.^2, 아연 = ZDB가 = (Zmag) 정규화 * LOG10 10 (1 + 아연)

다른 동적 범위를 이용하기 위해서 (말하자면, 10dB) Zdb를 찾기 전에 'Zn (Zn < 0.1) = 0.1'을 포함합니다. 20dB에 대해서는 0.01의 관심 값이 변경되는 것을 제외하고는 똑같이합니다.

그런 다음 Zn의 컬러 메시 플롯을 만들고 XY (맨 위, 3D 관점에서) 플롯을보고 이미지 C (Zn)와 비슷한 것을 확인합니다. 동적 범위를 늘리면 더 자세한 그림이 표시됩니다 (이 경우 최대 값과 최소값 사이에 더 많은 색상이 있음).

내 현재의 방법은 10dB 것이해야한다 (내가 생각하는)로 수행 그러나 40dB dynamic range mesh plot

, 내 0,20,30 사이의 차이를 볼 수 없으며, 40dB 플롯 : 10dB dynamic range mesh 에 비해 40dB로 . 0dB에서 40dB까지 점차적으로 값이 증가 할 것으로 기대됩니다.

- 딜란

편집 : 여기에 몇 가지 샘플 코드가 있습니다. 그것은 실제 코드의 SNIPPIT이지만, 여전히 실행해야합니다

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

몇/압축 동적 범위를 확장하는 방법 및 임계 값은 아래있다가 하나입니다. 당신은 위의 임계 값 수 있습니다, 또는 당신은 부드러운 기능을 사용하여 동적 범위의 '부드러운'압축을 할 수 있습니다.

당신이 볼 것으로 예상되는 점진적인 증가는 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 
+0

예제 코드가 질문에 추가되었습니다. 나는 당신이 여기에 올린 것을 시도해 보았고, 그것이 내가 기대할 수있는 방식으로 작동하는 것처럼 보이지만, 정확히 0dB, 10dB 등의 범위를 임의로 대신 사용하고 싶습니다. – Dylan

+0

색상 맵은 선형 맵 (값 -> 맵 인덱스)이므로 정렬 된 Zn 값의 제한 값에 대한 인덱스를 찾아이를 사용하여 선형 변경을 시작할 색상 맵의 인덱스를 찾아야합니다. 예를 들어 10dB의 경우 Zlim = 0.1이므로 데이터 값이 100 개인 경우 50 번째 값 (정렬 된 데이터)은 0.1이고 128 색, 50/100 * 128 = 64이므로 0이 아닌 값을 시작하는 인덱스 의 색상 표는 64입니다. –

+0

우수! 나는 이것을 시험해 볼 것이다, 고마워! – Dylan