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. Используйте kbdwin с 512 точками с 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, фс)

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

nsemitones = -8;
lockPhase = false;
audioOut = shiftPitch (S, nsemitones, ...
                     "Window", победите, ...
                     "OverlapLength", overlapLength, ...
                     "LockPhase", lockPhase);

звук (audioOut, фс)

Читайте в звуковом файле и слушайте его.

[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, фс)

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

cepstralOrder = 30;
audioOut = shiftPitch (audioIn, nsemitones, ...
    "LockPhase", lockPhase, ...
    "PreserveFormants"TRUE, ...
    "CepstralOrder", cepstralOrder);

звук (audioOut, фс)

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

свернуть все

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

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

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

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

Количество полутонов, чтобы переключить аудио в виде действительного скаляра.

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

- 12*log2 (numel (Window)-OverlapLength)nsemitones-12*log2 ((numel (Window)-OverlapLength)/numel (Window))

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

Аргументы name-value

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

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

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

Примечание

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

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

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

Примечание

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

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

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

Типы данных: логический

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

Типы данных: логический

Порядок 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, алгоритм пытается оценить спектральный конверт с помощью итеративной процедуры в cepstral области, как описано в [3] и [4]. И для исходного спектра, X, и для переключенного тангажом спектра, Y, алгоритм оценивает спектральный конверт можно следующим образом.

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

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

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

    EnvXa=max(EnvXa,EnvXb).

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

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

Y=Y×(EnvXbEnvYb).

Ссылки

[1] Driedger, Джонатан и Майнард Мюллер. "Анализ модификации масштаба времени музыкальных сигналов". Прикладные науки. Издание 6, выпуск 2, 2016.

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

[3] Аксель Роебель и Ксавьер Родет. "Эффективная Спектральная Оценка Конверта и ее приложение, чтобы передать перемену и сохранение конверта". Международная конференция по вопросам Эффектов Цифрового аудио, стр 30–35. Мадрид, Испания, сентябрь 2005. hal-01161334

[4] С. Имай и И. Абэ. "Спектральная экстракция конверта улучшенным cepstral методом". Электрон. и Commun. в Японии. 62-A издание, Выпуск 4, 1997, стр 10–17.

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

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

Введенный в R2019b