主要内容

在MATLAB中使用相位声码器的音调移动和时间膨胀

这个例子展示了如何实现一个相位声码器来对音频信号进行时间拉伸和音高缩放。

简介

相位声码器通过将音频转换到频域来执行时间拉伸和音调缩放。下面的方框图显示了相位声码器实现中涉及的操作。

相位声码器具有执行重叠短时间FFT (ST-FFT)的分析部分和执行重叠逆短时间FFT (IST-FFT)的合成部分。为了对信号进行时间拉伸,相位声码器在合成部分的重叠添加操作中使用比分析部分更大的跳点大小。这里,跳点大小是一次处理的样本数量。结果,在频率含量不变的情况下,输出端的采样量比输入端的多。现在,你可以通过以更高的采样率回放这个信号,从而产生一个具有原始持续时间但音调更高的信号。

初始化

要实现最佳性能,必须在处理循环中使用System对象之前创建并初始化它们。使用下面的代码小节初始化所需的变量并加载输入语音数据。您将分析跳点大小设置为64,合成跳点大小设置为90,因为您希望将信号拉伸到90/64的倍数。

初始化一些用于配置下面创建的System对象的变量。

WindowLen = 256;AnalysisLen = 64;SynthesisLen = 90;Hopratio = SynthesisLen/AnalysisLen;

创建一个System对象从音频文件中读入输入语音信号。

Reader = dsp。AudioFileReader (“SpeechDFT-16-8-mono-5secs.wav”...“SamplesPerFrame”AnalysisLen,...“OutputDataType”“双”);

创建STFT/ISTFT pair

win =√(hanning(WindowLen,“周期”));STFT = dsp。STFT(win, WindowLen - AnalysisLen, WindowLen);Istft = dsp。ISTFT(win, WindowLen - SynthesisLen);

创建一个System对象来播放原始语音信号。

Fs = 8000;播放器= audioDeviceWriter(“SampleRate”Fs,...“万博1manbetxSupportVariableSizeInput”,真的,...“BufferSize”, 512);

创建一个System对象来记录数据。

logger = dsp.SignalSink;

初始化处理循环中使用的变量。

unwrapdata = 2*pi*AnalysisLen*(0:WindowLen-1)'/WindowLen;= 0 (WindowLen,1);第一次= true;

流处理循环

既然已经实例化了System对象,就可以创建一个处理循环,对输入信号执行时间扩展。方法检测到输入文件的末尾时,循环将停止AudioFileReader系统对象。

~isDone(reader) y = reader();球员(y);%播放原始音频% ST-FFTYfft = stft(y);将复杂的FFT数据转换为幅度和相位。Ymag = abs(yfft);Yprevangle = yangle;angle =角度(yfft);合成相计算通过计算相位增量来计算合成相位%之间的连续频率变换,展开它们,和缩放用分析跳数与合成跳数之比表示。Yunwrap = (yangle - yprevangle) - unwrapdata;Yunwrap = Yunwrap - round(Yunwrap /(2*pi))*2*pi;yunwrap = (yunwrap + unwrapdata) * Hopratio;如果第一次ysangle = yangle;第一次= false;其他的Ysangle = Ysangle + yunwrap;结束将幅度和相位转换为复数。Ys = ymag .* complex(cos(ysangle), sin(ysangle));% IST-FFTYistfft = istft(ys);记录器(yistfft)%日志信号结束

释放

调用System对象上的release来关闭所有打开的文件和设备。

发布(读者)发布(球员)

播放时间拉长的信号

loggedSpeech = logger.Buffer(200:end)';播放器= audioDeviceWriter(“SampleRate”Fs,...“万博1manbetxSupportVariableSizeInput”,真的,...“BufferSize”, 512);球员(loggedSpeech。');

播放音高比例信号

音高缩放信号是在较高采样率下播放的时间拉伸信号,其产生的信号具有较高的音高。

Fs_new = Fs*(SynthesisLen/AnalysisLen);播放器= audioDeviceWriter(“SampleRate”Fs_new,...“万博1manbetxSupportVariableSizeInput”,真的,...“BufferSize”, 1024);球员(loggedSpeech。');

时间膨胀audioTimeScaler

你可以很容易地应用时间膨胀audioTimeScaleraudioTimeScaler实现了一个用于时间缩放的分析合成相位声码器。

实例化一个audioTimeScaler使用所需的加速因子、窗口和分析跳长:

ats = audioTimeScaler(AnalysisLen/SynthesisLen,“窗口”,赢了,“OverlapLength”, WindowLen-AnalysisLen);

创建一个System对象来播放时间拉伸的语音信号。

播放器= audioDeviceWriter(“SampleRate”Fs,...“万博1manbetxSupportVariableSizeInput”,真的,...“BufferSize”, 512);

创建一个处理循环,对输入信号执行时间拉伸。

~isDone(reader) x = reader();对信号进行时间刻度Y = ats(x);播放时间尺度信号球员(y);结束发布(读者)发布(球员)

总结

此示例显示了相位声码器的实现,以执行语音信号的时间拉伸和音调缩放。运行示例时,您可以听到这些时间拉伸和音高比例的信号。

参考文献

a . D. Gotzen, N. Bernardini和D. Arfib,“相位-声码器的传统实现:交易技巧”,COST G-6数字音频效果会议(DAFX-00),维罗纳,意大利,2000年12月7-9日。