stft

Кратковременное преобразование Фурье

Описание

s = stft(x) возвращает кратковременное преобразование Фурье (STFT) x.

пример

s = stft(x,fs) возвращает STFT x использование частоты дискретизации fs.

s = stft(x,ts) возвращает STFT x использование шага расчета ts.

пример

s = stft(___,Name,Value) задает дополнительные опции, используя аргументы пары "имя-значение". Опции включают окно БПФ и длину. Эти аргументы могут быть добавлены к любому из предыдущих входных синтаксисов.

пример

[s,f] = stft(___) возвращает частоты f при котором оценивается STFT.

пример

[s,f,t] = stft(___) возвращает время, в которое оценивается STFT.

stft(___) без выходных аргументов строит график величины STFT в текущую фигуру окне.

Примеры

свернуть все

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

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

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

stft(x,fs,'Window',kaiser(256,5),'OverlapLength',220,'FFTLength',512);

Figure contains an axes. The axes with title Short-Time Fourier Transform contains an object of type image.

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

view(-45,65)
colormap jet

Figure contains an axes. The axes with title Short-Time Fourier Transform contains an object of type surface.

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

ts = 0:1/1e3:2;

f0 = 100;
f1 = 200;

x = chirp(ts,f0,1,f1,'quadratic',[],'concave');

Вычислите и отобразите STFT квадратичного щебета с длительностью 1 мс.

d = seconds(1e-3);
win = hamming(100,'periodic');

stft(x,d,'Window',win,'OverlapLength',98,'FFTLength',128);

Figure contains an axes. The axes with title Short-Time Fourier Transform contains an object of type image.

Сгенерируйте сигнал, дискретизированный в 5 кГц в течение 4 секунд. Сигнал состоит из набора импульсов уменьшающейся длительности, разделенных областями колеблющейся амплитуды и колеблющейся частоты с увеличивающимся трендом. Постройте график сигнала.

fs = 5000;
t = 0:1/fs:4-1/fs;

x = besselj(0,600*(sin(2*pi*(t+1).^3/30).^5));

plot(t,x)

Figure contains an axes. The axes contains an object of type line.

Вычислите односторонние, двусторонние и центрированные краткосрочные преобразования Фурье сигнала. Во всех случаях используйте окно Кайзера с 202 образцами с масштабным фактором β=10 для окна сегментов сигнала. Отобразите частотную область значений, используемый для вычисления каждого преобразования.

rngs = ["onesided" "twosided" "centered"];

