Этот пример показов, как реализовать фазу вокодер для растяжения во времени и шкалы тангажа аудиосигнала.
Фазовый вокодер выполняет растяжение во времени и масштабирование тангажа путем преобразования аудио в частотный диапазон. Следующий блок схема показывает операции, связанные с реализацией фазы вокодера.
Фазовый вокодер имеет секцию анализа, которая выполняет перекрывание короткого БПФ (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 года.