shiftPitch

转换音频音调

描述

例子

音频输出= shiftPitch(AUDIOIN,nsemitones)将音频输入的音高按指定的半音数移动,nsemitones

例子

音频输出= shiftPitch(AUDIOIN,nsemitones,名称,值)使用一个或多个指定的选择名称,值对参数。

例子

全部折叠

在读取音频文件,听它。

[AUDIOIN,FS] = audioread(“Counting-16-44p1-mono-15secs.wav”);声音(audioIn fs)

通过3个半音增加间距,听的结果。

nsemitones = 3;AUDIOOUT = shiftPitch(AUDIOIN,nsemitones);声音(audioOut fs)

通过3个半音降低了原始音频的音调,听的结果。

nsemitones = -3;AUDIOOUT = shiftPitch(AUDIOIN,nsemitones);声音(audioOut fs)

在读取音频文件,听它。

[AUDIOIN,FS] = audioread(“SpeechDFT-16-8-单5secs.wav”);声音(audioIn fs)

将音频信号转换为时频表示STFT。使用512点kbdwin用75%的重叠。

赢= kbdwin(512);overlapLength = 0.75 * numel(WIN);S = STFT(AUDIOIN,...“窗口”,赢了,...“OverlapLength”overlapLength,...“中心”,假);

把音高提高8个半音,听一下结果。指定用于计算STFT的窗口和重叠长度。

nsemitones =8;lockPhase =;AUDIOOUT = shiftPitch(S,nsemitones,...“窗口”,赢了,...“OverlapLength”overlapLength,...“LockPhase”, lockPhase);声音(audioOut fs)

将原声音高降低8个半音,然后听结果。指定用于计算STFT的窗口和重叠长度。

nsemitones =8;lockPhase =;AUDIOOUT = shiftPitch(S,nsemitones,...“窗口”,赢了,...“OverlapLength”overlapLength,...“LockPhase”, lockPhase);声音(audioOut fs)

在读取音频文件,听它。

[AUDIOIN,FS] = audioread(“FemaleSpeech-16-8-mono-3secs.wav”);声音(audioIn fs)

由6个半音增加俯仰,听的结果。

nsemitones = 6;lockPhase = FALSE;AUDIOOUT = shiftPitch(AUDIOIN,nsemitones,...“LockPhase”, lockPhase);声音(audioOut fs)

为了增加保真度,设置LockPhase真正。应用音高转换,并听取结果。

lockPhase = TRUE;AUDIOOUT = shiftPitch(AUDIOIN,nsemitones,...“LockPhase”, lockPhase);声音(audioOut fs)

阅读音频文件的前11.5秒,然后听它。

[AUDIOIN,FS] = audioread('彩虹-16-8-单114secs.wav', 1, 8 e3 * 11.5);声音(audioIn fs)

增加球场4半音来锁定和应用阶段。听听结果。产生的声音有一种“花栗鼠效应”,听起来不自然。

nsemitones =4;lockPhase =真正;AUDIOOUT = shiftPitch(AUDIOIN,nsemitones,...“LockPhase”, lockPhase);声音(audioOut fs)

为了增加保真度,设置PreserveFormants真正。使用默认的cepstral顺序三十。听听结果。

cepstralOrder =三十;AUDIOOUT = shiftPitch(AUDIOIN,nsemitones,...“LockPhase”,lockPhase,...“PreserveFormants”,真正,...“CepstralOrder”, cepstralOrder);声音(audioOut fs)

输入参数

全部折叠

输入信号,指定为列向量、矩阵或三维数组。函数如何解释AUDIOIN取决于。的复杂性AUDIOIN:

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

  • 如果AUDIOIN是复杂的,AUDIOIN被解释为频域信号。在这种情况下,AUDIOIN必须是一个l——- - - - - -——- - - - - -N阵列,其中l是FFT长度,是个人频谱的数量,和N为通道的数量。

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

半音数转向由音频,指定作为一个真正的标量。

的范围nsemitones取决于窗口长度(元素个数(窗口))且重叠长度(OverlapLength):

-12 * log2(元素个数(窗口) - - -OverlapLength)nsemitones-12 *的log 2((numel(窗口) - - -OverlapLength) /元素个数(窗口))

数据类型:|

名称-值对的观点

的可选逗号分隔对名称,值参数。名称参数名称和是对应的值。名称必须出现在引号内。可以按任意顺序指定多个名称和值对参数Name1, Value1,…,的家

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

