shiftPitch
变换音高
描述
将音频输入的音调按指定的半音数进行移位,audioOut
= shiftPitch (audioIn
,nsemitones
)nsemitones
.
使用一个或多个选项指定选项audioOut
= 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-mono-5secs.wav”);声音(audioIn fs)
将音频信号转换为时频表示stft
.使用512点kbdwin
75%的重叠。
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)
输入参数
audioIn
- - - - - -输入信号
列向量|矩阵|三维数组
输入信号,指定为列向量、矩阵或3-D数组。函数如何解释audioIn
取决于的复杂程度audioIn
:
如果
audioIn
是真实的,audioIn
被解释为时域信号。在这种情况下,audioIn
必须是列向量或矩阵。列被解释为单独的通道。如果
audioIn
是复杂的,audioIn
被解释为频域信号。在这种情况下,audioIn
一定是l——- - - - - -米——- - - - - -N数组,l为FFT长度,米单个光谱的数量,和N是通道数。
数据类型:单
|双
复数支持:金宝app是的
nsemitones
- - - - - -转换音频的半音数
真正的标量
要移动音频的半音数,指定为实标量。
的范围nsemitones
取决于窗口长度(元素个数(
)和重叠长度(窗口
)OverlapLength
):
-12 * log2(元素个数(
≤窗口
) - - -OverlapLength
)nsemitones
≤-12 * log2((元素个数(
窗口
) - - -OverlapLength
) /元素个数(窗口
))
数据类型:单
|双
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里的名字
参数名称和价值
对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。
在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字
在报价。
例子:“窗口”,kbdwin (512)
窗口
- - - - - -窗口应用于时域
√损害(1024年,“周期性”))
(默认)|真正的向量
窗口,指定为逗号分隔的对,由“窗口”
一个实向量。向量中的元素个数必须在[1,大小(
].向量中的元素个数也必须大于audioIn
,1)OverlapLength
.
请注意
如果使用shiftPitch
对于频域输入,必须指定窗口
与用于转换的窗口相同audioIn
到频域。
数据类型:单
|双
OverlapLength
- - - - - -相邻窗口之间重叠的样本数
轮(0.75 *元素个数(窗口
))
(默认)|在[0,元素个数(窗口
)
)
窗口
))窗口
)相邻窗口之间重叠的样本数,指定为由逗号分隔的对组成的“OverlapLength”
和一个范围为[0,元素个数(窗口)
).
请注意
如果使用shiftPitch
对于频域输入,必须指定OverlapLength
作为相同的重叠长度用于变换audioIn
到一个时频表示。
数据类型:单
|双
LockPhase
- - - - - -应用身份相位锁定
假
(默认)|真正的
应用身份相位锁定,指定为由逗号分隔的对组成“LockPhase”
而且假
或真正的
.
数据类型:逻辑
PreserveFormants
- - - - - -保持共振峰
假
(默认)|真正的
保留由逗号分隔的对组成的共振子“PreserveFormants”
而且真正的
或假
.用谱包络估计和倒谱分析来保持共振峰。
数据类型:逻辑
CepstralOrder
- - - - - -用于保存共振峰的倒谱序
30.(默认)|非负整数
输出参数
audioOut
-音调转换音频
列向量|矩阵
音高偏移音频,作为独立通道的列向量或矩阵返回。
算法
要应用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.然后,算法在循环中重复以下两个步骤:
的倒谱表示进行低通滤波EnvX一个为了得到一个新的估计,EnvXb.的
CepstralOrder
参数控制频率带宽。为了更新当前的最佳拟合,算法逐元素取当前谱包络估计和先前谱包络估计的最大值:
如果最大迭代次数(One hundred.
),或者估计日志包络的所有箱都在原始日志谱的给定公差范围内。容差设置为日志(10 ^ (1/20))
.
最后,该算法通过估计包络的比例,按元素缩放音调变化音频的频谱:
参考文献
[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++代码。
GPU数组
通过使用并行计算工具箱™在图形处理单元(GPU)上运行来加速代码。
版本历史
R2019b引入
Abrir比如
Tiene una versión modificada de este ejemplo。¿Desea abrir este ejemplo con sus modificaciones?
MATLAB突击队
Ha hecho clic en unenlace que对应一个este commando de MATLAB:
弹射突击队introduciéndolo en la ventana de commandos de MATLAB。Los navegadores web no permission comandos de MATLAB。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。