Кратковременное преобразование Фурье
задает дополнительные опции, используя аргументы пары "имя-значение". Опции включают окно БПФ и длину. Эти аргументы могут быть добавлены к любому из предыдущих входных синтаксисов.s
= stft(___,Name,Value
)
stft(___)
без выходных аргументов строит график величины STFT в текущую фигуру окне.
Сгенерируйте две секунды управляемого напряжением генератора выхода, управляемой синусоидой, выбранной с частотой дискретизации 10 кГц.
fs = 10e3; t = 0:1/fs:2; x = vco(sin(2*pi*t),[0.1 0.4]*fs,fs);
Вычислите и постройте график STFT сигнала. Используйте окно Кайзера длиной 256 и параметром формы . Задайте длину перекрытия как 220 выборки и длину ДПФ как 512 точек. Постройте график STFT с палитрой по умолчанию и видом.
stft(x,fs,'Window',kaiser(256,5),'OverlapLength',220,'FFTLength',512);
Измените вид, чтобы отобразить STFT как график водопада. Установите значение палитры jet
.
view(-45,65)
colormap jet
Сгенерируйте квадратичный щебет, выбранный с частотой дискретизации 1 кГц в течение 2 секунд. Мгновенная частота составляет 100 Гц при и пересекает 200 Гц при второе.
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);
Сгенерируйте сигнал, дискретизированный в 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)
Вычислите односторонние, двусторонние и центрированные краткосрочные преобразования Фурье сигнала. Во всех случаях используйте окно Кайзера с 202 образцами с масштабным фактором для окна сегментов сигнала. Отобразите частотную область значений, используемый для вычисления каждого преобразования.
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
Повторите расчет, но теперь измените длину окна Кайзера на 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
Сгенерируйте трехканальный сигнал, состоящий из трех различных щебетов, дискретизированных с частотой 1 кГц в течение одной секунды.
Первый канал состоит из вогнутого квадратичного щебета с мгновенной частотой 100 Гц при t = 0 и пересекает 300 Гц при t = 1 секунде. Начальная фаза равна 45 степеням.
Второй канал состоит из выпуклого квадратичного щебета с мгновенной частотой 100 Гц при t = 0 и пересекает 500 Гц при t = 1 секунде.
Третий канал состоит из логарифмического щебета с мгновенной частотой 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)
waterfall(F,T,abs(S(:,:,2))') helperGraphicsOpt(2)
waterfall(F,T,abs(S(:,:,3))') helperGraphicsOpt(3)
Эта вспомогательная функция устанавливает внешний вид и поведение текущих систем координат.
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
x
- Входной сигналВходной сигнал, заданный как вектор, матрица или 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
Поддержка комплексного числа: Да
fs
- Частота дискретизации2π
(по умолчанию) | положительная скалярная величинаЧастота дискретизации, заданная как положительная скалярная величина. Этот аргумент применяется только при x
является вектором или матрицей.
Типы данных: double
| single
ts
- Шаг расчетаЗадайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
'Window',hamming(100),'OverlapLength',50,'FFTLength',128
окрашивает данные с помощью 100-выборочного окна Хэмминга с 50 выборками перекрытия между смежными сегментами и БПФ с 128 точками.'Window'
- Спектральное окноhann(128,'periodic')
(по умолчанию) | векторСпектральное окно, заданное как вектор. Если вы не задаете окно или не задаете его как пустое, функция использует окно Ханна длины 128. Длина 'Window'
должно быть больше или равно 2.
Список доступных окон см. в разделе Windows.
Пример: hann(N+1)
и (1-cos(2*pi*(0:N)'/N))/2
оба задают окно Ханна длины N
+ 1.
Типы данных: double
| single
'OverlapLength'
- Количество перекрываемых выборок75%
длины окна (по умолчанию) | неотрицательным целым числомКоличество перекрывающихся выборок, заданное в виде положительного целого числа, меньшего, чем длина 'Window'
. Если вы опускаете 'OverlapLength'
или укажите его как пустой, оно устанавливается на самое большое целое число менее 75% длины окна, что составляет 96 выборок для окна Ханна по умолчанию.
Типы данных: double
| single
'FFTLength'
- Количество точек ДПФ128
(по умолчанию) | положительное целое числоКоличество точек ДПФ, заданное как положительное целое число. Значение должно быть больше или равно длине окна. Если длина входного сигнала меньше длины ДПФ, данные заполняются нулями.
Типы данных: double
| single
'FrequencyRange'
- частотная область значений STFT'centered'
(по умолчанию) | 'twosided'
| 'onesided'
Область значений 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
'OutputTimeDimension'
- Величина времени выхода'acrosscolumns'
(по умолчанию) | 'downrows'
Выход временной размерности, заданный как 'acrosscolumns'
или 'downrows'
. Установите это значение равным 'downrows'
если вам нужна временная размерность s
вниз по строкам и размерности между столбцами. Установите это значение равным 'acrosscolumns'
если вам нужна временная размерность s
через столбцы и размерность вниз по строкам. Этот вход игнорируется, если функция вызывается без выходных аргументов.
s
- Короткое преобразование ФурьеКратковременное преобразование Фурье, возвращаемое как матрица или трехмерный массив. Время увеличивается по столбцам s
и частота увеличивается вниз по строкам. Третья размерность, если оно присутствует, соответствует входным каналам.
Если сигнал x
имеет Nx временных выборок, затем s
имеет k столбцы, где k = ⌊ (Nx - L) / (M - L) ⌋, M - длина 'Window'
L является 'OverlapLength'
, и ⌊ ⌋ символы обозначают функцию этажа.
Количество строк в s
равно значению, указанному в 'FFTLength'
.
Типы данных: double
| single
f
- ЧастотыЧастоты, на которых оценивается STFT, возвращаются как вектор.
Типы данных: double
| single
t
- Моменты времениМомент времени, возвращенный как вектор. t
содержит значения времени, соответствующие центрам сегментов данных, используемых для вычисления краткосрочных оценок спектра степени.
Типы данных: double
| single
Кратковременное преобразование Фурье (STFT) используется, чтобы проанализировать, как изменяется содержание частоты нестационарного сигнала с течением времени.
STFT сигнала вычисляется путем скольжения analysis window длины над сигналом и вычислением дискретного преобразования Фурье оконных данных. Окно переходит по исходному сигналу с интервалами выборки. Большинство оконных функций сужаются по краям, чтобы избежать спектрального звонка. Если ненулевая длина перекрытия задано, что наложение-добавление оконных сегментов компенсирует ослабление сигнала на ребрах окна. ДПФ каждого оконного сегмента добавляется к матрице, которая содержит величину и фазу для каждой точки во времени и частоте. Количество строк в матрице STFT равняется количеству точек ДПФ, и количество столбцов задается как
где - длина исходного сигнала и ⌊ ⌋ символы обозначают функцию этажа.
Матрица STFT задается как таким образом, третий элемент этой матрицы
где
- Оконная функция длины .
- ДПФ оконных данных с центром во времени .
- Размер скачка между последовательными ДПФ. Размер скачка - это различие между длиной окна и длину перекрытия .
Величина в квадрате STFT приводит к spectrogram
представление спектральной плотности степени функции.
В целом вычисление STFT входного сигнала и инвертирование его не приводит к идеальной реконструкции. Если вы хотите, чтобы выход ISTFT максимально совпадал с исходным входным сигналом, сигнал и окно должны удовлетворять следующим условиям:
Вход - Если вы инвертируете выходной параметр stft
использование istft
и хотите, чтобы результат был такой же длины, как и входной сигнал x
, значение должно быть целым числом.
Податливость 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.
Указания и ограничения по применению:
'OutputTimeDimension'
необходимо всегда задавать и устанавливать на 'downrows'
.
Для получения дополнительной информации см. Раздел «Длинные массивы»
Указания и ограничения по применению:
Расписания не поддерживаются для генерации кода.
Указания и ограничения по применению:
Расписания не поддерживаются для генерации кода.
Эта функция полностью поддерживает массивы GPU. Для получения дополнительной информации смотрите Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox).
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.