要求:对语音信号进行处理改变频率,但处理后的语音信号声速速度不变化;

1.主函数

  1. clear
  2. [y1,fs]=audioread('11.m4a');%读取音乐信号
  3. y1=y1(:,1); %取单列
  4. N1=length(y1); %求信号长度
  5. n=0:N1-1; %所有元素
  6. t=n/fs; %时间
  7. f=0:fs/N1:fs*(N1-1)/N1; %频率
  8. Y1=fftshift(fft(y1,N1)); %傅里叶变换
  9. ratio = 1.5; % 更改采样率使基频改变 ratio>1降低(女变男); ratio<1升高(男变女)
  10. %画原信号图
  11. figure(1)
  12. subplot(2,2,1);
  13. plot(t,y1);
  14. xlabel('时间t');
  15. ylabel('幅度');
  16. title('原信号时域波形图');
  17. subplot(2,2,2);
  18. plot(f,abs(Y1));
  19. xlabel('频率f');
  20. ylabel('幅度');
  21. title('原信号频谱图');
  22. y2=voice(y1,ratio); %变声
  23. N2=length(y2);
  24. k=0:1:N2-1;
  25. t=k/fs;
  26. f=k*fs/N2;
  27. Y2=fftshift(fft(y2,N2));
  28. %画变音后信号图
  29. subplot(2,2,3);
  30. plot(t,y2);
  31. xlabel('时间t');
  32. ylabel('幅度');
  33. title('变声信号时域波形图');
  34. subplot(2,2,4);
  35. plot(f,abs(Y2));
  36. xlabel('频率f');
  37. ylabel('幅度');
  38. title('变声信号频谱图');
  39. sound(y2,fs);

2.voice.m



function Y=voice(x,ratio) %更改采样率使基频改变 f>1降低;f<1升高


f = ratio*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

image.png