Matlab 变音(声调高低和倍速)

该代码示例展示了如何使用Matlab进行音频处理,包括改变声音的声调(男变女,女变男)和播放速度。通过`resample`函数调整采样率实现倍速变化,`voice`函数用于改变基频。此外,还包含了频谱分析的部分代码,但未在摘要中详述。

Matlab 变音(声调高低和倍速)

clear;
[y,fs]=audioread('mao.mp3'); %读取声音文件
x1=y(:,1); %读入的y矩阵有两列,取第1列

frqratio = 1;   % 控制播放速度,>1倍速
ratio = 1.5;    % 更改采样率使基频改变 ratio>1降低(女变男);ratio<1升高(男变女)
Traudio = voice(x1,ratio);
audiowrite("TransformedAudio.wav",Traudio,frqratio*fs);

% 下面是频谱分析
% N=length(Traudio); %长度
% n=0:N-1;
% w=2*n*pi/N;
% y1=fft(Traudio); %对原始信号做FFT变换
% 
% subplot(2,1,1);
% plot(n,Traudio) %做原始语音信号的时域波形图
% title('变声语音信号时域图');
% xlabel('时间t');
% ylabel('幅值');
% 
% subplot(2,1,2); %做原始语音信号的频谱图
% plot(w/pi,abs(y1));
% title('变声语音信号频谱')
% xlabel('频率');
% ylabel('幅度');

function Y=voice(x,f) %更改采样率使基频改变 f>1降低(女变男);f<1升高(男变女)
    f=round(f*1000);    
    d=resample(x,f,1000); %时长整合使语音文件恢复原来时长    
    W=400;  
    Wov=W/2;    
    Kmax=W*2;   
    Wsim=Wov;    
    xdecim=8;    
    kdecim=2; X=d';    
    F=f/1000;   
    Ss =W-Wov;    
    xpts = size(X,2);    
    ypts = round(xpts / F);    
    Y = zeros(1, ypts);    
    xfwin = (1:Wov)/(Wov+1);    
    ovix = (1-Wov):0; newix = 1:(W-Wov);    
    simix = (1:xdecim:Wsim) - Wsim;    
    padX = [zeros(1, Wsim), X, zeros(1,Kmax+W-Wov)];   
    Y(1:Wsim) = X(1:Wsim); lastxpos = 0; km = 0;   
    for ypos = Wsim:Ss:(ypts-W)        
        xpos = round(F * ypos);        
        kmpred = km + (xpos - lastxpos);        
        lastxpos = xpos;        
        if (kmpred <= Kmax)        
            km = kmpred;       
        else        
            ysim = Y(ypos + simix);        
            rxy = zeros(1, Kmax+1);        
            rxx = zeros(1, Kmax+1);        
            Kmin = 0;        
            for k = Kmin:kdecim:Kmax        
                xsim = padX(Wsim + xpos + k + simix);            
                rxx(k+1) = norm(xsim);            
                rxy(k+1) = (ysim * xsim');        
            end        
            Rxy = (rxx ~= 0).*rxy./(rxx+(rxx==0));        
            km = min(find(Rxy == max(Rxy))-1);        
        end        
        xabs = xpos+km;       
        Y(ypos+ovix) = ((1-xfwin).*Y(ypos+ovix)) + (xfwin.*padX(Wsim+xabs+ovix));        
        Y(ypos+newix) = padX(Wsim+xabs+newix);    
    end
end

代码源自
https://zhuanlan.zhihu.com/p/57902993
作者:繁星不语
这里进行了输出处理

评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值