spectrogram

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

Описание

пример

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(___,Name,Value) задает аргументы пары "имя-значение" использования дополнительных опций. Опции включают минимальный порог и выводят измерение времени.

[___] = 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=log2nsc.

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

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, оконный с окном Кайзера параметром формы β=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, оконный с окном Кайзера параметром формы β=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);

Вычислите и постройте спектрограмму сигнала. Задайте окно Кайзера длины 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);

Вычислите и постройте спектрограмму сигнала. Используйте окно Кайзера длины 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.

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

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

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

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

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

  • Nw = window если window скаляр.

  • Nw = длина (window) если window вектор.

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

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

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

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

Частотный диапазон для 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/2, fs/2] циклы/единица времени и (–fs/2, fs/2) циклы/единица времени.

Спектр мощности, масштабирующийся в виде 'psd' или 'power'.

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

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

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

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

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

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

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: spectrogram(x,100,'OutputTimeDimension','downrows') делит x в сегменты длины 100 и окна каждый сегмент с Окном Хэмминга той длины выход спектрограммы имеет измерение времени вниз строки.

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

Выведите измерение времени в виде разделенной запятой пары, состоящей из OutputTimeDimension и acrosscolumns или downrows. Установите это значение к downrows, если вы хотите измерение времени s, psФК , и tc вниз строки и размерность частоты вдоль столбцов. Установите это значение к acrosscolumns, если вы хотите измерение времени s, psФК , и tc через столбцы и размерность частоты вдоль строк. Этот вход проигнорирован, если функция вызвана без выходных аргументов.

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

свернуть все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Частоты центра энергии и времена, возвращенные как матрицы одного размера с кратковременным преобразованием Фурье. Если вы не задаете частоту дискретизации, то элементы 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