Тангаж Перемены и расширение времени с помощью Фазы вокодера в MATLAB

Этот пример показов, как реализовать фазу вокодер для растяжения во времени и шкалы тангажа аудиосигнала.

Введение

Фазовый вокодер выполняет растяжение во времени и масштабирование тангажа путем преобразования аудио в частотный диапазон. Следующий блок схема показывает операции, связанные с реализацией фазы вокодера.

Фазовый вокодер имеет секцию анализа, которая выполняет перекрывание короткого БПФ (ST-FFT) и секцию синтеза, которая выполняет перекрывание обратного короткого БПФ (IST-FFT). Чтобы растянуть сигнал во времени, вокодер фазы использует больший размер скачка для операции наложения-сложения в разделе синтеза, чем раздел анализа. Здесь размер скачка является количеством выборок, обработанных за один раз. В результате, на выходе больше выборок, чем на входе, хотя содержимое частоты остается неизменным. Теперь можно поднять шкалу этого сигнала путем воспроизведения его с более высокой частотой дискретизации, которая выдает сигнал с исходной длительностью, но с более высоким тангажом.

Инициализация

Чтобы достичь оптимальной эффективности, вы должны создать и инициализировать свои системные объекты, прежде чем использовать их в цикле обработки. Используйте эти следующие разделы кода, чтобы инициализировать необходимые переменные и загрузить входные речевые данные. Вы установили размер шага анализа 64 и размер скачка синтеза 90, потому что вы хотите растянуть сигнал в 90/64 раза.

Инициализируйте некоторые переменные, используемые при конфигурировании созданных ниже системных объектов.

WindowLen = 256;
AnalysisLen = 64;
SynthesisLen = 90;
Hopratio = SynthesisLen/AnalysisLen;

Создайте Системный объект, чтобы считать в вход речевой сигнал от аудио файла.

reader = dsp.AudioFileReader('SpeechDFT-16-8-mono-5secs.wav', ...
  'SamplesPerFrame',AnalysisLen, ...
  'OutputDataType','double');

Создайте пару STFT/ISTFT

win = sqrt(hanning(WindowLen,'periodic'));
stft = dsp.STFT(win, WindowLen - AnalysisLen, WindowLen);                   
istft = dsp.ISTFT(win, WindowLen - SynthesisLen );

Создайте Системный объект, чтобы воспроизвести исходный речевой сигнал.

Fs = 8000;
player = audioDeviceWriter('SampleRate',Fs, ...
    'SupportVariableSizeInput',true, ...
    'BufferSize',512);

Создайте системный объект для регистрации данных.

logger = dsp.SignalSink;

Инициализируйте переменные, используемые в цикле обработки.

unwrapdata = 2*pi*AnalysisLen*(0:WindowLen-1)'/WindowLen;
yangle = zeros(WindowLen,1);
firsttime = true;

Цикл обработки потока

Теперь, когда вы создали экземпляры системных объектов, можно создать цикл обработки, который выполняет растяжение времени на входном сигнале. Цикл останавливается, когда вы достигаете конца входного файла, который обнаруживается AudioFileReader Системный объект.

while ~isDone(reader)
    y = reader();

    player(y); % Play back original audio

    % ST-FFT
    yfft = stft(y);
    
    % Convert complex FFT data to magnitude and phase.
    ymag       = abs(yfft);
    yprevangle = yangle;
    yangle     = angle(yfft);

    % Synthesis Phase Calculation
    % The synthesis phase is calculated by computing the phase increments
    % between successive frequency transforms, unwrapping them, and scaling
    % them by the ratio between the analysis and synthesis hop sizes.
    yunwrap = (yangle - yprevangle) - unwrapdata;
    yunwrap = yunwrap - round(yunwrap/(2*pi))*2*pi;
    yunwrap = (yunwrap + unwrapdata) * Hopratio;
    if firsttime
        ysangle = yangle;
        firsttime = false;
    else
        ysangle = ysangle + yunwrap;
    end

    % Convert magnitude and phase to complex numbers.
    ys = ymag .* complex(cos(ysangle), sin(ysangle));

    % IST-FFT
    yistfft = istft(ys);

    logger(yistfft) % Log signal 
end

Релиз

Вызовите релиз для системных объектов, чтобы закрыть все открытые файлы и устройства.

release(reader)
release(player)

Воспроизведение растянутых по времени сигналов

loggedSpeech = logger.Buffer(200:end)';
player = audioDeviceWriter('SampleRate',Fs, ...
    'SupportVariableSizeInput',true, ...
    'BufferSize',512);
player(loggedSpeech.');

Воспроизведение масштабированных сигналов тангажа

Масштабированный по тангажу сигнал является растянутым по времени сигналом, воспроизводимым с более высокой частотой дискретизации, который формирует сигнал с более высоким тангажем.

Fs_new = Fs*(SynthesisLen/AnalysisLen);
player = audioDeviceWriter('SampleRate',Fs_new, ...
    'SupportVariableSizeInput',true, ...
    'BufferSize',1024);
player(loggedSpeech.');

Расширение времени с audioTimeScaler

Вы можете легко применить расширение времени с audioTimeScaler. audioTimeScaler реализует вокодер фазы анализа-синтеза для масштабирования во времени.

Создание экземпляров audioTimeScaler с желаемым коэффициентом ускорения, окном и длиной скачка анализа:

ats = audioTimeScaler(AnalysisLen/SynthesisLen,'Window',win,'OverlapLength',WindowLen-AnalysisLen);

Создайте системный объект, чтобы воспроизвести растянутый во времени речевой сигнал.

player = audioDeviceWriter('SampleRate',Fs, ...
    'SupportVariableSizeInput',true, ...
    'BufferSize',512);

Создайте цикл обработки, который выполняет растяжение времени на входном сигнале.

while ~isDone(reader)
    
    x = reader();

    % Time-scale the signal
    y = ats(x);
    
    % Play the time-scaled signal
    player(y);
end

release(reader)
release(player)

Сводные данные

Этот пример показывает реализацию фазы вокодера, чтобы выполнить растяжение во времени и масштабирование тангажа речевого сигнала. Вы можете услышать эти растянутые по времени и масштабированные по тангажу сигналы, когда вы запускаете пример.

Ссылки

A. D. Готцен, Н. Бернардини и Д. Арфиб, «Традиционные реализации фазового вокодера: трюки торговли», Труды Конференции COST G-6 по цифровому аудио Эффектов (DAFX-00), Верона, Италия, 7-9 декабря 2000 года.