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