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

Фазовый вокодер имеет секцию анализа, которая выполняет перекрывающийся кратковременный БПФ (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 года.