Создайте 2D-спектрограмму в Matlab

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

Мой код:

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-график

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

3D-график

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


person Mikkel Krogh Simonsen    schedule 21.03.2016    source источник
comment
почему бы не сделать 2D-график напрямую с выходами функции, например. S = спектрограмма(). Затем используйте S, чтобы сделать свой график.   -  person willpower2727    schedule 21.03.2016
comment
Это возможно. Я просто не могу понять, как обрабатывать вывод функции spectrogram. Ось не совсем правильная, и при построении она показывает какой-то странный сюжет.   -  person Mikkel Krogh Simonsen    schedule 21.03.2016


Ответы (3)


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

view(0,90);

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

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)')

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

введите здесь описание изображения

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

person willpower2727    schedule 21.03.2016

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

если ты сделаешь

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

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

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

person Ander Biguri    schedule 21.03.2016
comment
Да, и весь смысл этого вопроса заключался в том, чтобы найти решение, с помощью которого я мог бы получить полезный вывод Tikz. - person Mikkel Krogh Simonsen; 21.03.2016
comment
@MikkelKroghSimonsen Моя точка зрения такова: если вы сделаете график 2d (то же самое, что и изображение), вы потеряете данные. Так что либо у вас есть 3D-версия в TIKz, либо вы делаете 2D-версию без информации. Этот ответ делает то же самое, что и ответ силы воли, просто данные будут сохранены с другими значениями. Если вы не собираетесь вручную возиться с числами в выходном коде TIKz, это должно работать. - person Ander Biguri; 21.03.2016

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

[~,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

Удачи

person rob    schedule 07.06.2016