主要内容

shiftPitch

变换音高

描述

例子

audioOut= shiftPitch (audioInnsemitones将音频输入的音调按指定的半音数进行移位,nsemitones

例子

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

例子

全部折叠

读入一个音频文件并听一听。

[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-mono-5secs.wav”);声音(audioIn fs)

将音频信号转换为时频表示stft.使用512点kbdwin75%的重叠。

Win = 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 mono - 114 secs.wav”, 1, 8 e3 * 11.5);声音(audioIn fs)

增加4个半音并应用锁相。听听结果。由此产生的音频有一种“花栗鼠效应”,听起来不自然。

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

要增加保真度,请设置PreserveFormants真正的.的默认倒谱顺序30..听结果。

cepstralOrder =30.;audioOut = shiftPitch(audioIn,nsemitones,...“LockPhase”lockPhase,...“PreserveFormants”,真的,...“CepstralOrder”, cepstralOrder);声音(audioOut fs)

输入参数

全部折叠

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

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

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

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

要移动音频的半音数,指定为实标量。

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

-12 * log2(元素个数(窗口) - - -OverlapLengthnsemitones-12 * log2((元素个数(窗口) - - -OverlapLength) /元素个数(窗口))

数据类型:|

名称-值参数

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

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

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

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

请注意

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

数据类型:|

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

请注意

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

数据类型:|

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

数据类型:逻辑

保留由逗号分隔的对组成的共振子“PreserveFormants”而且真正的.用谱包络估计和倒谱分析来保持共振峰。

数据类型:逻辑

用于保存共振峰的倒谱顺序,指定为逗号分隔的对,由“CepstralOrder”和一个非负整数。

依赖关系

若要启用此名称-值对参数,请设置PreserveFormants真正的

数据类型:|

输出参数

全部折叠

音高偏移音频,作为独立通道的列向量或矩阵返回。

算法

全部折叠

要应用pitch shift,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/ synthesishoplengh.用简单代换法,nsemitones = -12*log2(analysisHopLength/synthesisHopLength).实际的合成跳长范围为[1,元素个数(窗口].可实现的pitch shift范围为:

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

  • 最大半音数:-12 * log2((元素个数(窗口) - - -OverlapLength) /元素个数(窗口))

共振峰保存

基音移可以改变基音移信号的光谱包络。为了减少这种影响,您可以设置PreserveFormants真正的.如果PreserveFormants设置为真正的时,该算法尝试使用倒谱域的迭代过程估计谱包络,如中所述[3]而且[4].对于原始光谱,X,以及频移频谱,Y时,算法对谱包络线的估计如下。

在第一次迭代中,EnvX一个设置为X.然后,算法在循环中重复以下两个步骤:

  1. 的倒谱表示进行低通滤波EnvX一个为了得到一个新的估计,EnvXb.的CepstralOrder参数控制频率带宽。

  2. 为了更新当前的最佳拟合,算法逐元素取当前谱包络估计和先前谱包络估计的最大值:

    E n v X 一个 马克斯 E n v X 一个 E n v X b

如果最大迭代次数(One hundred.),或者估计日志包络的所有箱都在原始日志谱的给定公差范围内。容差设置为日志(10 ^ (1/20))

最后,该算法通过估计包络的比例,按元素缩放音调变化音频的频谱:

Y Y × E n v X b E n v Y b

参考文献

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

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

[3]阿克塞尔·罗贝尔和泽维尔·罗代特。高效谱包络估计及其在音高变换和包络保持中的应用。数字音频效果国际会议,第30-35页。2005年9月,西班牙马德里。哈尔- 01161334

[4]今井s和阿部y。改进倒谱法提取谱包络。电子。和Commun。在日本.第62-A卷,1997年第4期,第10-17页。

扩展功能

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

版本历史

R2019b引入