Создать 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 (и почему я не согласен со снимком экрана), заключается в том, что я использую Matlab2tikz
преобразовать числа Matlab в числа Tikz в LaTex. с 3D-изображениями я получаю цифры +100 МБ, а 2D уменьшит размер до <1 МБ.
3 ответа
Я не знаю, какую версию Matlab вы используете, но в 2015a вы сможете получить ручку для фигуры с трехмерным графиком и изменить угол обзора на 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)')
Вывод выглядит так:
Надеюсь, поскольку информации о высоте нет, размер фигуры может быть меньше, но я не могу это проверить, поскольку у меня нет Matlab2tikz.
Вы можете попробовать следующее:
[~,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
Удачи
Один из вариантов - захватить все, что на нем нанесено, а затем построить его как изображение. Вы можете сделать это используя getframe
если вы делаете
F=getframe(gca);
cla;
imshow(F.cdata);
Вы получите именно то, что увидите раньше, но в качестве изображения.
Однако я думаю, что это немного противоречит цели Matlab2Tikz, как идеи о том, что у вас есть код Tikz, описывающий ваши данные...