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

% Create a System object to log your data.
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);

Проигрывайте растянутые во времени сигналы

loggedSpeech = logger.Buffer(200:end)';
player = audioDeviceWriter('SampleRate', Fs, ...
    'SupportVariableSizeInput', true, ...
    'BufferSize', 512);
% Play time-stretched signal
player(loggedSpeech.');

Проигрывайте масштабируемые подачей сигналы

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

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

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

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

Ссылки

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