窗口在时域中应用,指定为逗号分隔的一对组成的'窗口'一个实向量。向量中的元素个数必须在范围内[1,尺寸(AUDIOIN,1)]。元件的载体中的数量也必须大于OverlapLength

请注意

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

数据类型:|

相邻窗口之间重叠的样本数,指定为逗号分隔对所组成的'OverlapLength'和在范围[0的整数,元素个数(窗口))。

请注意

如果使用shiftPitch与频域输入,您必须指定OverlapLength作为相同的重叠长度用于变换AUDIOIN到时间-频率表示。

数据类型:|

应用标识相位锁定,指定为逗号分隔的对,由“LockPhase”要么真正

数据类型:逻辑

蜜饯共振峰,指定为逗号分隔的一对组成的“PreserveFormants”真正要么。共振峰保存使用频谱包络估计与倒频谱分析尝试。

数据类型:逻辑

用于共振峰保存的倒谱阶,指定为逗号分隔对所组成的“CepstralOrder”一个非负整数。

依赖

为了使这个名字 - 值对参数,设置PreserveFormants真正

数据类型:|

输出参数

全部折叠

音高改变音频,返回作为独立信道的一个列向量或矩阵。

算法

全部折叠

采用间距移,shiftPitch修改使用相位声码器,然后音频的时标重新采样修改的音频。在时间比例修改算法是基于[1][2]和的实现方式为stretchAudio

时标修改后,shiftPitch使用与分析跳长相等的插值因子和与合成跳长相等的抽取因子来执行采样率转换。重采样的插值和大量毁灭因素选择如下阶段:分析跳长度决定analysisHopLength =元素个数(窗口) - - -OverlapLength。的shiftPitch函数假设一个八度有12个半音,所以用于拉伸音频的加速因子为speedupFactor = 2 ^( -nsemitones/ 12)。加速因子和分析跳长决定了时间尺度修正的合成跳长synthesisHopLength = ROUND((1 / SpeedupFactor)* analysisHopLength)

可达到的音高移位由窗口长度决定(元素个数(窗口))和OverlapLength。可以看到,加速因子的方程可以改写为:nsemitones= -12 * log2 (speedupFactor),合成跳长方程可以改写为speedupFactor = analysisHopLengh / synthesisHopLength。使用简单的替换,nsemitones = -12 *的log 2(analysisHopLength / synthesisHopLength)。合成跳长实际范围为[1,元素个数(窗口)]。可实现的音高变化范围为:

  • 半音的最大数目降低:-12 * log2(元素个数(窗口) - - -OverlapLength)

  • 半音的最大数量提出:-12 *的log 2((numel(窗口) - - -OverlapLength) /元素个数(窗口))

共振峰保存

移调可改变音高改变信号的频谱包络。为了减少这种效果,你可以设置PreserveFormants真正。如果PreserveFormants被设置为真正,该算法试图估计谱包络使用倒频谱域的迭代程序,如在[3][4]。对于原来的频谱上,Xpitch-shifted频谱,Y时,算法估计谱包络如下。

对于第一次迭代,EnvX一个被设置为X。然后,算法重复循环这两个步骤:

  1. 的低通滤波EnvX一个为了得到一个新的估计,EnvXb。的CepstralOrder参数控制逆频带宽。

  2. 更新当前最佳匹配,该算法将中的元素最大的电流包络谱估计和前面的谱包络估计:

    E n v X 一个 = 马克斯 ( E n v X 一个 , E n v X b )

的循环结束,如果任一迭代的最大数目(100)达到,或者如果估计数包络的所有纸槽是原始日志给光谱公差范围内。容差设置为日志(10 ^ (1/20))

最后,该算法缩放音高改变音频的由估计信封,逐元素的比例光谱:

Y = Y × ( E n v X b E n v Y b )

参考文献

德里杰、乔纳森和米纳德·穆勒。“回顾音乐信号的时间尺度修改。”应用科学。2016年第6卷第2期

[2] Driedger, Johnathan。“音乐音频信号的时间尺度修改算法。”硕士论文。萨尔兰大学,萨尔布吕肯,德国,2011年。

[3] Axel Roebel和Xavier Rodet。有效的光谱包络估计及其在基音移动和包络保持中的应用。数字音频效果国际会议,第30-35页。马德里,西班牙,2005年9月。哈尔- 01161334

[4] S.今井,和Y.安倍。“改良倒谱法谱包络提取”。电子。和Commun。在日本。卷。62-A,第4期,1997年,第10-17。

扩展功能

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

介绍了R2019b