音高变化和时间膨胀在MATLAB中使用一个阶段声码器
这个例子展示了如何实现一个阶段声码器拉伸和音调比例音频信号。
介绍
声码器执行阶段时间拉伸和缩放通过将音频转换为频域。下面的框图显示了阶段声码器的实现中所涉及的操作。
阶段声码器的分析部分,执行一个重叠短时FFT (ST-FFT)和一个执行一个重叠的逆合成部分短期FFT (IST-FFT)。时间拉伸信号,声码器使用一个大的跳跃大小相交叠相加操作比分析部分在合成部分。这里,跳的大小是样品处理的数量。因此,有更多的样本输出比输入虽然频率内容是相同的。现在,你可以回到球场规模这个信号,采样率更高,产生一个信号与原来的时间但是更高的音调。
初始化
为了达到最佳性能,必须创建并初始化您的系统对象在使用它们之前处理循环。使用这些下一节的代码来初始化所需的变量和输入语音数据加载。你设置一个分析合成跳和跳大小为64大小为90,因为你想要拉伸信号因子的90/64。
初始化一些变量中使用下面的配置系统对象创建。
WindowLen = 256;AnalysisLen = 64;SynthesisLen = 90;Hopratio = SynthesisLen / AnalysisLen;
创建一个系统对象读取输入语音信号从一个音频文件。
读者= dsp.AudioFileReader (“SpeechDFT-16-8-mono-5secs.wav”,…“SamplesPerFrame”AnalysisLen,…“OutputDataType”,“双”);
创建STFT / ISTFT一对
赢得=√汉宁(WindowLen“周期”));stft = dsp。STFT(赢,WindowLen - AnalysisLen WindowLen);istft = dsp。ISTFT(赢,WindowLen SynthesisLen);
创建一个系统对象的原始语音信号。
Fs = 8000;球员= audioDeviceWriter (“SampleRate”Fs,…“金宝appSupportVariableSizeInput”,真的,…“BufferSize”,512);
创建一个系统对象记录您的数据。
记录器= dsp.SignalSink;
初始化变量用于处理循环。
unwrapdata = 2 *π* AnalysisLen * (0: WindowLen-1) / WindowLen;yangle = 0 (WindowLen, 1);首次= true;
流处理循环
系统现在已经实例化对象,您可以创建一个执行时间拉伸处理循环输入信号。循环停止当你到达输入文件,检测到的AudioFileReader
系统对象。
而~结束(读者)y =读者();球员(y);%原音频回放% ST-FFTyfft = stft (y);%将复杂的FFT数据转换成大小和相位。ymag = abs (yfft);yprevangle = yangle;yangle =角(yfft);%计算合成阶段%的合成阶段计算通过计算相位增量%之间连续频率变换,打开它们,和可伸缩性%通过分析和合成跳之间的比例大小。yunwrap = (yangle - yprevangle) - unwrapdata;yunwrap = yunwrap -轮(yunwrap /(2 *π))* 2 *π;yunwrap = (yunwrap + unwrapdata) * Hopratio;如果首次ysangle = yangle;首次= false;其他的ysangle = ysangle + yunwrap;结束%大小和相位转换为复数。y = ymag。*复杂(cos (ysangle), sin (ysangle));% IST-FFTyistfft = istft (y);记录器(yistfft)%记录信号结束
释放
电话系统上发布对象关闭任何打开的文件和设备。
发布(读者)发布(球员)
玩Time-Stretched信号
loggedSpeech = logger.Buffer(200:结束)”;球员= audioDeviceWriter (“SampleRate”Fs,…“金宝appSupportVariableSizeInput”,真的,…“BufferSize”,512);球员(loggedSpeech。');
玩Pitch-Scaled信号
pitch-scaled信号time-stretched信号在高采样率更高的音调产生一个信号。
Fs_new = f * (SynthesisLen / AnalysisLen);球员= audioDeviceWriter (“SampleRate”Fs_new,…“金宝appSupportVariableSizeInput”,真的,…“BufferSize”,1024);球员(loggedSpeech。');
时间膨胀与audioTimeScaler
你可以很容易地应用时间膨胀audioTimeScaler
。audioTimeScaler
声码器实现一个analysis-synthesis阶段时间比例。
实例化一个audioTimeScaler
与期望的加速因子、窗口和分析跳长度:
ats = audioTimeScaler (AnalysisLen / SynthesisLen,“窗口”,赢了,“OverlapLength”,WindowLen-AnalysisLen);
创建一个系统对象time-stretched语音信号。
球员= audioDeviceWriter (“SampleRate”Fs,…“金宝appSupportVariableSizeInput”,真的,…“BufferSize”,512);
创建一个处理循环,对输入信号执行时间伸展。
而~结束(读者)x =读者();%时标信号y = ats (x);%的时间尺度的信号球员(y);结束发布(读者)发布(球员)
总结
这个例子显示了一个阶段的实现声码器执行时间拉伸和球场语音信号的比例。你能听到这些time-stretched pitch-scaled信号当您运行这个示例。
引用
公元Gotzen: Bernardini和d . Arfib”的传统实现Phase-Vocoder:贸易的技巧,“诉讼成本为数字音频会议效果(DAFX-00),维罗纳,意大利,2000年12月7号到9号,。