Звук с растягиванием во времени
Считывание звукового сигнала. Прослушайте звуковой сигнал и постройте его график с течением времени.
[audioIn,fs] = audioread("Counting-16-44p1-mono-15secs.wav"); t = (0:size(audioIn,1)-1)/fs; plot(t,audioIn) xlabel('Time (s)') ylabel('Amplitude') title('Original Signal') axis tight grid on

sound(audioIn,fs)
Использовать stretchAudio для применения коэффициента ускорения 1,5. Прослушайте модифицированный аудиосигнал и постройте его график с течением времени. Частота дискретизации остается прежней, но длительность сигнала уменьшилась.
audioOut = stretchAudio(audioIn,1.5); t = (0:size(audioOut,1)-1)/fs; plot(t,audioOut) xlabel('Time (s)') ylabel('Amplitude') title('Modified Signal, Speedup Factor = 1.5') axis tight grid on

sound(audioOut,fs)
Замедление исходного звукового сигнала на 0,75 коэффициента. Прослушайте модифицированный аудиосигнал и постройте его график с течением времени. Частота дискретизации остается такой же, как и у исходного звука, но длительность сигнала увеличилась.
audioOut = stretchAudio(audioIn,0.75); t = (0:size(audioOut,1)-1)/fs; plot(t,audioOut) xlabel('Time (s)') ylabel('Amplitude') title('Modified Signal, Speedup Factor = 0.75') axis tight grid on

sound(audioOut,fs)
stretchAudio поддерживает TSM для аудио в частотной области при использовании метода вокодера по умолчанию. Применение TSM к звуку частотной области позволяет повторно использовать вычисления STFT для нескольких факторов TSM.
Считывание звукового сигнала. Прослушайте звуковой сигнал и постройте его график с течением времени.
[audioIn,fs] = audioread('FemaleSpeech-16-8-mono-3secs.wav'); sound(audioIn,fs) t = (0:size(audioIn,1)-1)/fs; plot(t,audioIn) xlabel('Time (s)') ylabel('Amplitude') title('Original Signal') axis tight grid on

Преобразование звукового сигнала в частотную область.
win = sqrt(hann(256,'periodic')); ovrlp = 192; S = stft(audioIn,'Window',win,'OverlapLength',ovrlp,'Centered',false);
Ускорение звукового сигнала в 1,4 раза. Укажите длину окна и перекрытия, используемые для создания представления частотной области.
alpha = 1.4; audioOut = stretchAudio(S,alpha,'Window',win,'OverlapLength',ovrlp); sound(audioOut,fs) t = (0:size(audioOut,1)-1)/fs; plot(t,audioOut) xlabel('Time (s)') ylabel('Amplitude') title('Modified Signal, TSM Factor = 1.4') axis tight grid on

Замедлить звуковой сигнал в 0,8 раза. Укажите длину окна и перекрытия, используемые для создания представления частотной области.
alpha = 0.8; audioOut = stretchAudio(S,alpha,'Window',win,'OverlapLength',ovrlp); sound(audioOut,fs) t = (0:size(audioOut,1)-1)/fs; plot(t,audioOut) xlabel('Time (s)') ylabel('Amplitude') title('Modified Signal, TSM Factor = 0.8') axis tight grid on

Метод TSM по умолчанию (вокодер) позволяет дополнительно применить фазовую блокировку для повышения точности исходного звука.
Считывание звукового сигнала. Прослушайте звуковой сигнал и постройте его график с течением времени.
[audioIn,fs] = audioread("SpeechDFT-16-8-mono-5secs.wav"); sound(audioIn,fs) t = (0:size(audioIn,1)-1)/fs; plot(t,audioIn) xlabel('Time (s)') ylabel('Amplitude') title('Original Signal') axis tight grid on

Фазовая блокировка добавляет нетривиальную вычислительную нагрузку к TSM и не всегда требуется. По умолчанию фазовая блокировка отключена. Примените коэффициент ускорения 1.8 к входному звуковому сигналу. Прослушайте звуковой сигнал и постройте его график с течением времени.
alpha = 1.8; tic audioOut = stretchAudio(audioIn,alpha); processingTimeWithoutPhaseLocking = toc
processingTimeWithoutPhaseLocking = 0.0798
sound(audioOut,fs) t = (0:size(audioOut,1)-1)/fs; plot(t,audioOut) xlabel('Time (s)') ylabel('Amplitude') title('Modified Signal, alpha = 1.8, LockPhase = false') axis tight grid on

