exponenta event banner

Сдвиг основного тона и расширение времени с использованием фазового вокодера в 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 );

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

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 на объектах System, чтобы закрыть все открытые файлы и устройства.

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 года.