主要内容

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点kbdwin有75%的重叠。

赢得= kbdwin (512);overlapLength = 0.75 *元素个数(赢得);S = stft (audioIn...“窗口”,赢了,...“OverlapLength”overlapLength,...“中心”、假);

将音高增加8个半音,听结果。指定用于计算STFT的窗口和重叠长度。

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

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

nsemitones =-8;lockPhase =;nsemitones audioOut = shiftPitch(年代,...“窗口”,赢了,...“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)

输入参数

全部折叠

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

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

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

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

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

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

-12 * log2(元素个数(窗口)-OverlapLengthnsemitones-12 * log2((元素个数(窗口)-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 =圆((1 / SpeedupFactor) * analysisHopLength)

可实现的节距偏移由窗长(元素个数(窗口),OverlapLength.要看这个关系,请注意加速因子的方程可以重写为:nsemitones= -12 * log2 (speedupFactor),合成跳长方程可改写为speedupFactor = analysisHopLengh / synthesisHopLength.使用简单的替换,nsemitones = -12 * log2 (analysisHopLength / synthesisHopLength).合成跳距的实际范围为[1,元素个数(窗口].可实现的音高转换范围为:

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

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

共振峰保存

节距偏移可以改变节距偏移信号的谱包络。要减少这种效果,可以设置PreserveFormants真正的.如果PreserveFormants被设置为真正的,该算法尝试在倒谱域使用迭代过程估计谱包络,如中所述[3][4].对于原始光谱,X,和pitch-shift频谱,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] Driedger, Johnathan, Meinard Müller。音乐信号的时间尺度修正综述应用科学.2016年第6卷第2期。

[2] Driedger, Johnathan。音乐音频信号的时间尺度修正算法硕士论文。萨尔兰大学,Saarbrücken,德国,2011。

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

S. Imai和Y. Abe。改进倒谱法的光谱包络提取电子。和Commun。在日本.第62-A卷,第4期,1997年,10-17页。

扩展功能

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

介绍了R2019b