Как построить красочную диаграмму созвездия типа гистограммы в Matlab

Я хотел бы построить диаграмму созвездия, подобную рисунку ниже. Красочное созвездие.

Мой подход примерно такой

 clc;
 clear all;
 close all;
 N=30000;                            
 M=16;                               
 Sr=randint(N,1,[0,(M-1)]);          
 S=qammod(Sr,16,0,'gray'); S=S(:);   
 Noisy_Data=awgn(S,20,'measured');       % Add AWGN
 figure(2)
 subplot(1,2,1)
 plot(S,'o','markersize',10);
 grid on
 subplot(1,2,2)
 plot(Noisy_Data,'.');
 grid on

Не могли бы вы помочь мне внести необходимые изменения, чтобы получить график, аналогичный приведенному выше рисунку. Спасибо.


person salmannsu    schedule 27.11.2015    source источник


Ответы (1)


Первое, что нужно сделать, это вычислить двумерную гистограмму ваших данных. Это можно сделать с помощью следующего:

% Size of the histogram matrix
Nx   = 160;
Ny   = 160;

% Choose the bounds of the histogram to match min/max of data samples.
% (you could alternatively use fixed bound, e.g. +/- 4)
ValMaxX = max(real(Noisy_Data));
ValMinX = min(real(Noisy_Data));
ValMaxY = max(imag(Noisy_Data));
ValMinY = min(imag(Noisy_Data));
dX = (ValMaxX-ValMinX)/(Nx-1);
dY = (ValMaxY-ValMinY)/(Ny-1);

% Figure out which bin each data sample fall into
IdxX = 1+floor((real(Noisy_Data)-ValMinX)/dX);
IdxY = 1+floor((imag(Noisy_Data)-ValMinY)/dY);
H = zeros(Ny,Nx);
for i=1:N
  if (IdxX(i) >= 1 && IdxX(i) <= Nx && IdxY(i) >= 1 && IdxY(i) <= Ny)
    % Increment histogram count
    H(IdxY(i),IdxX(i)) = H(IdxY(i),IdxX(i)) + 1;
  end
end

Обратите внимание, что вы можете поиграть с параметрами Nx и Ny, чтобы настроить желаемое разрешение графика. Имейте в виду, что чем больше гистограмма, тем больше выборок данных (управляемых параметром N вашей симуляции) вам потребуется, чтобы иметь достаточно данных в ячейках гистограммы, чтобы избежать получения пятнистого графика.

Затем вы можете построить гистограмму в виде карты цветов на основе этого ответа. При этом вы, вероятно, захотите добавить константу ко всем ненулевым бинам гистограммы, чтобы белая полоса была зарезервирована для бинов с нулевым значением. Это обеспечит лучшую корреляцию с графиком рассеяния. Это можно сделать с помощью:

% Colormap that approximate the sample figures you've posted
map = [1 1 1;0 0 1;0 1 1;1 1 0;1 0 0];

% Boost histogram values greater than zero so they don't fall in the
% white band of the colormap.
S    = size(map,1);
Hmax = max(max(H));
bias = (Hmax-S)/(S-1);
idx = find(H>0);
H(idx) = H(idx) + bias;

% Plot the histogram
pcolor([0:Nx-1]*dX+ValMinX, [0:Ny-1]*dY+ValMinY, H);
shading flat;
colormap(map);

После увеличения N до 1000000 это дает следующий график для данных, сгенерированных в соответствии с вашим образцом:

16-QAM с шумом AWGN - график гистограммы

person SleuthEye    schedule 29.11.2015
comment
Большое спасибо за вашу помощь и объяснение. Какую спецификацию цвета необходимо использовать, чтобы получить график, подобный прикрепленной ссылке. ссылка Как установить оптимальную цену значение карты$ '= [1 1 1;0 0 1;0 1 1;1 1 0;1 0 0]'. Спасибо - person salmannsu; 30.11.2015
comment
Тот, что по ссылке, выглядит примерно так: [39 35 94; 61 97 173; 107 203 227; 159 207 98; 248 238 27; 245 131 34; 236 36 36; 222 31 38; 188 35 37; 144 25 27; 124 19 23]/255. В этом нет ничего оптимального, просто взяли программу рисования, чтобы прочитать значения пикселей цвета RGB. - person SleuthEye; 30.11.2015
comment
Я пытаюсь получить тот же сюжет для S=qammod(Sr,64,0,'gray'); S=S(:); Таким образом, я изменил код ValMaxX = 8; ValMinX = -8; ValMaxY = 8; ValMinY = -8; dX = (ValMaxX-ValMinX)/(Nx-1); dY = (ValMaxY-ValMinY)/(Ny-1); Но он запутался. Можете ли вы предложить мне некоторые изменения. Спасибо - person salmannsu; 30.11.2015
comment
Не уверен, что вы бы назвали «испорченным», но чтобы сохранить то же разрешение, вам придется удвоить Nx и Ny, а затем соответственно увеличить N, чтобы количество бинов оставалось одинаковым. - person SleuthEye; 30.11.2015
comment
Спасибо большое.. Можно было бы решить, увеличив размер матрицы гистограммы. - person salmannsu; 30.11.2015