for kj = 1:length(rngs)
    
    opts = {'Window',kaiser(202,10),'FrequencyRange',rngs(kj)};

    [~,f] = stft(x,fs,opts{:});
    subplot(length(rngs),1,kj)
    stft(x,fs,opts{:})
    title(sprintf('''%s'': [%5.3f, %5.3f] kHz',rngs(kj),[f(1) f(end)]/1000))

end

Figure contains 3 axes. Axes 1 with title 'onesided': [0.000, 2.500] kHz contains an object of type image. Axes 2 with title 'twosided': [0.000, 4.975] kHz contains an object of type image. Axes 3 with title 'centered': [-2.475, 2.500] kHz contains an object of type image.

Повторите расчет, но теперь измените длину окна Кайзера на 203, нечетное число. The 'twosided' частотный интервал не меняется. Другие два частотных интервала становятся открытыми на более высоком конце.

for kj = 1:length(rngs)
    
    opts = {'Window',kaiser(203,10),'FrequencyRange',rngs(kj)};

    [~,f] = stft(x,fs,opts{:});
    subplot(length(rngs),1,kj)
    stft(x,fs,opts{:})
    title(sprintf('''%s'': [%5.3f, %5.3f] kHz',rngs(kj),[f(1) f(end)]/1000))

end

Figure contains 3 axes. Axes 1 with title 'onesided': [0.000, 2.488] kHz contains an object of type image. Axes 2 with title 'twosided': [0.000, 4.975] kHz contains an object of type image. Axes 3 with title 'centered': [-2.488, 2.488] kHz contains an object of type image.

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

  1. Первый канал состоит из вогнутого квадратичного щебета с мгновенной частотой 100 Гц при t = 0 и пересекает 300 Гц при t = 1 секунде. Начальная фаза равна 45 степеням.

  2. Второй канал состоит из выпуклого квадратичного щебета с мгновенной частотой 100 Гц при t = 0 и пересекает 500 Гц при t = 1 секунде.

  3. Третий канал состоит из логарифмического щебета с мгновенной частотой 300 Гц при t = 0 и пересекает 500 Гц при t = 1 секунде.

Вычислите STFT многоканального сигнала с помощью периодического окна Хэмминга длины 128 и длины перекрытия 50 выборки.

fs = 1e3;
t = 0:1/fs:1-1/fs;

x = [chirp(t,100,1,300,'quadratic',45,'concave');
      chirp(t,100,1,500,'quadratic',[],'convex');
      chirp(t,300,1,500,'logarithmic')]'; 
  
[S,F,T] = stft(x,fs,'Window',hamming(128,'periodic'),'OverlapLength',50);

Визуализируйте STFT каждого канала как график водопада. Управляйте поведением осей, используя функцию helper helperGraphicsOpt.

waterfall(F,T,abs(S(:,:,1))')
helperGraphicsOpt(1)

Figure contains an axes. The axes with title Input Channel: 1 contains an object of type patch.

waterfall(F,T,abs(S(:,:,2))')
helperGraphicsOpt(2)

Figure contains an axes. The axes with title Input Channel: 2 contains an object of type patch.

waterfall(F,T,abs(S(:,:,3))')
helperGraphicsOpt(3)

Figure contains an axes. The axes with title Input Channel: 3 contains an object of type patch.

Эта вспомогательная функция устанавливает внешний вид и поведение текущих систем координат.

function helperGraphicsOpt(ChannelId)
ax = gca;
ax.XDir = 'reverse';
ax.ZLim = [0 30];
ax.Title.String = ['Input Channel: ' num2str(ChannelId)];
ax.XLabel.String = 'Frequency (Hz)';
ax.YLabel.String = 'Time (seconds)';
ax.View = [30 45];
end

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

свернуть все

Входной сигнал, заданный как вектор, матрица или MATLAB® timetable.

Примечание

Если вы инвертируете s использование istft и хотите, чтобы результат был такой же длины, как и x, значение (length(x)-noverlap)/(length(window)-noverlap) должно быть целым числом.

  • Если вход имеет несколько каналов, задайте x как матрица, где каждый столбец соответствует каналу.

  • Для входа timetable, x должен содержать равномерно увеличивающиеся конечные строки времени. Если расписание имеет отсутствующие или повторяющиеся точки времени, можно исправить его с помощью советов в разделе «Чистое расписание с пропущенными, повторяющимися или неоднородными временами».

  • Для многоканального входа расписания задайте x как расписание с одной переменной, содержащей матрицу или расписание с несколькими переменными, каждая из которых содержит вектор-столбец. Все переменные должны иметь одинаковую точность.

Каждый канал x должна иметь длину, большую или равную длине окна.

Пример: chirp(0:1/4e3:2,250,1,500,'quadratic') задает одноканальный щебет.

Пример: timetable(rand(5,2),'SampleRate',1) задает двухканальную случайную переменную, дискретизированную с частотой дискретизации 1 Гц в течение 4 секунд.

Пример: timetable(rand(5,1),rand(5,1),'SampleRate',1) задает двухканальную случайную переменную, дискретизированную с частотой дискретизации 1 Гц в течение 4 секунд.

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

Частота дискретизации, заданная как положительная скалярная величина. Этот аргумент применяется только при x является вектором или матрицей.

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

Шаг расчета, заданный как duration скаляр. Этот аргумент применяется только при x является вектором или матрицей

Пример: seconds(1) является duration скаляр, представляющий 1-секундное временное различие между последовательными выборками сигнала.

Типы данных: duration

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

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

Пример: 'Window',hamming(100),'OverlapLength',50,'FFTLength',128 окрашивает данные с помощью 100-выборочного окна Хэмминга с 50 выборками перекрытия между смежными сегментами и БПФ с 128 точками.

Спектральное окно, заданное как вектор. Если вы не задаете окно или не задаете его как пустое, функция использует окно Ханна длины 128. Длина 'Window' должно быть больше или равно 2.

Список доступных окон см. в разделе Windows.

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

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

Количество перекрывающихся выборок, заданное в виде положительного целого числа, меньшего, чем длина 'Window'. Если вы опускаете 'OverlapLength' или укажите его как пустой, оно устанавливается на самое большое целое число менее 75% длины окна, что составляет 96 выборок для окна Ханна по умолчанию.

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

Количество точек ДПФ, заданное как положительное целое число. Значение должно быть больше или равно длине окна. Если длина входного сигнала меньше длины ДПФ, данные заполняются нулями.

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

Область значений STFT, заданный как 'centered', 'twosided', или 'onesided'.

  • 'centered' - Вычисление двустороннего центрированного STFT. Если 'FFTLength' даже, тогда s вычисляется по интервалу (- π, π] рад/выборка. Если 'FFTLength' нечетно, тогда s вычисляется по интервалу (- π, π) рад/выборка. Если вы задаете информацию о времени, то интервалы являются (- f s, f s/2] циклами/единичным временем и (- f s, f s/2) циклами/единичным временем, соответственно, где f s - эффективная частота дискретизации.

  • 'twosided' - Вычислите двусторонний STFT через интервал [0, 2 π) рад/отсчета. Если вы задаете информацию о времени, то интервал составляет [0, f с) циклов/единичное время.

  • 'onesided' - Вычисление одностороннего STFT. Если 'FFTLength' даже, тогда s вычисляется за интервал [0, π] рад/выборка. Если 'FFTLength' нечетно, тогда s вычисляется за интервал [0, π) рад/выборка. Если вы задаете информацию о времени, то интервалы являются [0, f s/2] циклами/единичным временем и [0, f s/2) циклами/единичным временем, соответственно, где f s - эффективная частота дискретизации. Эта опция действительна только для реальных сигналов.

    Примечание

    Когда для этого аргумента задано значение 'onesided', stft выводит значения в положительном диапазоне Nyquist и не сохраняет общую степень.

Для получения примера смотрите STFT Frequency Областей значений.

Типы данных: char | string

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

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

свернуть все

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

  • Если сигнал x имеет Nx временных выборок, затем s имеет k столбцы, где k = ⌊ (Nx - L) / (M - L) ⌋, M - длина 'Window'L является 'OverlapLength', и ⌊ ⌋ символы обозначают функцию этажа.

  • Количество строк в s равно значению, указанному в 'FFTLength'.

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

Частоты, на которых оценивается STFT, возвращаются как вектор.

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

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

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

  • Если шаг расчета ts обеспечивается, тогда вектор является массивом длительности с таким же форматом времени, как и вход.

  • Если информация о времени не предоставляется, вектор содержит номера сэмплов.

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

Подробнее о

свернуть все

Краткосрочное преобразование Фурье

Кратковременное преобразование Фурье (STFT) используется, чтобы проанализировать, как изменяется содержание частоты нестационарного сигнала с течением времени.

STFT сигнала вычисляется путем скольжения analysis window длины M над сигналом и вычислением дискретного преобразования Фурье оконных данных. Окно переходит по исходному сигналу с интервалами R выборки. Большинство оконных функций сужаются по краям, чтобы избежать спектрального звонка. Если ненулевая длина перекрытия L задано, что наложение-добавление оконных сегментов компенсирует ослабление сигнала на ребрах окна. ДПФ каждого оконного сегмента добавляется к матрице, которая содержит величину и фазу для каждой точки во времени и частоте. Количество строк в матрице STFT равняется количеству точек ДПФ, и количество столбцов задается как

k=NxLML,

где Nx - длина исходного сигнала x(n) и ⌋ символы обозначают функцию этажа.

Матрица STFT задается как X(f)=[X1(f)X2(f)X3(f)Xk(f)] таким образом, mтретий элемент этой матрицы

Xm(f)=n=x(n)g(nmR)ej2πfn,

где

  • g(n) - Оконная функция длины M.

  • Xm(f) - ДПФ оконных данных с центром во времени mR.

  • R - Размер скачка между последовательными ДПФ. Размер скачка - это различие между длиной окна Mи длину перекрытия L.

Величина в квадрате STFT приводит к spectrogram представление спектральной плотности степени функции.

Идеальная реконструкция

В целом вычисление STFT входного сигнала и инвертирование его не приводит к идеальной реконструкции. Если вы хотите, чтобы выход ISTFT максимально совпадал с исходным входным сигналом, сигнал и окно должны удовлетворять следующим условиям:

  • Вход - Если вы инвертируете выходной параметр stft использование istft и хотите, чтобы результат был такой же длины, как и входной сигнал x, значение k = (length(x)-noverlap)(length(window)-noverlap) должно быть целым числом.

  • Податливость COLA - Используйте совместимые с COLA окна, принимая, что вы не изменили краткосрочное преобразование Фурье сигнала.

  • Заполнение - Если длина входного сигнала такова, что значение k не является целым числом, обнулите сигнал перед вычислением кратковременного преобразования Фурье. Удалите дополнительные нули после инвертирования сигнала.

Ссылки

[1] Митра, Санджит К. Цифровая обработка сигналов: компьютерный подход. 2nd Ed. New York: McGraw-Hill, 2001.

[2] Шарп, Брюс. Обратимость обработки перекрытия-добавления. https://gauss256.github.io/blog/cola.html, доступ к июлю 2019 года.

[3] Смит, Джулиус Орион. Спектральная обработка аудиосигнала. https://ccrma.stanford.edu/~jos/sasp/, онлайн книга, издание 2011, доступ к Nov 2018.

Расширенные возможности

..
Введенный в R2019a