matlab实现录音变声,MATLAB变声程序代码.docx

本文详细介绍了如何使用MATLAB编写变调不变速和变速不变调滤波器的代码,涉及线性预测、激励信号处理、语音重建和基音周期计算。通过实例展示了如何调整语音的频率和速度,适合音频信号处理初学者和进阶者研究。
摘要由CSDN通过智能技术生成

MATLAB变声程序代码

% ct1clear all,close all, clc; % 定义常数 FL = 80;? ?? ?? ?? ?? ? % 帧长 WL = 240;? ?? ?? ?? ?? ?% 窗长 P = 10;? ?? ?? ?? ?? ???% 预测系数个数 [s,fs] = wavread('sunday_2.wav');? ?? ?? ?? ? % 载入语音ss = s/max(s); %归一化 L = length(s);? ?? ?? ? % 读入语音长度 FN = floor(L/FL)-2;? ???% 计算帧数 % 预测和重建滤波器 exc = zeros(L,1);? ?? ? % 激励信号(预测误差) zi_pre = zeros(P,1);? ? % 预测滤波器的状态 s_rec = zeros(L,1);? ???% 重建语音 zi_rec = zeros(P,1); % 合成滤波器 exc_syn = zeros(L,1);? ?% 合成的激励信号(脉冲串) s_syn = zeros(L,1);? ???% 合成语音last_syn = 0;? ?%存储上一个(或多个)段的最后一个脉冲的下标zi_syn = zeros(P,1);? ?% 合成滤波器的状态 % 变调不变速滤波器 exc_syn_t = zeros(L,1);? ?% 合成的激励信号(脉冲串) s_syn_t = zeros(L,1);? ???% 合成语音last_syn_t = 0;? ?%存储上一个(或多个)段的最后一个脉冲的下标zi_syn_t = zeros(P,1);? ?% 合成滤波器的状态 % 变速不变调滤波器(假设速度减慢一倍)v=.5; exc_syn_v = zeros(v\L,1);? ?% 合成的激励信号(脉冲串) s_syn_v = zeros(v\L,1);? ???% 合成语音last_syn_v = 0;? ?%存储上一个(或多个)段的最后一个脉冲的下标zi_syn_v = zeros(P,1);? ?% 合成滤波器的状态 hw = hamming(WL);? ?? ? % 汉明窗 % 依次处理每帧语音 for n = 3:FN?% 计算预测系数(不需要掌握)?s_w = s(n*FL-WL+1:n*FL).*hw;? ? %汉明窗加权后的语音?[A E] = lpc(s_w, P);? ?? ?? ?? ?%用线性预测法计算P个预测系数 % A是预测系数,E会被用来计算合成激励的能量?if n == 27?% (3) 观察预测系统的零极点图?zplane(1,A);?end??s_f = s((n-1)*FL+1:n*FL);? ?? ? % 本帧语音,下面就要对它做处理?% (4) 用filter函数s_f计算激励,注意保持滤波器状态?[exc1,zi_pre] = filter(A,1,s_f,zi_pre);??exc((n-1)*FL+1:n*FL) = exc1; %计算得到的激励?% (5) 用filter函数和exc重建语音,注意保持滤波器状态?[s_rec1,zi_rec] = filter(1,A,exc1,zi_rec);??s_rec((n-1)*FL+1:n*FL) = s_rec1; %计算得到的重建语音?% 注意下面只有在得到exc后才会计算正确?s_Pitch = exc(n*FL-222:n*FL);?PT = findpitch(s_Pitch);? ? % 计算基音周期PT(不要求掌握)?G = sqrt(E*PT);? ?? ?? ???% 计算合成激励的能量G(不要求掌握) ?%方法3:本段激励只能修改本段长度?tempn_syn = [1:n*FL-last_syn]';?exc_syn1 = zeros(length(tempn_syn),1);?exc_syn1(mod(tempn_syn,PT)==0) = G; %某一段算出的脉冲?exc_syn1 = exc_syn1((n-1)*FL-last_syn+1:n*FL-last_syn);?[s_syn1,zi_syn] = filter(1,A,exc_syn1,zi_syn);?exc_syn((n-1)*FL+1:n*FL) =??exc_syn1;? ?%计算得到的合成激励?s_syn((n-1)*FL+1:n*FL) = s_syn1;? ?%计算得到的合成语音?last_syn = last_syn+PT*floor((n*FL-last_syn)/PT);??% (11) 不改变基音周期和预测系数,将合成激励的长度增加一倍,再作为filter?% 的输入得到新的合成语音,听一听是不是速度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值