shiftPitch

Сдвиньте аудио тангаж

Описание

пример

audioOut = shiftPitch(audioIn,nsemitones) смещает тангаж звукового входного сигнала на заданное количество полутонов, nsemitones.

пример

audioOut = shiftPitch(audioIn,nsemitones,Name,Value) задает опции с использованием одного или нескольких Name,Value аргументы в виде пар.

Примеры

свернуть все

Читайте в аудио файла и слушайте его.

[audioIn,fs] = audioread('Counting-16-44p1-mono-15secs.wav');
sound(audioIn,fs)

Увеличьте тангаж на 3 полутона и послушайте результат.

nsemitones = 3;
audioOut = shiftPitch(audioIn,nsemitones);
sound(audioOut,fs)

Уменьшите тангаж исходного аудио на 3 полутона и прослушайте результат.

nsemitones = -3;
audioOut = shiftPitch(audioIn,nsemitones);
sound(audioOut,fs)

Читайте в аудио файла и слушайте его.

[audioIn,fs] = audioread("SpeechDFT-16-8-mono-5secs.wav");
sound(audioIn,fs)

Преобразуйте аудиосигнал в представление частота-время с помощью stft. Используйте 512-точечную kbdwin с 75% перекрытием.

win = kbdwin(512);
overlapLength = 0.75*numel(win);

S = stft(audioIn, ...
    "Window",win, ...
    "OverlapLength",overlapLength, ...
    "Centered",false);

Увеличьте тангаж на 8 полутонов и послушайте результат. Задайте длину окна и перекрытия, которые вы использовали для вычисления STFT.

nsemitones = 8;
lockPhase = false;
audioOut = shiftPitch (S,  nsemitones,...
                     "Window", выигрывайте ,...
                     "OverlapLength", overlapLength ,...
                     "LockPhase", lockPhase);

звук (audioOut, fs)

Уменьшите тангаж исходного аудио на 8 полутонов и прослушайте результат. Задайте длину окна и перекрытия, которые вы использовали для вычисления STFT.

nsemitones = -8;
lockPhase = false;
audioOut = shiftPitch (S,  nsemitones,...
                     "Window", выигрывайте ,...
                     "OverlapLength", overlapLength ,...
                     "LockPhase", lockPhase);

звук (audioOut, fs)

Читайте в аудио файла и слушайте его.

[audioIn,fs] = audioread('FemaleSpeech-16-8-mono-3secs.wav');
sound(audioIn,fs)

Увеличьте тангаж на 6 полутонов и послушайте результат.

nsemitones = 6;
lockPhase = false;
audioOut = shiftPitch(audioIn,nsemitones, ...
                     'LockPhase',lockPhase);
sound(audioOut,fs)

Для повышения точности задайте LockPhase на true. Примените перемену тангажа и прослушайте результаты.

lockPhase = true;
audioOut = shiftPitch(audioIn,nsemitones, ...
                     'LockPhase',lockPhase);
sound(audioOut,fs)

Читайте в первые 11,5 секунд аудио файла и слушайте его.

[audioIn,fs] = audioread('Rainbow-16-8-mono-114secs.wav',[1,8e3*11.5]);
sound(audioIn,fs)

Увеличьте тангаж на 4 полутона и примените фазу замок. Послушайте результаты. Получившееся аудио имеет «чипмунк эффект», который звучит неестественно.

nsemitones = 4;
lockPhase = true;
audioOut = shiftPitch (audioIn,  nsemitones,...
    "LockPhase", lockPhase);

звук (audioOut, fs)

Для повышения точности задайте PreserveFormants на true. Используйте порядок по умолчанию cepstral 30. Послушайте результат.

cepstralOrder = 30;
audioOut = shiftPitch (audioIn,  nsemitones,...
    "LockPhase", lockPhase ,...
    "PreserveFormants"Правда, ...
    "CepstralOrder", cepstralOrder);

звук (audioOut, fs)

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

свернуть все

Входной сигнал, заданный как вектор-столбец, матрица или трехмерный массив. Как интерпретируется функция audioIn зависит от сложности audioIn:

  • Если audioIn реально, audioIn интерпретируется как сигнал временной области. В этом случае audioIn должен быть вектором-столбцом или матрицей. Столбцы интерпретируются как отдельные каналы.

  • Если audioIn комплексный, audioIn интерпретируется как сигнал частотного диапазона. В этом случае audioIn должен быть L -by- M -by- N массивом, где L - длина БПФ, M - количество отдельных спектров, а N - количество каналов.

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

Количество полутонов, на которые можно сдвинуть аудио, заданное как действительный скаляр.

Область области значений nsemitones зависит от длины окна (число (Window)) и длина перекрытия (OverlapLength):

-12 * log2 (число (Window) - OverlapLength)nsemitones-12 * log2 ((число (Window) - OverlapLength)/numel (Window))

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

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

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

Пример: 'Window',kbdwin(512)

Окно, примененное во временном интервале, задается как разделенная разделенными запятой парами, состоящая из 'Window' и вектор действительных чисел. Количество элементов в векторе должно быть в области значений [1, size (audioIn,1)]. Количество элементов в векторе также должно быть больше OverlapLength.

Примечание

При использовании shiftPitch с входом частотного диапазона необходимо задать Window как то же окно, используемое для преобразования audioIn на частотный диапазон.

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

