спектрограмма

Спектрограмма, использующая кратковременное преобразование Фурье

Синтаксис

s = spectrogram(x)
s = spectrogram(x,window)
s = spectrogram(x,window,noverlap)
s = spectrogram(x,window,noverlap,nfft)
[s,w,t] = spectrogram(___)
[s,f,t] = spectrogram(___,fs)
[s,w,t] = spectrogram(x,window,noverlap,w)
[s,f,t] = spectrogram(x,window,noverlap,f,fs)
[___,ps] = spectrogram(___)
[___] = spectrogram(___,'reassigned')
[___,ps,fc,tc] = spectrogram(___)
[___] = spectrogram(___,freqrange)
[___] = spectrogram(___,'MinThreshold',thresh)
[___] = spectrogram(___,spectrumtype)
spectrogram(___)
spectrogram(___,freqloc)

Описание

пример

s = spectrogram(x) возвращает кратковременное преобразование Фурье входного сигнала, x. Каждый столбец s содержит оценку краткосрочного, локализованного временем содержимого частоты x.

s = spectrogram(x,window) использование window, чтобы разделить сигнал на сегменты и выполнить работу с окнами.

пример

s = spectrogram(x,window,noverlap) использование выборки noverlap перекрытия между смежными сегментами.

пример

s = spectrogram(x,window,noverlap,nfft) использование выборка nfft указывает, чтобы вычислить дискретное преобразование Фурье.

[s,w,t] = spectrogram(___) возвращает вектор нормированных частот, w и вектора моментов времени, t, в котором вычисляется спектрограмма. Этот синтаксис может включать любую комбинацию входных параметров от предыдущих синтаксисов.

пример

[s,f,t] = spectrogram(___,fs) возвращает вектор циклических частот, f, выраженного с точки зрения частоты дискретизации, fs. fs должен быть пятым входом к spectrogram. Чтобы ввести частоту дискретизации и все еще использовать значения по умолчанию предыдущих дополнительных аргументов, задайте эти аргументы как пустые, [].

пример

[s,w,t] = spectrogram(x,window,noverlap,w) возвращает спектрограмму на нормированных частотах, заданных в w.

[s,f,t] = spectrogram(x,window,noverlap,f,fs) возвращает спектрограмму на циклических частотах, заданных в f.

[___,ps] = spectrogram(___) также возвращает матрицу, ps, содержа оценку степени спектральной плотности (PSD) или спектр мощности каждого сегмента.

пример

[___] = spectrogram(___,'reassigned') переприсвоения каждый PSD или спектр мощности оценивают к местоположению его центра энергии. Если ваш сигнал содержит хорошо локализованные временные или спектральные компоненты, то эта опция генерирует более резкую спектрограмму.

пример

[___,ps,fc,tc] = spectrogram(___) также возвращает две матрицы, fc и tc, содержа частоту и время центра энергии каждого PSD или оценки спектра мощности.

[___] = spectrogram(___,freqrange) возвращает PSD или оценку спектра мощности по частотному диапазону, заданному freqrange. Допустимыми опциями для freqrange является 'onesided', 'twosided' и 'centered'.

пример

[___] = spectrogram(___,'MinThreshold',thresh) обнуляет те элементы ps, таким образом что 10 log10 (ps) ≤ thresh. Задайте thresh в децибелах.

[___] = spectrogram(___,spectrumtype) возвращает оценки PSD, если spectrumtype задан как 'psd' и возвращает оценки спектра мощности, если spectrumtype задан как 'power'.

пример

spectrogram(___) без выходных аргументов строит спектрограмму в окне текущей фигуры.

пример

spectrogram(___,freqloc) задает ось, на которой можно построить частоту.

Примеры

свернуть все

Сгенерировать Nx=1024 выборки сигнала, который состоит из суммы синусоид. Нормированные частоты синусоид 2π/5 рад/выборка и 4π/5 рад/выборка. Более высокая синусоида частоты имеет 10 раз амплитуду другой синусоиды.

N = 1024;
n = 0:N-1;

w0 = 2*pi/5;
x = sin(w0*n)+10*sin(2*w0*n);

Вычислите кратковременное преобразование Фурье с помощью функциональных значений по умолчанию. Постройте спектрограмму.

