2016-03-21 5 views
2

Мне нужна черновая 2D-спектрограмма сигнала в Matlab. Мне нужно это для печатного задания, поэтому трехмерное изображение не имеет смысла. Однако, когда сигнал нанесен с использованием Spectrogram, он автоматически создает 3D-график сигнала.Создание 2D-спектрограммы в Matlab

Мой код:

Dataset  = 1;   % Dataset to be analysed 
N   = 1024;   % Window size 
Beta  = 12;   % Kaiser window beta value (small = narrow main lope) 
Overlap  = 800;   % Window overlap 
Threshold = -150;   % Minimum magnitude before threshold 

spectrogram(Enclosure{Dataset}(1:end),kaiser(N,Beta),Overlap,2048,fs,'MinThreshold',Threshold,'yaxis'); 

который производит график, который выглядит следующим образом:

2D Plot

Но это видно из верхней части, и граф действительно показывает это:

3D plot

T он объясняет, почему мне это нужно, чтобы быть 2D (и почему я не согласен со скриншотом), потому что я использую Matlab2tikz для преобразования фигур Matlab в цифры Tikz в LaTex. с 3D-изображениями я получаю цифры +100 Мб, а 2D уменьшит размер до < 1Mb.

+1

почему бы не сделать 2D участок непосредственно с выходами функции, например, S = спектрограмма(). Затем используйте S, чтобы сделать свой сюжет. – willpower2727

+0

Возможно. Я просто не могу понять, как обрабатывать вывод из функции «спектрограмма». Ось отсутствует где-то рядом с правильным, и при построении она показывает какой-то странный сюжет. –

ответ

1

Я не знаю, какую версию Matlab вы используете, но в 2015a вы должны быть в состоянии получить ручку на фигуру с 3D сюжетом и изменить угол обзора для 2D:

view(0,90); 

у меня также есть пример того, как вы можете сделать свой собственный 2D сюжет из выходов спектрометра() с использованием аналогичного метода:

x = [0:0.01:100]; 
y = sin(5*x); 
y = awgn(y,0.1); 

[S,F,T,P] = spectrogram(y,200,0,length(y)*5,100); 

[m,n] = size(P); 

figure(2) 
surf(F,T,zeros(n,m),P','EdgeColor','none') 
view(0,90) 
xlabel('Frequency') 
ylabel('Time (s)') 

Результат выглядит следующим образом:

enter image description here

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

0

Один из вариантов заключается в том, чтобы зафиксировать все, что было построено, а затем отобразить его как изображение. Вы можете сделать это с помощью getframe

если вы

F=getframe(gca); 
cla; 
imshow(F.cdata); 

Вы получите именно то, что вы будете видеть раньше, но как изображение.

Однако я думаю, что это поражение немного о цели Matlab2Tikz, как идея зева, что у вас есть Tikz код, описывающий данные ...

+0

Да, и весь смысл этого вопроса заключался в том, чтобы найти решение, в котором я мог бы получить полезный выход Tikz. –

+1

@MikkelKroghSimonsen Моя точка зрения: если вы делаете сюжет 2d (то же самое, что и изображение), вы теряете данные.Таким образом, либо у вас есть 3D-версия в TIKz, либо вы делаете 2D-версию без информации. Этот ответ делает то же самое, что и ответ силы, только данные будут сохранены с разными значениями. Если вы не собираетесь играть с цифрами вручную в коде вывода TIKz, это должно работать –

0

Вы можете попробовать следующее:

[~,F,T,ps]=spectrogram(Enclosure{Dataset}(1:end),kaiser(N,Beta),Overlap,2048,fs,'MinThreshold',Threshold,'yaxis'). 
% Output the spectrum in ps 

imagesc(T,F,10*log10(ps)) 
% Generate a 2d image 

view(270,90) 
xlabel('Time [s]') 
ylabel('Frequency [Hz]') 
c=colorbar; 
c.Label.String='Power [dB]'; 
% Extra setting to make the plot look like the spectrogram 

Удачи