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