s = spectrogram(x);

spectrogram(x,'yaxis')

Повторите вычисление.

  • Разделите сигнал на разделы длины nsc=Nx/4.5.

  • Окно разделы с помощью Окна Хэмминга.

  • Задайте 50%-е перекрытие между непрерывными разделами.

  • Чтобы вычислить БПФ, использовать max (256,2p) точки, где p=журнал2nsc.

Проверьте, что два подхода дают идентичные результаты.

Nx = length(x);
nsc = floor(Nx/4.5);
nov = floor(nsc/2);
nff = max(256,2^nextpow2(nsc));

t = spectrogram(x,hamming(nsc),nov,nff);

maxerr = max(abs(abs(t(:))-abs(s(:))))
maxerr = 0

Разделите сигнал на 8 разделов равной длины с 50%-м перекрытием между разделами. Задайте ту же длину БПФ как на предыдущем шаге. Вычислите кратковременное преобразование Фурье и проверьте, что оно дает тот же результат как предыдущие две процедуры.

ns = 8;
ov = 0.5;
lsc = floor(Nx/(ns-(ns-1)*ov));

t = spectrogram(x,lsc,floor(ov*lsc),nff);

maxerr = max(abs(abs(t(:))-abs(s(:))))
maxerr = 0

Сгенерируйте квадратичный щебет, x, выбранный на уровне 1 кГц в течение 2 секунд. Частота щебета составляет 100 Гц первоначально и пересекает 200 Гц в t = 1 с.

t = 0:0.001:2;
x = chirp(t,100,1,200,'quadratic');

Вычислите и отобразите спектрограмму x.

  • Разделите сигнал на разделы длины 128, оконный с Окном Хэмминга.

  • Задайте 120 выборок перекрытия между смежными разделами.

  • Оцените спектр в 128/2+1=65 частоты и (length(x)-120)/(128-120)=235 временные интервалы.

spectrogram(x,128,120,128,1e3)

Замените Окно Хэмминга на окно Блэкмена. Уменьшите перекрытие к 60 выборкам. Постройте ось времени так, чтобы ее значения увеличились сверху донизу.

spectrogram(x,blackman(128),60,128,1e3)
ax = gca;
ax.YDir = 'reverse';

Вычислите и отобразите PSD каждого сегмента квадратичного щебета, который запускается на уровне 100 Гц и пересекает 200 Гц в t = 1 секунда. Задайте частоту дискретизации 1 кГц, продолжительность сегмента 128 выборок и перекрытие 120 выборок. Используйте 128 точек ДПФ и Окно Хэмминга по умолчанию.

fs = 1000;
t = 0:1/fs:2;
x = chirp(t,100,1,200,'quadratic');

spectrogram(x,128,120,128,fs,'yaxis')
title('Quadratic Chirp')

Вычислите и отобразите PSD каждого сегмента линейного щебета, выбранного на уровне 1 кГц, который запускается в DC и пересекает 150 Гц в t = 1 секунда. Задайте продолжительность сегмента 256 выборок и перекрытие 250 выборок. Используйте Окно Хэмминга по умолчанию и 256 точек ДПФ.

x = chirp(t,0,1,150);

spectrogram(x,256,250,256,fs,'yaxis')
title('Linear Chirp')

Вычислите и отобразите PSD каждого сегмента логарифмического щебета, выбранного на уровне 1 кГц, который запускается на уровне 20 Гц и пересекает 60 Гц в t = 1 секунда. Задайте продолжительность сегмента 256 выборок и перекрытие 250 выборок. Используйте Окно Хэмминга по умолчанию и 256 точек ДПФ.

x = chirp(t,20,1,60,'logarithmic');

spectrogram(x,256,250,[],fs,'yaxis')
title('Logarithmic Chirp')

Используйте логарифмический масштаб для оси частоты. Спектрограмма становится строкой.

ax = gca;
ax.YScale = 'log';

Используйте функцию spectrogram, чтобы измерить и отследить мгновенную частоту сигнала.

Сгенерируйте квадратичный щебет, выбранный на уровне 1 кГц в течение двух секунд. Задайте щебет так, чтобы его частота была первоначально 100 Гц и увеличилась до 200 Гц после одной секунды.

