Как изменить диапазон значений графика, сгенерированного функцией спектрограммы

На размещенном ниже изображении я пытаюсь получить TFR с помощью STFT, В размещенном коде я указал параметр T = 0:.001:1; и когда я изменяю его, например, T = 0:.001:2; диапазон значений на горизонтальной оси графика изменяется, несмотря на то, что он помечен Frequency,

Теперь я хочу изменить диапазоны значений горизонтальной и вертикальной осей на показанном графике. Как я могу это сделать?

ПРИМЕЧАНИЕ: код, используемый для генерации показанного графика:

T = 0:.001:1;
spectrogram(x4,128,50,NFFT);

КОД:

% Time specifications:
 Fs = 8000;                       % samples per second
 dt = 1/Fs;                       % seconds per sample
 StopTime = 1;                    % seconds
  t = (0:dt:StopTime-dt);             % seconds

  t1 = (0:dt:.25);
   t2 = (.25:dt:.50);
  t3 = (.5:dt:.75);
  t4 = (.75:dt:1);

  %two freqs. = abs(f1 - f2), that's why, x1 is plotted with 2 freqs.
  x1 = (10)*sin(2*pi*30*t1);
  x2 = (10)*sin(2*pi*60*t2) + x1;
  x3 = (10)*sin(2*pi*90*t3) + x2;
  x4 = (10)*sin(2*pi*120*t4) + x3;
  %x5 = (10) * sin(2*pi*5*t5);
  %x6 = x1 + x2 + x3 + x4 + x5;

  NFFT = 2 ^ nextpow2(length(t));     % Next power of 2 from length of y
  Y    = fft(x3, NFFT);
  f    = Fs / 2 * linspace(0, 1, NFFT/2 + 1);
  figure;
  plot(f(1:200), 2 * abs( Y( 1:200) ) );

  T = 0:.001:1;
  spectrogram(x4,10,9,31);
   axis(get(gcf,'children'), [0, 1,0,100]);

% Plot the signal versus time:
figure;
xlabel('time (in seconds)');
ylabel('Amplitude');
title('non-stationary Signal versus Time');

 hold on
 plot(t1,x1,'r');
plot(t2,x2,'g');
plot(t3,x3,'b');
plot(t4,x4,'black');
%plot(t5,x5,'y');
%plot(t, x6,'black');
legend('x1 = (10)*sin(2*pi*15*t1) + (10)*sin(2*pi*8*t1)', 'x2 = (10)*sin(2*pi*25*t2) + x1',   
'x3 = (10)*sin(2*pi*50*t3) + x2', 'x4 = (10)*sin(2*pi*75*t4) + x3', ...
'Location',  'SouthWest');

образ

новый результат_1

1 ответ

Решение

Идея: получить axis был использован для построения спектрограммы и соответственно установить ее свойства. Например, предположим, что вы хотите ограничить диапазон x до [0, 0.5] и y до [100, 200], тогда:

%'old code here'
%' . . . '
spectrogram(x4,128,50,NFFT);

%'new code here'
axis(get(gcf,'children'), [0, 0.5, 100, 200]);

Пояснение: Добавлен однострочник gets дочерний дескриптор текущей фигуры gcf (который предполагается создать spectrogram), затем устанавливает диапазон [xmin, xmax, ymin, ymax] с помощью axis вызов.

Nota Bene: Я предполагаю, что вам просто нужно изменить масштаб оси, а не пересчитать spectrogram для разных данных.

Также я предполагаю, что спектрограмма не разделяет свою фигуру с другими осями.

Кроме того, расширение диапазона осей, а не ограничение его, может не дать ожидаемых результатов (одним словом: безобразно).

Другие вопросы по тегам