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

На приведенном ниже изображении я пытаюсь получить 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 введите здесь описание изображения


person rmaik    schedule 30.12.2014    source источник
comment
@Schorsch я разместил код   -  person rmaik    schedule 30.12.2014
comment
Если я копирую/вставляю этот код, он говорит мне, что T не используется. Изменение T не влияет на сюжет. Пожалуйста, рассмотрите возможность уточнения вашего вопроса.   -  person Schorsch    schedule 30.12.2014
comment
Проблема с белой полосой между 0.967 и 1.0 заключается в том, что в вашем коде вы устанавливаете 4-й вход на spectrogram на 31. Однако в документации это указано как the FFT length, что в вашем случае 8192.   -  person Schorsch    schedule 30.12.2014
comment
@Schorsch хорошо, в моем коде я указал, что Y = fft (x4, NFFT); и после прочтения вашего предложения я изменил параметры спектрограммы на спектрограмму (x4,10,9, длина (y)); но теперь, когда я запускаю Matlab, этот параметр не принимается   -  person rmaik    schedule 30.12.2014
comment
@Schorsch Хорошо, я решил эту проблему, я просто указал NFFT без длины в качестве 4-го параметра спектрограммы.   -  person rmaik    schedule 30.12.2014


Ответы (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]);

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

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

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

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

person Community    schedule 30.12.2014
comment
спасибо за идею. пожалуйста, посмотрите на новое опубликованное изображение после применения вашего предложения. 1- почему интервал на горизонтальной оси, который находится чуть раньше 1, выделен белым цветом? 2- как я могу прочитать этот график? Это правильное представление STFT? - person rmaik; 30.12.2014
comment
@rmaik 1 - Не могли бы вы поделиться кодом модификации диапазона, который вы использовали? Я не хочу гадать, так как проще посмотреть на это. 2 - Ну, вы читаете это как спектрограмму. :-) Цвет точки (x,y) на графике показывает мощность определенной гармоники (ось x), рассчитанную STFT в определенный момент (ось y). - person ; 30.12.2014
comment
Что касается чтения спектрограммы, от 0 до 0,25 секунды у меня должен быть сигнал с пиками 30 * 0,25, потому что это 30 циклов в секунду. но на спектрограмме диапазон по оси горизонта от 0 до >.25 имеет много соответствующих отсчетов по вертикальной оси как бы от 0 до >.25 сек. есть сигналы многих частот. Еще одна вещь: после того, как я изменил диапазон осей, как вы ранее предлагали, теперь я хочу изменить имя вертикальной оси? как я могу это сделать пожалуйста - person rmaik; 30.12.2014
comment
@rmaik Для части чтения спектрограммы: вы добавляете x1, x2, x3, x4, а не объединяете их; ваш сигнал длится всего четверть секунды вместо секунды. Таким образом, у вас нет разных спектров в разное время (что видно на графике). Я думаю, было бы неплохо, если бы вы четко указали, какова цель кода и что вы ожидаете в результате публикации, чтобы мы избегали длительных сеансов вопросов и ответов в комментариях. - person ; 30.12.2014
comment
@rmaik Для y-маркировки оси y: mathworks.com/help/matlab/ ref/ylabel.html и проверьте файл ylabel(ax,___). Также проверьте справку по форматированию и аннотациям: mathworks.com/help/matlab/ форматирование-и-аннотация.html - person ; 30.12.2014