变调不变速音频算法实现方法

加我微信hezkz17可以申请加入数字音频系统研究开发交流答疑群,加群附加赠送车载DSP音频项目核心开发资料,TWS降噪蓝牙耳机项目资料,

    我们在做快慢放操作时就使用到了变速不变调算法,这其实是变调算法中的一种用法。在讲算法具体实现之前我们先想一下,变调的物理含义是什么?之前我们讲语音信号分析的时候说过,不同的人发音的基频是不一样的。而音调和基频是直接相关的,要变调其实就是要改变基频。而基频的本质是一个信号的循环周期的倒数,比如基频是 250Hz,那么当前时间的语音信号就是以 4ms 为周期的信号。

我们要变调,其实就是把这个循环周期进行扩大或者缩小。如图 1 所示,如果我们把语音信号的基频提升一倍,或者说提升一个八度或者 12 个半音,那么时域信号(绿线部分,上面为变调前,下面为变调后)语音的波形还是很相似的,只是每一个周期都缩短了一半。再看看频域信号(红色部分)是不是变得更稀疏了?最下面的那根亮线代表的基频从 250Hz 左右提升到了大约 500Hz 的位置。由于谐波的频率是基频的倍数,所以谐波之间的间隔也变大了。

那么我们是如何实现音调提升的呢?其实方法很简单,就是把原来的信号进行重采样,但不改变播放信号的采样率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

已下架不支持订阅

实现变声器,变调变速的一种简单算法如下: 1. 读取音频文件,获取采样率和音频数据。 2. 根据变调的要求,计算出音频数据的变调系数。 3. 将音频数据分帧,每帧长度为采样率的1/100。 4. 对每帧进行傅里叶变换,得到频域数据。 5. 将频域数据按照变调系数进行变换,得到新的频域数据。 6. 对新的频域数据进行反傅里叶变换,得到新的时域数据。 7. 将新的时域数据按照变声系数进行变换,得到最终的音频数据。 8. 将最终的音频数据保存为新的音频文件。 具体实现过程如下: ```matlab % 读取音频文件 [y, Fs] = audioread('audiofile.wav'); % 计算变调系数 pitchShift = 2; % 变调系数,可以根据需要进行调整 pitchRatio = 2^(-pitchShift/12); % 分帧 frameSize = round(Fs/100); numFrames = floor(length(y)/frameSize); yFrames = reshape(y(1:numFrames*frameSize), frameSize, numFrames); % 傅里叶变换 yFft = fft(yFrames); % 变调 pitchFft = yFft .* repmat(pitchRatio.^(0:frameSize-1)', 1, numFrames); % 反傅里叶变换 pitchFrames = ifft(pitchFft); % 变声 stretchRatio = 1; % 变声系数,可以根据需要进行调整 stretchFrames = pitchFrames(1:round(frameSize/stretchRatio):end, :); % 合并帧 stretchY = reshape(stretchFrames, [], 1); % 保存文件 audiowrite('audiofile_pitchshift.wav', stretchY, Fs); ``` 这个算法实现变调和变声效果,但没有变速功能。如果需要实现变速,可以在分帧时调整帧的长度,例如可以将帧长按照变速系数进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值