Передайте расширение перемены и времени Используя вокодер фазы в 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)

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

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

Ссылки

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