Как изменить диапазон значений графика, сгенерированного функцией спектрограммы
На размещенном ниже изображении я пытаюсь получить 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]);
Пояснение: Добавлен однострочник get
s дочерний дескриптор текущей фигуры gcf
(который предполагается создать spectrogram
), затем устанавливает диапазон [xmin, xmax, ymin, ymax]
с помощью axis
вызов.
Nota Bene: Я предполагаю, что вам просто нужно изменить масштаб оси, а не пересчитать spectrogram
для разных данных.
Также я предполагаю, что спектрограмма не разделяет свою фигуру с другими осями.
Кроме того, расширение диапазона осей, а не ограничение его, может не дать ожидаемых результатов (одним словом: безобразно).