主要内容

stretchAudio

Time-stretch音频

描述

例子

audioOut= stretchAudio (audioInα通过TSM因子对输入音频应用时间刻度修改(TSM)α

例子

audioOut= stretchAudio (audioInα名称,值使用一个或多个选项指定选项名称,值对参数。

例子

全部折叠

读入音频信号。听音频信号,并绘制它随着时间的变化。

[audioIn,fs] = audioread(“Counting-16-44p1-mono-15secs.wav”);t = (0:size(audioIn,1)-1)/fs;情节(t, audioIn)包含(“时间(s)”) ylabel (“振幅”)标题(原始信号的)轴网格

图中包含一个轴对象。标题为Original Signal的axes对象包含一个类型为line的对象。

声音(audioIn fs)

使用stretchAudio要应用1.5加速因子。听修改后的音频信号,并将其绘制成随时间变化的图。采样率保持不变,但信号的持续时间减少了。

audioOut = stretchAudio(audioIn,1.5);t = (0:size(audioOut,1)-1)/fs;情节(t, audioOut)包含(“时间(s)”) ylabel (“振幅”)标题('修正信号,加速因子= 1.5')轴网格

图中包含一个轴对象。标题为Modified Signal, Speedup Factor = 1.5的axes对象包含一个line类型的对象。

声音(audioOut fs)

将原始音频信号减慢0.75倍。听修改后的音频信号,并将其绘制成随时间变化的图。采样率保持与原始音频相同,但信号的持续时间增加了。

audioOut = stretchAudio(audioIn,0.75);t = (0:size(audioOut,1)-1)/fs;情节(t, audioOut)包含(“时间(s)”) ylabel (“振幅”)标题(修正信号,加速因子= 0.75)轴网格

图中包含一个轴对象。标题为Modified Signal, Speedup Factor = 0.75的axes对象包含一个类型为line的对象。

声音(audioOut fs)

stretchAudio金宝app当使用默认的声码器方法时,支持频域音频的TSM。将TSM应用于频域音频使您可以对多个TSM因子重用STFT计算。

读入音频信号。听音频信号,并绘制它随着时间的变化。

[audioIn,fs] = audioread(“FemaleSpeech-16-8-mono-3secs.wav”);sound(audioIn,fs) t = (0:size(audioIn,1)-1)/fs;情节(t, audioIn)包含(“时间(s)”) ylabel (“振幅”)标题(原始信号的)轴网格

图中包含一个轴对象。标题为Original Signal的axes对象包含一个类型为line的对象。

将音频信号转换到频域。

Win =√(hann(256,“周期”));Ovrlp = 192;S = stft(audioIn,“窗口”,赢了,“OverlapLength”ovrlp,“中心”、假);

将音频信号加快1.4倍。指定用于创建频域表示的窗口和重叠长度。

Alpha = 1.4;audioOut = stretchAudio(S,alpha,“窗口”,赢了,“OverlapLength”, ovrlp);t = (0:size(audioOut,1)-1)/fs;情节(t, audioOut)包含(“时间(s)”) ylabel (“振幅”)标题(修改后的信号,TSM因子= 1.4)轴网格

图中包含一个轴对象。标题为Modified Signal, TSM Factor = 1.4的axes对象包含一个类型为line的对象。

将音频信号放慢0.8倍。指定用于创建频域表示的窗口和重叠长度。

Alpha = 0.8;audioOut = stretchAudio(S,alpha,“窗口”,赢了,“OverlapLength”, ovrlp);t = (0:size(audioOut,1)-1)/fs;情节(t, audioOut)包含(“时间(s)”) ylabel (“振幅”)标题('修正信号,TSM因子= 0.8')轴网格

图中包含一个轴对象。标题为Modified Signal, TSM Factor = 0.8的axes对象包含一个类型为line的对象。

默认的TSM方法(声码器)允许您额外应用锁相来提高原始音频的保真度。

读入音频信号。听音频信号,并绘制它随着时间的变化。

[audioIn,fs] = audioread(“SpeechDFT-16-8-mono-5secs.wav”);sound(audioIn,fs) t = (0:size(audioIn,1)-1)/fs;情节(t, audioIn)包含(“时间(s)”) ylabel (“振幅”)标题(原始信号的)轴网格

锁相给TSM增加了不小的计算负荷,而且并不总是必需的。缺省情况下,锁相功能处于关闭状态。对输入音频信号应用1.8的加速因子。听音频信号,并绘制它随着时间的变化。

Alpha = 1.8;tic audioOut = stretchAudio(audioIn,alpha);processingTimeWithoutPhaseLocking = toc
processingTimeWithoutPhaseLocking = 0.0798
t = (0:size(audioOut,1)-1)/fs;情节(t, audioOut)包含(“时间(s)”) ylabel (“振幅”)标题('修正信号,alpha = 1.8, LockPhase = false')轴网格

对输入音频信号应用相同的1.8加速因子,这次启用锁相。听音频信号,并绘制它随着时间的变化。

tic audioOut = stretchAudio(audioIn,alpha,“LockPhase”,真正的);processingTimeWithPhaseLocking = toc
processingTimeWithPhaseLocking = 0.1154
t = (0:size(audioOut,1)-1)/fs;情节(t, audioOut)包含(“时间(s)”) ylabel (“振幅”)标题('修正信号,alpha = 1.8, LockPhase = true')轴网格

波形相似性重叠-添加(WSOLA) TSM方法使您能够指定最大样本数以搜索最佳信号对齐。默认情况下,WSOLA delta是分析窗口中的样本数量减去相邻分析窗口之间重叠的样本数量。增加WSOLA增量会增加计算负荷,但也可能提高保真度。

读入音频信号。请听音频信号的前10秒。

[audioIn,fs] = audioread(“rockguitar - 16 - 96立体声- 72 secs.flac”);声音(audioIn (1:10 * fs,:), fs)

使用WSOLA方法对输入音频信号应用0.75的TSM因子。听音频信号的前10秒。

Alpha = 0.75;tic audioOut = stretchAudio(audioIn,alpha,“方法”“wsola”);processingTimeWithDefaultWSOLADelta = toc
processingTimeWithDefaultWSOLADelta = 19.4403
声音(audioOut (1:10 * fs,:), fs)

对输入音频信号应用0.75的TSM因子,这次将WSOLA增量增加到1024。听音频信号的前10秒。

tic audioOut = stretchAudio(audioIn,alpha,“方法”“wsola”“WSOLADelta”, 1024);processingtimewithincreedwsoladelta = toc
processingtimewithincreedwsoladelta = 25.5306
声音(audioOut (1:10 * fs,:), fs)

输入参数

全部折叠

输入信号,指定为列向量、矩阵或3-D数组。函数如何解释audioIn取决于的复杂程度audioIn而价值方法

  • 如果audioIn是真实的,audioIn被解释为时域信号。在这种情况下,audioIn必须是列向量或矩阵。列被解释为单独的通道。

    此语法适用于以下情况:方法设置为声码器的“wsola”

  • 如果audioIn是复杂的,audioIn被解释为频域信号。在这种情况下,audioIn一定是l——- - - - - -——- - - - - -N数组,l为FFT长度,单个光谱的数量,和N是通道数。

    此语法仅适用于方法设置为声码器的

数据类型:|
复数支持:金宝app是的

TSM因子,指定为正标量。

数据类型:|

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字在报价。

例子:“窗口”,kbdwin (512)

方法用于时间刻度音频,指定为由逗号分隔的对组成“方法”而且声码器的“wsola”.集“方法”声码器的使用相位声码器方法。集“方法”“wsola”使用WSOLA方法。

如果“方法”设置为声码器的audioIn可以是真实的,也可以是复杂的。如果“方法”设置为“wsola”audioIn一定是真的。

数据类型:|

窗口,指定为逗号分隔的对,由“窗口”一个实向量。向量中的元素个数必须在[1,大小(audioIn,1)].向量中的元素个数也必须大于OverlapLength

请注意

如果使用stretchAudio对于频域输入,必须指定窗口与用于转换的窗口相同audioIn到频域。

数据类型:|

相邻窗口之间重叠的样本数,指定为由逗号分隔的对组成的“OverlapLength”和一个范围为[0,元素个数(窗口)).

请注意

如果使用stretchAudio对于频域输入,必须指定OverlapLength作为相同的重叠长度用于变换audioIn到一个时频表示。

数据类型:|

应用标识锁相,指定为由逗号分隔的对组成“LockPhase”而且真正的

依赖关系

若要启用此名称-值对参数,请设置方法声码器的

数据类型:逻辑

用于搜索最佳信号对齐的最大样本数,指定为由逗号分隔的对组成“WSOLADelta”一个非负标量。

依赖关系

若要启用此名称-值对参数,请设置方法“wsola”

数据类型:|

输出参数

全部折叠

时间尺度修改音频,返回为列向量或矩阵的独立频道。

算法

全部折叠

阶段声码器

相位声码器算法是TSM的一种频域方法[1][2].相位声码器算法的基本步骤为:

  1. 该算法在η区间对时域信号开窗,其中η =数(窗口) -OverlapLength.然后将窗口转换到频域。

  2. 为了保持水平(跨时间)相位相干性,该算法将每个bin视为一个独立的正弦信号,其相位是通过累积其瞬时频率的估计来计算的。

  3. 为了保持垂直(跨单个频谱)相位相干性,该算法将箱组的相位推进锁定到局部峰值的相位推进。此步骤仅适用于LockPhase设置为真正的

  4. 该算法将修改后的频谱图返回到时域,窗口间隔为δ,其中δ≈η/α。参数指定的加速因子α输入参数。

WSOLA

WSOLA算法是TSM的时域方法[1][2].WSOLA是重叠和添加(OLA)算法的扩展。在OLA算法中,时域信号在η区间上加窗,其中η =数(窗口) -OverlapLength.为了构造时间尺度的修正输出音频,窗口间隔为δ,其中δ≈η/α。类型指定的TSM因子α输入参数。

OLA算法在重建幅度谱方面做得很好,但会在窗口之间引入相位跳变。WSOLA算法试图通过搜索来平滑相位跳跃WSOLADelta在η区间附近进行采样,以使相跳最小化。该算法迭代搜索最佳窗口,因此每个后续窗口都是相对于先前选择的窗口选择的。

如果WSOLADelta设置为0,则算法简化为OLA。

参考文献

[1]德里杰,乔纳森,迈纳德Müller。音乐信号的时间尺度修改综述应用科学.2016年第2期第6卷

[2]德里杰,乔纳森。“音乐音频信号的时间尺度修改算法”,硕士论文,萨尔大学,Saarbrücken,德国,2011。

扩展功能

C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。

版本历史

R2019b引入