Примените тот же коэффициент ускорения 1.8 к входному звуковому сигналу, на этот раз разрешив фазовую блокировку. Прослушайте звуковой сигнал и постройте его график с течением времени.
tic
audioOut = stretchAudio(audioIn,alpha,"LockPhase",true);
processingTimeWithPhaseLocking = tocprocessingTimeWithPhaseLocking = 0.1154
sound(audioOut,fs) t = (0:size(audioOut,1)-1)/fs; plot(t,audioOut) xlabel('Time (s)') ylabel('Amplitude') title('Modified Signal, alpha = 1.8, LockPhase = true') axis tight grid on

Метод TSM (WSOLA) позволяет задать максимальное количество выборок для поиска наилучшего выравнивания сигнала. По умолчанию дельта WSOLA - это количество выборок в окне анализа минус количество выборок, перекрывающихся между соседними окнами анализа. Увеличение дельты WSOLA увеличивает вычислительную нагрузку, но также может повысить точность.
Считывание звукового сигнала. Прослушайте первые 10 секунд звукового сигнала.
[audioIn,fs] = audioread('RockGuitar-16-96-stereo-72secs.flac');
sound(audioIn(1:10*fs,:),fs)Примените коэффициент TSM 0,75 к входному аудиосигналу с помощью метода WSOLA. Прослушайте первые 10 секунд результирующего звукового сигнала.
alpha = 0.75; tic audioOut = stretchAudio(audioIn,alpha,"Method","wsola"); processingTimeWithDefaultWSOLADelta = toc
processingTimeWithDefaultWSOLADelta = 19.4403
sound(audioOut(1:10*fs,:),fs)
Примените коэффициент TSM 0,75 к входному звуковому сигналу, на этот раз увеличив дельту WSOLA до 1024. Прослушайте первые 10 секунд результирующего звукового сигнала.
tic audioOut = stretchAudio(audioIn,alpha,"Method","wsola","WSOLADelta",1024); processingTimeWithIncreasedWSOLADelta = toc
processingTimeWithIncreasedWSOLADelta = 25.5306
sound(audioOut(1:10*fs,:),fs)
audioIn - Входной сигналВходной сигнал, заданный как вектор столбца, матрица или массив 3-D. Как интерпретируется функция audioIn зависит от сложности audioIn и значение Method:
Если audioIn является реальным, audioIn интерпретируется как сигнал временной области. В этом случае audioIn должен быть вектором столбца или матрицей. Столбцы интерпретируются как отдельные каналы.
Этот синтаксис применяется, когда Method имеет значение 'vocoder' или 'wsola'.
Если audioIn является сложным, audioIn интерпретируется как сигнал частотной области. В этом случае audioIn должен быть массивом L-by-M-by-N, где L - длина БПФ, M - количество отдельных спектров, а N - количество каналов.
Этот синтаксис применяется только в том случае, если Method имеет значение 'vocoder'.
Типы данных: single | double
Поддержка комплексного номера: Да
alpha - коэффициент TSMКоэффициент TSM, заданный как положительный скаляр.
Типы данных: single | double
Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.
'Window',kbdwin(512)'Method' - Метод, используемый для масштабирования звука во времени'vocoder' (по умолчанию) | 'wsola'Метод, используемый для масштабирования звука во времени, определяемый как разделенная запятыми пара, состоящая из 'Method' и 'vocoder' или 'wsola'. Набор 'Method' кому 'vocoder' для использования способа фазового вокодера. Набор 'Method' кому 'wsola' для использования метода WSOLA.
Если 'Method' имеет значение 'vocoder', audioIn может быть реальным или сложным. Если 'Method' имеет значение 'wsola', audioIn должно быть реально.
Типы данных: single | double
'Window' - Окно, примененное во временной областиsqrt(hann(1024,'periodic')) (по умолчанию) | реальный векторОкно, примененное во временной области, указанное как разделенная запятыми пара, состоящая из 'Window' и реальный вектор. Число элементов в векторе должно находиться в диапазоне [1, size(]. Число элементов в векторе также должно быть больше audioIn,1)OverlapLength.
Примечание
При использовании stretchAudio при вводе в частотной области необходимо указать Window как то же окно, используемое для преобразования audioIn в частотную область.
Типы данных: single | double
'OverlapLength' - Количество проб, перекрывающихся между соседними окнамиround(0.75*numel(Window)) (по умолчанию) | скаляр в диапазоне [0 numel(Window))Количество выборок, перекрывающихся между соседними окнами, указанное как пара, разделенная запятыми, состоящая из 'OverlapLength' и целое число в диапазоне [0, numel(Window)).
Примечание
При использовании stretchAudio при вводе в частотной области необходимо указать OverlapLength как одинаковая длина перекрытия, используемая для преобразования audioIn к частотно-временному представлению.
Типы данных: single | double
'LockPhase' - Применить идентичную фазовую блокировкуfalse (по умолчанию) | trueПрименить идентичную фазовую блокировку, указанную как разделенная запятыми пара, состоящая из 'LockPhase' и false или true.
Чтобы включить этот аргумент пары имя-значение, установите Method кому 'vocoder'.
Типы данных: logical
'WSOLADelta' - Максимальное количество выборок, используемых для поиска наилучшего совмещения сигналовnumel(Window)-OverlapLength (по умолчанию) | неотрицательный скалярМаксимальное количество выборок, используемых для поиска наилучшего выравнивания сигнала, указанного как пара, разделенная запятыми, состоящая из 'WSOLADelta' и неотрицательный скаляр.
Чтобы включить этот аргумент пары имя-значение, установите Method кому 'wsola'.
Типы данных: single | double
audioOut - Измененный звук в масштабе времениМодифицированный во времени звук, возвращаемый в виде вектора столбца или матрицы независимых каналов.
Алгоритм фазового вокодера является частотно-доменным подходом к TSM [1][2]. Основными этапами алгоритма фазового вокодера являются:
Алгоритм окрывает сигнал временной области с интервалом, где η = numel(. Затем окна преобразуются в частотную область.Window) - OverlapLength
Для сохранения горизонтальной (по времени) фазовой когерентности алгоритм рассматривает каждый элемент в качестве независимой синусоиды, фаза которой вычисляется путем накопления оценок ее мгновенной частоты.
Для сохранения вертикальной (по всему индивидуальному спектру) фазовой когерентности алгоритм блокирует фазовое продвижение групп бункеров до фазового продвижения локальных пиков. Этот шаг применяется только в том случае, если LockPhase имеет значение true.
Алгоритм возвращает модифицированную спектрограмму во временную область, с окнами, разнесёнными через интервалы δ, где δ ≈ start/α. α - коэффициент ускорения, определяемый alpha входной аргумент.