Количество выборок, перекрывающихся между смежными окнами, заданное как разделенная разделенными запятой парами, состоящая из 'OverlapLength' и целое число в области значений [0, numel(Window)).

Примечание

При использовании shiftPitch с входом частотного диапазона необходимо задать OverlapLength как та же длина перекрытия, используемая для преобразования audioIn во временно-частотное представление.

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

Примените единичную фазовую блокировку, заданную как разделенная разделенными запятой парами, состоящая из 'LockPhase' и false или true.

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

Сохраняет форманты, заданные как разделенная разделенными запятой парами, состоящая из 'PreserveFormants' и true или false. Осуществляют консервацию форманта с помощью оценки спектральной огибающей с помощью кепстрального анализа.

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

Порядок Cepstral, используемый для сохранения форманта, задается как разделенная разделенными запятой парами, состоящая из 'CepstralOrder' и неотрицательное целое число.

Зависимости

Чтобы включить этот аргумент пары "имя-значение", задайте PreserveFormants на true.

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

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

свернуть все

Аудио со сдвигом по тангажу, возвращаемое как вектор-столбец или матрица независимых каналов.

Алгоритмы

свернуть все

Для применения перемены тангажа, shiftPitch изменяет шкалу времени аудио с помощью фазы вокодера, а затем повторно суммирует измененное аудио. Алгоритм изменения шкалы времени основан на [1] и [2] и реализован как stretchAudio.

После изменения шкалы времени, shiftPitch выполняет преобразование скорости дискретизации с использованием коэффициента интерполяции, равного длине скачка анализа, и коэффициента десятикратного уменьшения, равного длине скачка синтеза. Коэффициенты интерполяции и десятикратного уменьшения на этапе повторной дискретизации выбираются следующим образом: Длина скачка анализа определяется как analysisHopLength = numel (Window) - OverlapLength. shiftPitch функция принимает, что в октаве 12 полутонов, поэтому коэффициент ускорения, используемый для растяжения звука, является speedupFactor = 2 ^ (- nsemitones/12). Коэффициент ускорения и длина скачка анализа определяют длину скачка синтеза для изменения шкалы времени следующим synthesisHopLength = round((1/SpeedupFactor)*analysisHopLength).

Достижимый сдвиг тангажа определяется длиной окна (numel (Window)) и OverlapLength. Чтобы увидеть отношение, обратите внимание, что уравнение для коэффициента ускорения может быть переписано как: nsemitones = -12 * log2 (speedupFactor), и уравнение для длины шага синтеза может быть переписано следующим speedupFactor = analysisHopLengh/synthesisHopLength. Используя простую замену, nsemitones = -12*log2(analysisHopLength/synthesisHopLength). Практическая область значений длины шага синтеза - [1, numel (Window)]. Область значений достижимых сдвигов тангажа:

  • Max количество уменьшенных полутонов: -12 * log2 (numel (Window) - OverlapLength)

  • Max количество поднятых полутонов: -12 * log2 ((numel (Window) - OverlapLength)/numel (Window))

Консервация форманта

Перемена тангажа может изменить спектральную огибающую сигнала со сдвигом тангажа. Чтобы уменьшить этот эффект, можно задать PreserveFormants на true. Если PreserveFormants установлено в trueалгоритм пытается оценить спектральную огибающую с помощью итеративной процедуры в кепстральной области, как описано в [3] и [4]. Для как исходного спектра, X, так и спектра со сдвигом по тангажу, Y, алгоритм оценивает спектральную огибающую следующим образом.

Для первой итерации EnvX a задано значение X. Затем алгоритм повторяет эти два шага в цикле:

  1. Lowpass фильтрует cepstral представление EnvX a, чтобы получить новую оценку, EnvX b. The CepstralOrder параметр управляет полосой пропускания quefrency.

  2. Чтобы обновить текущую лучшую аппроксимацию, алгоритм принимает поэлементный максимум текущей оценки спектральной огибающей и предыдущей оценки спектральной огибающей:

    EnvXa=max(EnvXa,EnvXb).

Цикл заканчивается, если либо максимальное количество итераций (100) достигается, или если все интервалы предполагаемой огибающей логарифмического каротажа находятся в пределах заданного допуска исходного спектра журнала. Для допуска задано значение log(10^(1/20)).

Наконец, алгоритм масштабирует спектр аудио со сдвигом основного тона на отношение оцененных огибающих, поэлементно:

Y=Y×(EnvXbEnvYb).

Ссылки

[1] Дриджер, Джонатан и Майнард Мюллер. A Review of Time-Scale Modification of Music Signals (неопр.) (недоступная ссылка). Прикладные науки. Том 6, Выпуск 2, 2016.

[2] Дриджер, Джонатан. «Алгоритмы изменения шкалы времени для музыкальных аудиосигналов». Магистерская диссертация. Саарландский университет, Саарбрюккен, Германия, 2011 год.

[3] Аксель Робель и Ксавье Роде. «Эффективная оценка спектральной огибающей и ее применение к перемене тангажа и сохранению огибающей». Международная конференция по цифровому аудио Эффектов, стр. 30-35. Мадрид, Испания, сентябрь 2005 года. hal-01161334

[4] С. Имаи, и Я. Абэ. «Экстракция спектральной огибающей улучшенным кепстральным методом». Электрон. и Коммун. в Японии. Том 62-A, выпуск 4, 1997, стр. 10-17.

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

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

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