exponenta event banner

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",win, ...
                     "OverlapLength",overlapLength, ...
                     "LockPhase",lockPhase);

sound(audioOut,fs)

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

nsemitones = -8;
lockPhase = false;
audioOut = shiftPitch(S,nsemitones, ...
                     "Window",win, ...
                     "OverlapLength",overlapLength, ...
                     "LockPhase",lockPhase);

sound(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 полутона и примените фазовую блокировку. Выслушайте результаты. Получающийся звук имеет «эффект chipmunk», который звучит неестественно.

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

sound(audioOut,fs)

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

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

sound(audioOut,fs)

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

свернуть все

Входной сигнал, заданный как вектор столбца, матрица или массив 3-D. Как интерпретируется функция 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 должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как 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

Цепстральный порядок, используемый для консервации форманта, указанный как пара, разделенная запятыми, состоящая из '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)]. Диапазон достижимых сдвигов основного тона составляет:

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

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

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

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

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

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

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

    EnvXa = max (EnvXa, EnvXb).

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

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

Y = Y × (EnvXbEnvYb).

Ссылки

[1] Дриджер, Джонатан и Майнард Мюллер. «Обзор изменения музыкальных сигналов в масштабе времени». Прикладные науки. Том 6, выпуск 2, 2016.

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

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

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

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2019b