fs = 1000;
t = 0:1/fs:2-1/fs;
y = chirp(t,100,1,200,'quadratic');

Оцените спектр щебета с помощью кратковременного преобразования Фурье, реализованного в функции spectrogram. Разделите сигнал на разделы длины 100, оконный с Окном Хэмминга. Задайте 80 выборок перекрытия между смежными разделами и оцените спектр в 100/2+1=51 частоты.

spectrogram(y,100,80,100,fs,'yaxis')

Отследите частоту щебета путем нахождения гребня частоты времени с самой высокой энергией через (2000-80)/(100-80)=96 моменты времени. Наложите мгновенную частоту на графике спектрограммы.

[~,f,t,p] = spectrogram(y,100,80,100,fs);

[fridge,~,lr] = tfridge(p,f);

hold on
plot3(t,fridge,abs(p(lr)),'LineWidth',4)
hold off

Сгенерируйте 512 выборок щебета с синусоидально переменным содержимым частоты.

N = 512;
n = 0:N-1;

x = exp(1j*pi*sin(8*n/N)*32);

Вычислите двухстороннее кратковременное преобразование Фурье в центре щебета. Разделите сигнал на сегменты с 32 выборками с перекрытием с 16 выборками. Задайте 64 точки ДПФ. Постройте спектрограмму.

[scalar,fs,ts] = spectrogram(x,32,16,64,'centered');

spectrogram(x,32,16,64,'centered','yaxis')

Получите тот же результат путем вычисления спектрограммы на 64 равномерно расположенных частотах на интервале (-π,π]. Опция 'centered' не необходима.

fintv = -pi+pi/32:pi/32:pi;

[vector,fv,tv] = spectrogram(x,32,16,fintv);

spectrogram(x,32,16,fintv,'yaxis')

Сгенерируйте сигнал щебета, выбранный в течение 2 секунд на уровне 1 кГц. Задайте щебет так, чтобы его частота была первоначально 100 Гц и увеличилась до 200 Гц после 1 секунды.

Fs = 1000;
t = 0:1/Fs:2;
y = chirp(t,100,1,200,'quadratic');

Оцените переприсвоенную спектрограмму сигнала.

  • Разделите сигнал на разделы длины 128, оконный с окном Kaiser с параметром формы β=18.

  • Задайте 120 выборок перекрытия между смежными разделами.

  • Оцените спектр в 128/2=65 частоты и (length(x)-120)/(128-120)=235 временные интервалы.

spectrogram(y,kaiser(128,18),120,128,Fs,'reassigned','yaxis')

Сгенерируйте сигнал щебета, выбранный в течение 2 секунд на уровне 1 кГц. Задайте щебет так, чтобы его частота была первоначально 100 Гц и увеличилась до 200 Гц после 1 секунды.

Fs = 1000;
t = 0:1/Fs:2;
y = chirp(t,100,1,200,'quadratic');

Оцените зависящую от времени степень спектральную плотность (PSD) сигнала.

  • Разделите сигнал на разделы длины 128, оконный с окном Kaiser с параметром формы β=18.

  • Задайте 120 выборок перекрытия между смежными разделами.

  • Оцените спектр в 128/2=65 частоты и (length(x)-120)/(128-120)=235 временные интервалы.

Выведите частоту и время центра тяжести каждой оценки PSD. Обнулите те элементы меньшего PSD, чем -30 дБ.

[~,~,~,pxx,fc,tc] = spectrogram(y,kaiser(128,18),120,128,Fs, ...
    'MinThreshold',-30);

Постройте ненулевые элементы как функции частот центра тяжести и времена.

plot(tc(pxx>0),fc(pxx>0),'.')

Сгенерируйте сигнал, выбранный на уровне 1 024 Гц в течение 2 секунд.

nSamp = 2048;
Fs = 1024;
t = (0:nSamp-1)'/Fs;

В течение первой секунды сигнал состоит из синусоиды на 400 Гц и вогнутого квадратичного щебета. Задайте щебет так, чтобы это было симметрично о средней точке интервала, начав и закончившись на частоте 250 Гц и достигнув минимума 150 Гц.