Алгоритм WSOLA является временным подходом к [1][2] TSM. WSOLA является расширением алгоритма наложения и добавления (OLA). В алгоритме OLA сигнал временной области окошивается с интервалом start, где η = numel(. Для построения модифицированного во временном масштабе выходного звука окна разнесены на интервал δ, где δ ≈ start/α. α - коэффициент TSM, определяемый Window) - OverlapLengthalpha входной аргумент.

Алгоритм OLA хорошо справляется с воссозданием спектров величин, но может вводить фазовые переходы между окнами. Алгоритм WSOLA пытается сгладить фазовые переходы путем поиска WSOLADelta отсчеты вокруг интервала startдля окна, которое минимизирует фазовые переходы. Алгоритм ищет лучшее окно итеративно, так что каждое последовательное окно выбирается относительно ранее выбранного окна.

Если WSOLADelta имеет значение 0, то алгоритм сводится к OLA.
[1] Дриджер, Джонатан и Майнард Мюллер. «Обзор изменения музыкальных сигналов в масштабе времени». Прикладные науки. Том 6, выпуск 2, 2016.
[2] Дриджер, Джонатан. «Алгоритмы модификации во времени для музыкальных аудиосигналов», магистерская диссертация, Саарский университет, Саарбрюккен, Германия, 2011.
Используя gpuArray(Панель инструментов параллельных вычислений) ввод с помощью stretchAudio функция рекомендуется только для графического процессора с вычислительной способностью 7.0 («Volta») или выше. Другие аппаратные средства могут не дать никаких преимуществ в производительности. Сведения о проверке вычислительных возможностей графического процессора см. в разделе ComputeCompability в выходных данных gpuDevice (Панель параллельных вычислений). Дополнительные сведения см. в разделе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений).
Обзор использования графического процессора в MATLAB ® см. в разделе Запуск функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений).
audioDataAugmenter | audioTimeScaler | reverberator | shiftPitch
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.