Спектрограмма и что это такое - PullRequest
3 голосов
/ 09 января 2012

Мне очень интересно узнать, как генерируется верхняя правая цифра в: http://en.wikipedia.org/wiki/Spectrogram (сценарий) и как ее анализировать, т.е. какую информацию она передает? Я был бы признателен за упрощенный ответ с минимальным математическим жаргоном.Спасибо.

Ответы [ 2 ]

3 голосов
/ 14 января 2012

График показывает время по горизонтальной оси и частоту по вертикальной оси.Цвет пикселя показывает интенсивность каждой частоты в каждый момент времени.

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

здесьэто некоторый код Matlab для его генерации.

Обратите внимание, как при прямом изображении сигнала это выглядит как мусор , но при построении спектрограммы мы можем четко видеть частоты компонентных сигналов.

%%%%%%%%
%% setup
%%%%%%%%

%signal length in seconds
signalLength = 60+10*randn();

%100Hz sampling rate
sampleRate = 100;
dt = 1/sampleRate;

%total number of samples, and all time tags
Nsamples = round(sampleRate*signalLength);
time = linspace(0,signalLength,Nsamples);

%%%%%%%%%%%%%%%%%%%%%
%create a test signal
%%%%%%%%%%%%%%%%%%%%%

%function for converting from time to frequency in this test signal
F1 = @(T)0+40*T/signalLength; #frequency increasing with time
M1 = @(T)1-T/signalLength;    #amplitude decreasing with time

F2 = @(T)20+10*sin(2*pi()*T/signalLength); #oscilating frequenct over time
M2 = @(T)1/2;                              #constant low amplitude

%Signal frequency as a function of time
signal1Frequency = F1(time);
signal1Mag = M1(time);

signal2Frequency = F2(time);
signal2Mag = M2(time);

%integrate frequency to get angle
signal1Angle = 2*pi()*dt*cumsum(signal1Frequency);
signal2Angle = 2*pi()*dt*cumsum(signal2Frequency);

%sin of the angle to get the signal value
signal = signal1Mag.*sin(signal1Angle+randn()) + signal2Mag.*sin(signal2Angle+randn());

figure();
plot(time,signal)


%%%%%%%%%%%%%%%%%%%%%%%
%processing starts here
%%%%%%%%%%%%%%%%%%%%%%%

frequencyResolution = 1
%time resolution, binWidth, is inversly proportional to frequency resolution
binWidth = 1/frequencyResolution;

%number of resulting samples per bin
binSize = sampleRate*binWidth;

%number of bins
Nbins = ceil(Nsamples/binSize);

%pad the data with zeros so that it fills Nbins
signal(Nbins*binSize+1)=0;
signal(end) = [];

%reshape the data to binSize by Nbins
signal = reshape(signal,[binSize,Nbins]);

%calculate the fourier transform
fourierResult = fft(signal);

%convert the cos+j*sin, encoded in the complex numbers into magnitude.^2
mags= fourierResult.*conj(fourierResult);

binTimes = linspace(0,signalLength,Nbins);
frequencies = (0:frequencyResolution:binSize*frequencyResolution);
frequencies = frequencies(1:end-1);

%the upper frequencies are just aliasing, you can ignore them in this example.
slice = frequencies<max(frequencies)/2;

%plot the spectrogram
figure();
pcolor(binTimes,frequencies(slice),mags(slice,:));

Обратное преобразование Фурье матрицы fourierResult вернет исходный сигнал.

0 голосов
/ 24 августа 2013

Просто чтобы добавить ответ Суки, вот отличный учебник, который шаг за шагом проведет вас через чтение спектрограмм Matlab, касаясь лишь математики и физики, достаточных для интуитивного объяснения основных понятий:

http://www.caam.rice.edu/~yad1/data/EEG_Rice/Literature/Spectrograms.pdf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...