t1 = t(1:nSamp/2);

x11 = sin(2*pi*400*t1);
x12 = chirp(t1-t1(nSamp/4),150,nSamp/Fs,1750,'quadratic');
x1 = x11+x12;

Остальная часть сигнала состоит из двух линейных щебетов уменьшающейся частоты. Один щебет имеет начальную частоту 250 Гц, которая уменьшается до 100 Гц. Другой щебет имеет начальную частоту 400 Гц, которая уменьшается до 250 Гц.

t2 = t(nSamp/2+1:nSamp);

x21 = chirp(t2,400,nSamp/Fs,100);
x22 = chirp(t2,550,nSamp/Fs,250);
x2 = x21+x22;

Добавьте белый Гауссов шум в сигнал. Задайте отношение сигнал-шум 20 дБ. Сбросьте генератор случайных чисел для восстанавливаемых результатов.

SNR = 20;
rng('default')

sig = [x1;x2];
sig = sig + randn(size(sig))*std(sig)/db2mag(SNR);

Вычислите и постройте спектрограмму сигнала. Задайте окно Kaiser длины 63 с параметром формы β=17, 10 меньше выборок перекрытия между смежными разделами и длина БПФ 256.

nwin = 63;
wind = kaiser(nwin,17);
nlap = nwin-10;
nfft = 256;

spectrogram(sig,wind,nlap,nfft,Fs,'yaxis')

Порог спектрограмма так, чтобы были обнулены любые элементы со значениями, меньшими, чем ОСШ.

spectrogram(sig,wind,nlap,nfft,Fs,'MinThreshold',-SNR,'yaxis')

Повторно присвойте каждую оценку PSD местоположению ее центра энергии.

spectrogram(sig,wind,nlap,nfft,Fs,'reassign','yaxis')

Порог переприсвоенная спектрограмма так, чтобы были обнулены любые элементы со значениями, меньшими, чем ОСШ.

spectrogram(sig,wind,nlap,nfft,Fs,'reassign','MinThreshold',-SNR,'yaxis')

Загрузите звуковой сигнал, который содержит два уменьшающихся щебета, и широкополосное обрызгивают звук. Вычислите кратковременное преобразование Фурье. Разделите форму волны на сегменты с 400 выборками с перекрытием с 300 выборками. Постройте спектрограмму.

load splat

% To hear, type soundsc(y,Fs)

sg = 400;
ov = 300;

spectrogram(y,sg,ov,[],Fs,'yaxis')
colormap bone

Используйте функцию spectrogram, чтобы вывести степень спектральную плотность (PSD) сигнала.

[s,f,t,p] = spectrogram(y,sg,ov,[],Fs);

Отследите два щебета с помощью функции medfreq. Чтобы найти более сильный, низкочастотный щебет, ограничьте поиск частотами выше 100 Гц и временами перед запуском широкополосного звука.

f1 = f > 100;
t1 = t < 0.75;

m1 = medfreq(p(f1,t1),f(f1));

Чтобы найти слабый высокочастотный щебет, ограничьте поиск частотами выше 2 500 Гц и временами между 0,3 секундами и 0,65 секундами.

f2 = f > 2500;
t2 = t > 0.3 & t < 0.65;

m2 = medfreq(p(f2,t2),f(f2));

Наложите результат на спектрограмме. Разделите значения частоты на 1 000, чтобы выразить их в kHz.

hold on
plot(t(t1),m1/1000,'linewidth',4)
plot(t(t2),m2/1000,'linewidth',4)
hold off

Сгенерируйте две секунды сигнала, выбранного на уровне 10 кГц. Задайте мгновенную частоту сигнала как треугольная функция времени.

fs = 10e3;
t = 0:1/fs:2;
x1 = vco(sawtooth(2*pi*t,0.5),[0.1 0.4]*fs,fs);

Вычислите и постройте спектрограмму сигнала. Используйте окно Kaiser длины 256 и сформируйте параметр β=5. Задайте 220 выборок перекрытия от раздела к разделу и 512 точек ДПФ. Постройте частоту на оси Y. Используйте палитру по умолчанию и представление.

spectrogram(x1,kaiser(256,5),220,512,fs,'yaxis')

