Спектрограмма показывает правильные значения?

Я хочу знать, является ли spectrogram, размещенный ниже, истинным представлением данного нестационарного сигнала.

Если это правдивое изображение, у меня есть ряд вопросов, касающихся особенностей сюжета...

Почему для 0->.25 по горизонтальной оси отображаются компоненты сигнала вплоть до самых высоких частот? Я предполагаю, что, учитывая первую продолжительность t1, я должен видеть только частоту сигнала x1. Кроме того, учитывая вторую длительность t2, я должен видеть только частоту сигнала x2 и так далее. Но это не то, что я вижу в размещенном ниже spectrogram.

Не могли бы вы объяснить, почему мы видим эти особенности на спектрограмме?

Спектрограмма с уравнениями введите здесь описание изображения

Код:

% 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);

 x1 = (10)*sin(2*pi*10*t1);
x2 = (10)*sin(2*pi*20*t2) + x1;
x3 = (10)*sin(2*pi*30*t3) + x2;
x4 = (10)*sin(2*pi*40*t4) + x3;


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

 T = 0:.01:1;
 spectrogram(x4,10,9,NFFT);
 ylabel('Frequency');
 axis(get(gcf,'children'), [0, 1, 1, 50]);

Обновление_1: когда я попробовал предложенный ответ, я получил следующее.

??? Out of memory. Type HELP MEMORY for your options.
Error in ==> spectrogram at 168
y = y(1:length(f),:);
Error in ==> stft_1 at 36
spectrogram(x,10,9,NFFT);

Используемый код:

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

%get a full-length example of each signal component
x1 = (10)*sin(2*pi*10*t);
x2 = (10)*sin(2*pi*20*t);
x3 = (10)*sin(2*pi*30*t);
x4 = (10)*sin(2*pi*40*t);

%construct a composite signal
x = zeros(size(t));
I = find((t >= t1(1)) & (t <= t1(end)));
x(I) = x1(I);
I = find((t >= t2(1)) & (t <= t2(end)));
x(I) = x2(I);
I = find((t >= t3(1)) & (t <= t3(end)));
x(I) = x3(I);
I = find((t >= t4(1)) & (t <= t4(end)));
x(I) = x4(I);

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

T = 0:.01:1;
spectrogram(x,10,9,NFFT);
ylabel('Frequency');
  axis(get(gcf,'children'), [0, 1, 1, 50]);

Обновление_2

% 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);

  %get a  full-length example of each signal component
 x1 = (10)*sin(2*pi*100*t);
 x2 = (10)*sin(2*pi*200*t);
 x3 = (10)*sin(2*pi*300*t);
 x4 = (10)*sin(2*pi*400*t);

 %construct a composite signal
 x = zeros(size(t));
 I = find((t >= t1(1)) & (t <= t1(end)));
 x(I) = x1(I);
 I = find((t >= t2(1)) & (t <= t2(end)));
 x(I) = x2(I);
 I = find((t >= t3(1)) & (t <= t3(end)));
 x(I) = x3(I);
 I = find((t >= t4(1)) & (t <= t4(end)));
 x(I) = x4(I);

 NFFT = 2 ^ nextpow2(length(t));     % Next power of 2 from length of y
 Y    = fft(x, 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(x,10,9);
 ylabel('Frequency');
 axis(get(gcf,'children'), [0, 1, 1, 100]);

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


person rmaik    schedule 30.12.2014    source источник


Ответы (1)


Я не думаю, что вы замышляете то, что, по вашему мнению, замышляете. Вы должны построить сигнал во временной области, чтобы убедиться, что он выглядит так, как вы ожидаете...plot(x4). Я думаю, что вы думаете, что ваш сигнал - это x1, затем x2, затем x3, затем x4. Однако, судя по коду Matlab, который вы показываете, это не так.

Вместо этого ваш сигнал представляет собой сумму x1+x2+x3+x4 друг над другом. В результате вы должны увидеть компоненты сигнала на частотах 10, 20, 30, 40 Гц, а также другие компоненты из-за переходного процесса запуска сигналов.

Чтобы получить сигнал, который вы хотите, вы должны сделать что-то вроде:

%get a full-length example of each signal component
t = (0:dt:StopTime-dt);
x1 = (10)*sin(2*pi*10*t);
x2 = (10)*sin(2*pi*20*t);
x3 = (10)*sin(2*pi*30*t);
x4 = (10)*sin(2*pi*40*t);

%construct a composite signal from the four signals above
x = zeros(size(t)); %allocate an empty vector of the correct size
I = find((t >= t1(1)) & (t <= t1(end)));
x(I) = x1(I);
I = find((t >= t2(1)) & (t <= t2(end)));
x(I) = x2(I);
I = find((t >= t3(1)) & (t <= t3(end)));
x(I) = x3(I);
I = find((t >= t4(1)) & (t <= t4(end)));
x(I) = x4(I);

Затем вы можете построить свой новый сигнал x во временной области (plot(x)), чтобы убедиться, что это именно то, что вам нужно. Наконец, вы можете выполнить свой spectrogram.

Обратите внимание, что вы увидите артефакты на спектрограмме при переходе между каждым периодом времени (между t1 и t2, между t2 и t3, а затем между t3 и t4). Артефакты сигнала будут отражать сложность сигнала во время прерывистого перехода между различными частотами сигнала.

person chipaudette    schedule 31.12.2014
comment
Спасибо за ответ, я попробовал, но получил ошибку, указанную выше в разделе update_1. Я также разместил код. Пожалуйста, взгляните на это - person rmaik; 31.12.2014
comment
Также после прочтения вашего кода я не знаю, какой сигнал относится к какому временному интервалу. и как t1,t2,t3,t4 определены - person rmaik; 31.12.2014
comment
от t1 до t4 определяются так же, как и в исходном коде. Что касается того, какой сигнал и в какое время, мой код показывает, что x1 копируется в период времени, определяемый t1, x2 - в период времени t2, x3 - в t3 и x4 - в t4. - person chipaudette; 31.12.2014
comment
пожалуйста, взгляните на раздел update_2 и его результирующую спектрограмму в spectrogram_2 - person rmaik; 01.01.2015