Измените представление, чтобы отобразить спектрограмму как график водопада. Установите палитру на bone.

colormap bone
view(-45,65)

Входные параметры

свернуть все

Входной сигнал, заданный как строка или вектор-столбец.

Пример: cos(pi/4*(0:159))+randn(1,160) задает синусоиду, встроенную в белый Гауссов шум.

Типы данных: single | double
Поддержка комплексного числа: Да

Окно, заданное как целое число или как строка или вектор-столбец. Используйте window, чтобы разделить сигнал на сегменты:

  • Если window является целым числом, то spectrogram делит x на сегменты длины window и окна каждый сегмент с Окном Хэмминга той длины.

  • Если window является вектором, то spectrogram делит x на сегменты той же длины как вектор и окна каждый сегмент с помощью window.

Если длина x не может быть разделена точно в целое число сегментов с noverlap перекрывающиеся выборки, то x является усеченным соответственно.

Если вы задаете window как пустой, то spectrogram использует Окно Хэмминга, таким образом, что x разделен на восемь сегментов с noverlap перекрывающиеся выборки.

Для списка доступных окон смотрите Windows.

Пример: hann(N+1) и (1-cos(2*pi*(0:N)'/N))/2 оба задают окно Hann длины N + 1.

Типы данных: single | double

Количество перекрытых выборок, заданных как положительное целое число.

  • Если window является скаляром, то noverlap должен быть меньшим, чем window.

  • Если window является вектором, то noverlap должен быть меньшим, чем длина window.

Если вы задаете noverlap как пустой, то spectrogram использует номер, который производит 50%-е перекрытие между сегментами. Если длина сегмента не задана, функция устанавливает noverlap на ⌊Nx/4.5, где Nx является длиной входного сигнала, и ⌊⌋ символы обозначают функцию пола.

Типы данных: double | single

Количество точек ДПФ, заданных как положительный целочисленный скаляр. Если вы задаете nfft как пустой, то spectrogram устанавливает параметр на макс. (256,2p), где p = ⌈log2  Nw , ⌈⌉ символы обозначают функцию потолка, и

  • Nw = window, если window является скаляром.

  • Nw = length(window), если window является вектором.

Типы данных: single | double

Нормированные частоты, заданные как вектор. w должен иметь по крайней мере два элемента, потому что в противном случае функция интерпретирует его как nfft. Нормированные частоты находятся в раде/выборке.

Пример: pi./[2 4]

Типы данных: double | single

Циклические частоты, заданные как вектор. f должен иметь по крайней мере два элемента, потому что в противном случае функция интерпретирует его как nfft. Модули f заданы частотой дискретизации, fs.

Типы данных: double | single

Частота дискретизации, заданная как положительная скалярная величина. Частота дискретизации является количеством выборок в единицу времени. Если модуль времени является секундами, то частота дискретизации находится в Гц.

Типы данных: double | single

Частотный диапазон для оценки PSD, заданной как 'onesided', 'twosided' или 'centered'. Для сигналов с действительным знаком значением по умолчанию является 'onesided'. Для сигналов с комплексным знаком значением по умолчанию является 'twosided' и определение результаты 'onesided' по ошибке.

  • 'onesided' — возвращает одностороннюю спектрограмму действительного входного сигнала. Если nfft даже, то ps имеет nfft/2 + 1 строка и вычисляется на интервале [0, π] рад/выборка. Если nfft нечетен, то ps имеет (nfft + 1)/2 строки, и интервал [0, π), рад/выборка. Если вы задаете fs, то интервалы являются соответственно [0, fs/2] циклами/единицей времени и [0, fs/2), циклы/единица времени.

  • 'twosided' — возвращает двухстороннюю спектрограмму действительного или комплексного сигнала. ps имеет строки nfft и вычисляется на интервале [0, 2π), рад/выборка. Если вы задаете fs, то интервал [0, fs), циклы/единица времени.

  • 'centered' — возвращает двухстороннюю спектрограмму в центре действительного или комплексного сигнала. ps имеет строки nfft. Если nfft даже, то ps вычисляется на интервале (–ππ] рад/выборка. Если nfft нечетен, то ps вычисляется по (–ππ) рад/выборка. Если вы задаете fs, то интервалы соответственно (–fs/2fs/2] циклы/единица времени и (–fs/2fs/2) циклы/единица времени.

Масштабирование спектра мощности, заданное как 'psd' или 'power'.

  • Исключение spectrumtype или определение 'psd', возвращают степень спектральная плотность.

  • Определение 'power' масштабирует каждую оценку PSD эквивалентной шумовой пропускной способностью окна. Результатом является оценка степени на каждой частоте. Если опция 'reassigned' идет, функция интегрирует PSD по ширине каждого интервала частоты перед переприсвоением.

Порог, заданный как действительный скаляр, выражается в децибелах. spectrogram обнуляет те элементы ps, таким образом что 10 log10 (ps) ≤ thresh.

Ось отображения частоты, заданная как 'xaxis' или 'yaxis'.

  • 'xaxis' — частота отображений на оси X и время на оси Y.

  • 'yaxis' — частота отображений на оси Y и время на оси X.

Этот аргумент проигнорирован, если вы вызываете spectrogram с выходными аргументами.

Выходные аргументы

свернуть все

Кратковременное преобразование Фурье, возвращенное как матрица. Увеличения времени через столбцы s и частоты увеличивают вниз строки, начинающие с нуля.

  • Если x является сигналом длины Nx, то s имеет столбцы k, где

    • k = ⌊ (Nx – noverlap) / (window – noverlap) ⌋, если window является скаляром.

    • k = ⌊ (Nx – noverlap) / (length(window) – noverlap) ⌋, если window является вектором.

  • Если x действителен, и nfft даже, то s имеет (nfft/2 + 1) строки.

  • Если x действителен, и nfft нечетен, то s имеет (nfft + 1)/2 строки.

  • Если x является комплексным, то s имеет строки nfft.

s не затронут опцией 'reassigned'.

Типы данных: double | single

Нормированные частоты, возвращенные как вектор. w имеет длину, равную количеству строк s.

Типы данных: double | single

Моменты времени, возвращенные как вектор. Временные стоимости в t соответствуют средней точке каждого сегмента.

Типы данных: double | single

Циклические частоты, возвращенные как вектор. f имеет длину, равную количеству строк s.

Типы данных: double | single

Степень спектральная плотность (PSD) или спектр мощности, возвращенный как матрица.

  • Если x действителен, то ps содержит одностороннюю измененную оценку периодограммы PSD или спектр мощности каждого сегмента.

  • Если x является комплексным, или если вы задаете вектор частот, то ps содержит двухстороннюю измененную оценку периодограммы PSD или спектр мощности каждого сегмента.

Типы данных: double | single

Частоты центра энергии и времена, возвращенные как матрицы, одного размера как кратковременное преобразование Фурье. Если вы не задаете частоту дискретизации, то элементы fc возвращены как нормированные частоты.

Советы

Если кратковременное преобразование Фурье имеет нули, его преобразование в результаты децибелов в отрицательных бесконечностях, которые не могут быть построены. Чтобы избежать этой потенциальной трудности, spectrogram добавляет eps в кратковременное преобразование Фурье, когда вы вызываете его без выходных аргументов.

Ссылки

[1] Оппенхейм, Алан V, Рональд В. Шафер и Джон Р. Бак. Обработка сигналов дискретного времени. 2-й Эд. Верхний Сэддл-Ривер, NJ: Prentice Hall, 1999.

[2] Rabiner, Лоуренс Р. и Рональд В. Шафер. Цифровая обработка речевых сигналов. Englewood Cliffs, NJ: Prentice Hall, 1978.

[3] Chassande-Motin, Éric, Франсуа Оже и Патрик Фландрен. “Переназначение”. В анализе частоты времени: Концепции и методы. Отредактированный Францем Лавачем и Франсуа Оже. Лондон: ISTE/John Вайли и сыновья, 2008.

[4] Fulop, Шон А. и Келли Фитц. “Алгоритмы для вычисления исправленной временем мгновенной частоты (повторно присвоили) спектрограмму с приложениями”. Журнал Акустического Общества Америки. Издание 119, январь 2006, стр 360–371.

Смотрите также

Приложения

Функции

Представлено до R2006a