MATLAB变声程序代码
- 格式:docx
- 大小:19.15 KB
- 文档页数:3
读取音乐信号并将信号转换为单声道的,并输出信号的波形图和频谱图,播放音乐信号,注意不同抽样率下的音调变化。
1. 源程序[w,fs,bit]=wavread('天路.wav');//获取音乐信号 wav=(w(:,1))';//获取单声道信号 sound(w,fs)//播放音乐信号 figure;//画音乐信号波形 subplot(2,1,1);plot(wav);fwav=fft(wav);%对音乐信号做傅里叶变换 lwav=round(length(fwav)/2);%信号长度去一半 nwav=[0:lwav-1];wwav=nwav/(lwav);f=wwav/2*fs; subplot(2,1,2);%画频谱图 plot(wwav,abs(fwav(1:lwav))); 3,输出波形24681012x 104-0.4-0.200.20.400.10.20.30.40.50.60.70.80.910500100015002000音乐信号的滤波去噪1,实验内容读取音乐信号,输出原始信号的波形和频谱,将三余弦的混合噪声加在音乐信号上,用巴特沃斯IIR滤波器进行滤波,观察滤波后的音乐信号;再将白噪声加在原始的音乐信号上,用矩形窗进行滤波,观察滤波后的音乐信号。
2,源程序[w,fs,bit]=wavread('天路.wav');wav=(w(:,1))';sound(w,fs)figure;subplot(2,1,1);plot(wav);fwav=fft(wav);lwav=round(length(fwav)/2);nwav=[0:lwav-1];wwav=nwav/(lwav);f=wwav/2*fs;subplot(2,1,2);plot(wwav,abs(fwav(1:lwav)));sf1=3000;l=length(wav);T=1/fs;t=0:T:(l-1)*T;s1=0.05*cos(2*pi*sf1*t);wav_s1=wav+s1;sound(wav_s1,fs)fwav_s1=fft(wav_s1);f_s1=fft(s1);figure;title('余弦噪声')subplot(2,1,1);plot(s1);subplot(2,1,2);plot(wwav,abs(f_s1(1:lwav)));figure;title('加噪信号')subplot(2,1,1);plot(wav_s1);subplot(2,1,2);plot(wwav,abs(fwav_s1(1:lwav)));T=1;Wp=2/T*tan(0.2*pi/2);Ws=2/T*tan(0.3*pi/2);Rp=1;Rs=60;[N,Wc]=buttord(Wp,Ws,Rp,Rs,'s');[B,A]=butter(N,Wc,'s');[C,D]=bilinear(B,A,1/T);W=0:0.001*pi:0.5*pi;H=freqs(B,A,W);Hd=freqz(C,D,W);figure;subplot(3,1,1);plot(W/pi,abs(H));title('模拟巴特沃斯滤波器');xlabel('Frequency/Hz');ylabel('Magnitude');Hd_db=-20*log(abs(Hd(1)./(abs(Hd)+eps))); subplot(3,1,2);plot(W/pi,abs(Hd));title('数字巴特沃斯滤波器');xlabel('Didtal Frequency/pi');ylabel('Magnitude');subplot(3,1,3);plot(W/pi,abs(Hd))title('数字巴特沃斯滤波器波特图');xlabel('Diditai Frequency/pi');ylabel('bd_Magnitude');%IIR滤波y=filter(C,D,wav_s1);sound(wav_s1,fs);figure;subplot(2,1,1);plot(y);Y=fft(y);subplot(2,1,2);plot(wwav,abs(Y(1:lwav)));l=length(wav);s2=(rand(1,l)-0.5)/5;wav_s2=wav+s2;sound(wav_s2,fs)fwav_s2=fft(wav_s2);f_s2=fft(s2);figure;title('随机噪声')subplot(2,1,1);plot(s2);subplot(2,1,2);plot(wwav,abs(f_s2(1:lwav))); figure;title('加噪信号')subplot(2,1,1);plot(wav_s2);subplot(2,1,2);plot(wwav,abs(fwav_s2(1:lwav))); %FIR 数字滤波器N=20;wc=pi/4;hd=ideal(N,wc);w1=boxcar(N);h1=hd.*w1';fh1=fft(h1,lwav);db1=-20*log(abs(fh1(1)./(abs(fh1)+eps)));w=2/(lwav)*[0:lwav-1];figure;subplot(2,2,1);stem(h1);subplot(2,2,2);plot(w,abs(fh1));subplot(2,2,3);plot(w,db1);subplot(2,2,4);plot(w,angle(fh1)); %矩形窗FIR 滤波damwav1=conv(wav1,h1); sound(damwav1,fs); figure;subplot(2,1,1);plot(damwav1); fdamwav1=fft(damwav1); subplot(2,1,2);plot(wwav,abs(fdamwav1(1:lwav))); sound(damwav2,fs); 3,输出波形24681012x 104-0.4-0.200.20.400.10.20.30.40.50.60.70.80.91050010001500200024681012x 104-0.100.10.20.300.10.20.30.40.50.60.70.80.9110002000300024681012x 104-0.4-0.200.20.400.10.20.30.40.50.60.70.80.911000200030000.050.10.150.20.250.30.350.40.450.500.51模拟巴特沃斯滤波器Frequency/HzM a g n i t u d e0.050.10.150.20.250.30.350.40.450.5012数字巴特沃斯滤波器Didtal Frequency/piM a g n i t u d e0.050.10.150.20.250.30.350.40.450.5012数字巴特沃斯滤波器波特图Diditai Frequency/pib d M a g n i t u d e24681012x 104-0.4-0.200.20.400.10.20.30.40.50.60.70.80.91050010001500200024681012x 104-0.1-0.0500.050.100.10.20.30.40.50.60.70.80.9102040608024681012x 104-0.4-0.200.20.400.10.20.30.40.50.60.70.80.91050010001500200005101520-0.100.10.20.300.51 1.520.511.50.511.52-800-600-400-20020000.51 1.52-4-202424681012x 104-0.4-0.200.20.400.10.20.30.40.50.60.70.80.910500100015002000。
% 载入声音[s,fs,nbits] = wavread('222');%播放原始声音sound(s,fs,nbits);FL = 80; % 帧长WL = 240; % 窗长P = 10; % 预测系数个数s = 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); % 合成滤波器的状态% 变速不变调滤波器(假设速度减慢一倍)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会被用来计算合成激励的能量s_f = s((n-1)*FL+1:n*FL); % 本帧语音,下面就要对它做处理%用filter函数s_f计算激励[exc1,zi_pre] = filter(A,1,s_f,zi_pre);exc((n-1)*FL+1:n*FL) = exc1; %计算得到的激励%用filter函数和exc重建语音[s_rec1,zi_rec] = filter(1,A,exc1,zi_rec);s_rec((n-1)*FL+1:n*FL) = s_rec1; %计算得到的重建语音s_Pitch = exc(n*FL-222:n*FL);PT = findpitch(s_Pitch); % 计算基音周期PTG = sqrt(E*PT); % 计算合成激励的能量Gtempn_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);%男声变女声PT1 =floor(PT/2); %减小基音周期poles = roots(A);deltaOMG =150*2*pi/fs;for p=1:10 %增加共振峰频率,实轴上方的极点逆时针转,下方顺时针转if imag(poles(p))>0 poles(p) = poles(p)*exp(j*deltaOMG);elseif imag(poles(p))<0 poles(p) = poles(p)*exp(-j*deltaOMG);endendA1=poly(poles);tempn_syn_t = [1:n*FL-last_syn_t]';exc_syn1_t = zeros(length(tempn_syn_t),1);exc_syn1_t(mod(tempn_syn_t,PT1)==0) = G; %某一段算出的脉冲exc_syn1_t = exc_syn1_t((n-1)*FL-last_syn_t+1:n*FL-last_syn_t);[s_syn1_t,zi_syn_t] = filter(1,A1,exc_syn1_t,zi_syn_t);exc_syn_t((n-1)*FL+1:n*FL) = exc_syn1_t; %计算得到的合成激励s_syn_t((n-1)*FL+1:n*FL) = s_syn1_t; %计算得到的合成语音last_syn_t = last_syn_t+PT1*floor((n*FL-last_syn_t)/PT1);end%绘图plot(s_syn_t),xlabel('n (samples)'), ...ylabel('Amplitude'), title('变换后语音信号'),...xlim([0,length(s_syn_t)]);%播放改变后的声音sound(2*s_syn_t);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findpitch函数% 计算一段语音的基音周期function PT = findpitch(s)[B, A] = butter(5, 700/4000);s = filter(B,A,s);R = zeros(143,1);for k=1:143R(k) = s(144:223)'*s(144-k:223-k);end[R1,T1] = max(R(80:143));T1 = T1 + 79;R1 = R1/(norm(s(144-T1:223-T1))+1);[R2,T2] = max(R(40:79));T2 = T2 + 39;R2 = R2/(norm(s(144-T2:223-T2))+1);[R3,T3] = max(R(20:39));T3 = T3 + 19;R3 = R3/(norm(s(144-T3:223-T3))+1);Top = T1;Rop = R1;if R2 >= 0.85*RopRop = R2;Top = T2; endif R3 > 0.85*RopRop = R3;Top = T3; endPT = Top;return。
MATLAB声音程序1.最炫民族风音频fs = 44100; % sample ratedt = 1/fs;T16 = 0.125;t16 = [0:dt:T16];[temp k] = size(t16);t4 = linspace(0,4*T16,4*k);t8 = linspace(0,2*T16,2*k);[temp i] = size(t4);[temp j] = size(t8);% Modification functionsmod4=(t4.^4).*exp(-30*(t4.^0.5));mod4=mod4*(1/max(mod4));mod8=(t8.^4).*exp(-50*(t8.^0.5));mod8=mod8*(1/max(mod8));mod16=(t16.^4).*exp(-90*(t16.^0.5));mod16=mod16*(1/max(mod16));f0 = 2*146.8; % reference frequencyScaleTable = [2/3 3/4 5/6 15/16 ...1 9/8 5/4 4/3 3/2 5/3 9/5 15/8 ...2 9/4 5/2 8/3 3 10/3 15/4 4 ...1/2 9/16 5/8];% 1/4 notesdo0f = mod4.*cos(2*pi*ScaleTable(21)*f0*t4);re0f = mod4.*cos(2*pi*ScaleTable(22)*f0*t4);mi0f = mod4.*cos(2*pi*ScaleTable(23)*f0*t4);fa0f = mod4.*cos(2*pi*ScaleTable(1)*f0*t4);so0f = mod4.*cos(2*pi*ScaleTable(2)*f0*t4);la0f = mod4.*cos(2*pi*ScaleTable(3)*f0*t4);ti0f = mod4.*cos(2*pi*ScaleTable(4)*f0*t4);do1f = mod4.*cos(2*pi*ScaleTable(5)*f0*t4);re1f = mod4.*cos(2*pi*ScaleTable(6)*f0*t4);mi1f = mod4.*cos(2*pi*ScaleTable(7)*f0*t4);fa1f = mod4.*cos(2*pi*ScaleTable(8)*f0*t4);so1f = mod4.*cos(2*pi*ScaleTable(9)*f0*t4);la1f = mod4.*cos(2*pi*ScaleTable(10)*f0*t4);tb1f = mod4.*cos(2*pi*ScaleTable(11)*f0*t4);ti1f = mod4.*cos(2*pi*ScaleTable(12)*f0*t4);re2f = mod4.*cos(2*pi*ScaleTable(14)*f0*t4); mi2f = mod4.*cos(2*pi*ScaleTable(15)*f0*t4); fa2f = mod4.*cos(2*pi*ScaleTable(16)*f0*t4); so2f = mod4.*cos(2*pi*ScaleTable(17)*f0*t4);la2f = mod4.*cos(2*pi*ScaleTable(18)*f0*t4);ti2f = mod4.*cos(2*pi*ScaleTable(19)*f0*t4);do3f = mod4.*cos(2*pi*ScaleTable(20)*f0*t4); blkf = zeros(1,i);% 1/8 notesdo0e = mod8.*cos(2*pi*ScaleTable(21)*f0*t8); re0e = mod8.*cos(2*pi*ScaleTable(22)*f0*t8); mi0e = mod8.*cos(2*pi*ScaleTable(23)*f0*t8); fa0e = mod8.*cos(2*pi*ScaleTable(1)*f0*t8);so0e = mod8.*cos(2*pi*ScaleTable(2)*f0*t8);la0e = mod8.*cos(2*pi*ScaleTable(3)*f0*t8);ti0e = mod8.*cos(2*pi*ScaleTable(4)*f0*t8);do1e = mod8.*cos(2*pi*ScaleTable(5)*f0*t8);re1e = mod8.*cos(2*pi*ScaleTable(6)*f0*t8);mi1e = mod8.*cos(2*pi*ScaleTable(7)*f0*t8);fa1e = mod8.*cos(2*pi*ScaleTable(8)*f0*t8);so1e = mod8.*cos(2*pi*ScaleTable(9)*f0*t8);la1e = mod8.*cos(2*pi*ScaleTable(10)*f0*t8);tb1e = mod8.*cos(2*pi*ScaleTable(11)*f0*t8); ti1e = mod8.*cos(2*pi*ScaleTable(12)*f0*t8); do2e = mod8.*cos(2*pi*ScaleTable(13)*f0*t8); re2e = mod8.*cos(2*pi*ScaleTable(14)*f0*t8); mi2e = mod8.*cos(2*pi*ScaleTable(15)*f0*t8); fa2e = mod8.*cos(2*pi*ScaleTable(16)*f0*t8); so2e = mod8.*cos(2*pi*ScaleTable(17)*f0*t8); la2e = mod8.*cos(2*pi*ScaleTable(18)*f0*t8);ti2e = mod8.*cos(2*pi*ScaleTable(19)*f0*t8); do3e = mod8.*cos(2*pi*ScaleTable(20)*f0*t8); blke = zeros(1,j);% 1/16 notesdo0s = mod16.*cos(2*pi*ScaleTable(21)*f0*t16); re0s = mod16.*cos(2*pi*ScaleTable(22)*f0*t16); mi0s = mod16.*cos(2*pi*ScaleTable(23)*f0*t16); fa0s = mod16.*cos(2*pi*ScaleTable(1)*f0*t16); so0s = mod16.*cos(2*pi*ScaleTable(2)*f0*t16); la0s = mod16.*cos(2*pi*ScaleTable(3)*f0*t16); ti0s = mod16.*cos(2*pi*ScaleTable(4)*f0*t16); do1s = mod16.*cos(2*pi*ScaleTable(5)*f0*t16); re1s = mod16.*cos(2*pi*ScaleTable(6)*f0*t16);fa1s = mod16.*cos(2*pi*ScaleTable(8)*f0*t16);so1s = mod16.*cos(2*pi*ScaleTable(9)*f0*t16);la1s = mod16.*cos(2*pi*ScaleTable(10)*f0*t16);tb1s = mod16.*cos(2*pi*ScaleTable(11)*f0*t16);ti1s = mod16.*cos(2*pi*ScaleTable(12)*f0*t16);do2s = mod16.*cos(2*pi*ScaleTable(13)*f0*t16);re2s = mod16.*cos(2*pi*ScaleTable(14)*f0*t16);mi2s = mod16.*cos(2*pi*ScaleTable(15)*f0*t16);fa2s = mod16.*cos(2*pi*ScaleTable(16)*f0*t16);so2s = mod16.*cos(2*pi*ScaleTable(17)*f0*t16);la2s = mod16.*cos(2*pi*ScaleTable(18)*f0*t16);ti2s = mod16.*cos(2*pi*ScaleTable(19)*f0*t16);do3s = mod16.*cos(2*pi*ScaleTable(20)*f0*t16); blks = zeros(1,k);% Melody by Schau_malpart0 = [mi1f la0e la0e do1f mi1f ...re1e re1s mi1s re1e do1e re1e do1e la0f ...mi1f la0e la0e do1f mi1f ...so1e re1s mi1s re1e do1e re1e do1e ti0e so0e ...mi1f la0e la0e do1f mi1f ...re1e re1s mi1s re1e do1e re1e do1e la0e so0e ...mi1f la0e la0e do1f mi1f ...so1e mi1e blkf blkf blkf ...];part1 = [la0f la0e so0e la0f la0e do1e ...do1f re1e do1e la0f la0f ...do1f do1e so0e do1e re1e mi1e so1e ...so1e mi1e re1f mi1f mi1f ...la1e la1e la1e so1e mi1e mi1f do1e ...la0e la0e la0e mi1e re1s mi1s re1e re1f ...mi1e mi1e so1e mi1e re1e mi1e re1e do1e ...la0f so0f la0f la0f ...];part2 = [mi1e mi1e so1e mi1e mi1e so1e so1e la1e ... do2e la1e so1f la1s do2s la1e la1f ...la0f la0e so0e la0f do1f ...re1e mi1s re1s do1e re1e mi1f mi1f ...la0e la1e la1e so1e re1e mi1s re1s do1e re1e ...mi1f mi1f blke blke blkf ...do1e la0e la0e do1e re1f so0e so0e ...mi1e so1e mi1e re1e do1f do1f ...la0e do1e re1e mi1e re1e do1e so0e mi0e ...la0f la0f blke blke blkf ...];part3 = [la0f la0e so0e la0f do1f ...re1e mi1s re1s do1e re1e mi1f mi1f ...la0e la1e la1e so1e re1e mi1s re1s do1e re1e ...mi1f mi1f blke blke blkf ...do1e la0e la0e do1e re1f so0e so0e ...mi1e so1e mi1e re1e do1f do1e do1e ...la0e do1e re1e mi1e so1e mi1e mi1e so1e ...la1f la1f la1f la1f ...];part4 = [la1e la1s la1s la1e la1e la1e la1s so1s mi1e re1e ...re1e re1s re1s mi1e mi1s so1s mi1e mi1s re1s do1e do1s la0s ...la0f la0e so0e la0f la0e do1e ...re1e mi1s re1s do1e re1e mi1f mi1f ...la1e so1e mi1e re1e so1e mi1e re1e do1e ...do1f do1f la0s do1s re1s mi1s re1s do1s la0s do1s];part5 = [do2e do2s do2s la1e la1s la1s so1e so1s so1s mi1e mi1s mi1s ...re1e mi1s re1s do1e la0s so0s la0s so0s do1s re1s mi1s so1s la1s re2s ...do2f do2f blks blks blks blks do1e re1e ...mi1f mi1f mi1f so1e mi1e ...la1f la1f la1e do1e so1e mi1e ...re1f re1e re1s re1s re1e re1e do1e re1e ...mi1f mi1e mi1s mi1s mi1e re1s do1s ti0e do1s re1s ...mi1f mi1f mi1f so1e mi1e ...do2f la1f la1f la1e do1e ...re1f so1f so1f la1f ...ti1f ti1f ti1f ti1f ...];part6 = [blkf blkf mi1e so1e mi1e so1e ...mi1f la0e la0s la0s do1f la0e mi1s la0s ...do1e do1s do1s re1e do1s re1s mi1f mi1f ...mi1f la0e la0s la0s so1f re1e re1s re1s ...mi1f mi1f mi1s re1s do1s la0s mi0s re0s mi0s so0s ...do1f la0e la0s la0s re1f so0e so0s so0s ...mi0f so0e so0s so0s do1f do1f ...la0f do1e do1s la0s mi1e mi1s mi1s re1e re1s mi1s ...];% Combination, v1 is complete version, v2 is simple version.v1 = [part0 part1 part1 part2 part3 part4 part0 part1 part1 part2 part3 part5 part3 part6 part3]; v2 = [part0 part1 part1 part2 part3 part5 part3 part6 part3];% Let's rock ^_^s = v1;s = s/max(s);sound(s,fs);ii以上内容来自知乎<电气小混混>。
% 载入声音[s,fs,nbits] = wavread('222');%播放原始声音sound(s,fs,nbits);FL = 80; % 帧长WL = 240; % 窗长P = 10; % 预测系数个数s = 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); % 合成滤波器的状态% 变速不变调滤波器(假设速度减慢一倍)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会被用来计算合成激励的能量s_f = s((n-1)*FL+1:n*FL); % 本帧语音,下面就要对它做处理%用filter函数s_f计算激励[exc1,zi_pre] = filter(A,1,s_f,zi_pre);exc((n-1)*FL+1:n*FL) = exc1; %计算得到的激励%用filter函数和exc重建语音[s_rec1,zi_rec] = filter(1,A,exc1,zi_rec);s_rec((n-1)*FL+1:n*FL) = s_rec1; %计算得到的重建语音s_Pitch = exc(n*FL-222:n*FL);PT = findpitch(s_Pitch); % 计算基音周期PTG = sqrt(E*PT); % 计算合成激励的能量Gtempn_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);%男声变女声PT1 =floor(PT/2); %减小基音周期poles = roots(A);deltaOMG =150*2*pi/fs;for p=1:10 %增加共振峰频率,实轴上方的极点逆时针转,下方顺时针转if imag(poles(p))>0 poles(p) = poles(p)*exp(j*deltaOMG);elseif imag(poles(p))<0 poles(p) = poles(p)*exp(-j*deltaOMG);endendA1=poly(poles);tempn_syn_t = [1:n*FL-last_syn_t]';exc_syn1_t = zeros(length(tempn_syn_t),1);exc_syn1_t(mod(tempn_syn_t,PT1)==0) = G; %某一段算出的脉冲exc_syn1_t = exc_syn1_t((n-1)*FL-last_syn_t+1:n*FL-last_syn_t);[s_syn1_t,zi_syn_t] = filter(1,A1,exc_syn1_t,zi_syn_t);exc_syn_t((n-1)*FL+1:n*FL) = exc_syn1_t; %计算得到的合成激励s_syn_t((n-1)*FL+1:n*FL) = s_syn1_t; %计算得到的合成语音last_syn_t = last_syn_t+PT1*floor((n*FL-last_syn_t)/PT1);end%绘图plot(s_syn_t),xlabel('n (samples)'), ...ylabel('Amplitude'), title('变换后语音信号'),...xlim([0,length(s_syn_t)]);%播放改变后的声音sound(2*s_syn_t);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findpitch函数% 计算一段语音的基音周期function PT = findpitch(s)[B, A] = butter(5, 700/4000);s = filter(B,A,s);R = zeros(143,1);for k=1:143R(k) = s(144:223)'*s(144-k:223-k);end[R1,T1] = max(R(80:143));T1 = T1 + 79;R1 = R1/(norm(s(144-T1:223-T1))+1);[R2,T2] = max(R(40:79));T2 = T2 + 39;R2 = R2/(norm(s(144-T2:223-T2))+1);[R3,T3] = max(R(20:39));T3 = T3 + 19;R3 = R3/(norm(s(144-T3:223-T3))+1);Top = T1;Rop = R1;if R2 >= 0.85*RopRop = R2;Top = T2; endif R3 > 0.85*RopRop = R3;Top = T3; endPT = Top;return。
MATLAB变声器电子工程学院摘要语音信号处理中的变声处理已经有了比较成熟的算法,本文阐述了变声算法的基础原理,利用数字滤波器,自相关法,LPC,LPC系数求根法等方法在MATLAB上改变语音信号的基频和共振峰以实现变声,并总结了现有变声算法的缺陷,对用不同的变换域能否改进变声算法做了粗略分析。
关键词:变声算法,LPC,变换域目录研究背景 (3)变声原理 (3)语音基本概念 (3)变声原理 (4)变声过程 (5)分帧处理 (5)计算LPC系数 (5)计算原始激励 (6)计算基音周期 (6)计算激励能量 (7)合成脉冲序列 (7)更改声道参数 (7)合成变声语音 (8)程序设计 (8)传统变声算法缺陷 (9)合成激励与原始激励差别较大 (9)不能实现定向变声 (10)实现定向变声的猜想 (11)小波域是否存在恒定音色参数粗略分析 (11)统计上的变换是否利于寻找恒定音色参数猜想 (11)下一步研究计划 (12)研究背景语音信号是人们日常生活中十分常见的信号,语音也是人与人之间传递信息的一种十分重要的方式。
随着智能终端以及互联网的普及,语音信号大量地以数字形式出现,语音信号处理变得越来越重要,变声处理是语音信号处理的基础之一,所以在这样的大背景下,研究变声算法并改进变声算法是很有意义而且有必要的。
另一方面,传统的变声算法是对发声过程的简单模拟进行语音合成,在模拟过程中改变参数以实现变声,而传统的变声算法存在一些缺陷,若要改进变声算法使其更灵活有效,那么细致的研究传统的变声算法是很有必要的。
变声原理语音基本概念1. 声道:声道是很多动物及人类都有的一个腔室,从声源产生的声音经由此处滤出。
人的声道包括声道则包括喉腔、咽头、口腔和鼻腔。
2. 基音:一般的声音都是由发音体发出的一系列频率、振幅各不相同的振动复合而成的。
这些振动中有一个频率最低的振动,由它发出的音就是基音,其余为泛音。
发音体整体振动产生的音,叫做基音,决定音高;发音体部分振动产生的音,叫做泛音,决定音色;基音和泛音结合一起而形成的音,叫做复合音,日常我们所听到的声音多为复合音。
hrtf旋转⾳效matlab实现原理参考:将⾳频分段,各个段分别使⽤hrtf在Ls, L, R, Ls, Rrs, Lrs位置处的filter系数。
是声⾳听起来来⾃Ls, L, R, Rs, Rrs, Lrs,就有旋转效果。
hrtf = load("E:\CIPIC_hrtf_database\standard_hrir_database\subject_21\hrir_final.mat");Ls = [1 9];L = [8 9];R= [17 9];Rs = [25 9];Rrs = [17 41];Lrs = [8 41];%source from 5.1 to L chh_l_l = squeeze(hrtf.hrir_l(L(1), L(2), :));h_r_l = squeeze(hrtf.hrir_l(R(1), R(2), :));h_ls_l = squeeze(hrtf.hrir_l(Ls(1), Ls(2), :));h_rs_l = squeeze(hrtf.hrir_l(Rs(1), Rs(2), :));h_lrs_l = squeeze(hrtf.hrir_l(Lrs(1), Lrs(2), :));h_rrs_l = squeeze(hrtf.hrir_l(Rrs(1), Rrs(2), :));%source from 5.1 to R chh_l_r = squeeze(hrtf.hrir_r(L(1), L(2), :));h_r_r = squeeze(hrtf.hrir_r(R(1), R(2), :));h_ls_r = squeeze(hrtf.hrir_r(Ls(1), Ls(2), :));h_rs_r = squeeze(hrtf.hrir_r(Rs(1), Rs(2), :));h_lrs_r = squeeze(hrtf.hrir_r(Lrs(1), Lrs(2), :));h_rrs_r = squeeze(hrtf.hrir_r(Rrs(1), Rrs(2), :));[input, fs] = wavread('input.wav');h_l = zeros(length(h_l_l), 6);h_l(:, 1) = h_ls_l;h_l(:, 2) = h_l_l;h_l(:, 3) = h_r_l;h_l(:, 4) = h_rs_l;h_l(:, 5) = h_rrs_l;h_l(:, 6) = h_lrs_l;h_r = zeros(length(h_l_r), 6);h_r(:, 1) = h_ls_r;h_r(:, 2) = h_l_r;h_r(:, 3) = h_r_r;h_r(:, 4) = h_rs_r;h_r(:, 5) = h_rrs_r;h_r(:, 6) = h_lrs_r;idx = 0;%change to another direction every 2 second (every N samples)N = fs * 2;%divide audio to loop segment, each segment has N samplesloop = int32(length(input(:, 1)) / N);fadeSize = 1024;win = hamming(fadeSize * 2, 'symmetric');fadeIn = win(1: fadeSize, 1);fadeOut = win(fadeSize + 1 : fadeSize * 2, 1);y = zeros(length(input(:, 1)), 2);fadeInData = zeros(fadeSize, loop-1, 2);fadeOutData = zeros(fadeSize, loop-1, 2);fadeOutStartIdx = N - fadeSize;outputStartIdx = 1;for i = 1:1:loop-1 idx = mod(i, 6); if idx == 0 idx = 6; end %current segment is inputStartIdx ~inputEndIdx inputStartIdx = int32((i-1) * N + 1); inputEndIdx = int32(i * N); pInput = pOutput = zeros(N, 2); pInput(:, 1) = input(inputStartIdx : inputEndIdx, 1); pInput(:, 2) = input(inputStartIdx : inputEndIdx, 2); if i * N < length(input(:, 1)) %current segment filter with HRTF, which make the sound comes from direction idx. pOutput(:, 1) = filter(h_l(:, idx), 1, pInput(:, 1)); pOutput(:, 2) = filter(h_l(:, idx), 1, pInput(:, 2)); end %fadeIn fadeOut at the begine & end of current segment to avoid pop noise fadeInData(: ,i, 1) = pOutput(1: fadeSize, 1) .* fadeIn; fadeInData(: ,i, 2) = pOutput(1: fadeSize, 2) .* fadeIn; fadeOutData(: ,i, 1) = pOutput(fadeOutStartIdx + 1: N, 1) .* fadeOut; fadeOutData(: ,i, 2) = pOutput(fadeOutStartIdx + 1: N, 2) .* fadeOut; if i > 1 %add the cross fade data at the begin & end of segment y(outputStartIdx:outputStartIdx + fadeSize-1, 1) = fadeInData(:, i, 1) + fadeOutData(:, i-1, 1); y(outputStartIdx:outputStartIdx + fadeSize-1, 2) = fadeInData(:, i, 2) + fadeOutData(:, i-1, 2); else %the first segment y(outputStartIdx:outputStartIdx + fadeSize-1, 1) = fadeInData(:, i, 1) ; y(outputStartIdx:outputStartIdx + fadeSize-1, 2) = fadeInData(:, i, 2) ; end y(outputStartIdx + fadeSize + 1: outputStartIdx + fadeOutStartIdx , 1) = pOutput(fadeSize+1: fadeOutStartIdx, 1); y(outputStartIdx + fadeSize + 1: outputStartIdx + fadeOutStartIdx , 2) = pOutput(fadeSize+1: fadeOutStartIdx, 2); outputStartIdx = outputStartIdx + fadeOutStartIdx;end% low pass filter to avoid pop noise at the begin & end of segmentwn = 10000 / fs;[B, A] = butter(8, wn, 'low');y = filter[B, A, y]wavwrite(y, fs, 'output.wav');。
文章主题:基于MATLAB的变声器设计与实现在音乐和语音处理领域,变声器是一种常见的设备,它可以改变声音的音调和音色,为音乐创作和语音处理带来了更多的可能性。
在本文中,我们将探讨基于MATLAB的变声器设计与实现,从原理到具体实现,为读者带来深入了解和实践指导。
一、变声器的原理和应用变声器是一种可以改变声音频率和谐波结构的设备,它在音乐创作、电子音乐制作以及语音处理中有着广泛的应用。
通过改变声音的音调和音色,变声器可以为音频增加特殊效果,为音乐创作和语音处理带来更多可能性。
二、MATLAB在音频处理中的应用MATLAB作为一种强大的科学计算软件,拥有丰富的音频处理工具和函数库,可以方便地进行音频数据处理和分析。
在音频处理中,MATLAB可以实现音频的读取、录制、分析、处理和合成,为音频处理带来了极大的便利。
三、基于MATLAB的变声器设计1. 我们需要了解音频信号的基本特性,包括音频信号的采样和量化过程,以及MATLAB中的音频数据表示方式。
2. 我们需要设计变声器的算法,包括音频信号的频率变换、时域变换和谐波结构的改变。
3. 接下来,我们可以使用MATLAB编写变声器的代码,包括音频信号的读取、处理和输出,以及界面设计和交互操作。
4. 我们还可以对设计好的变声器进行优化和测试,以确保其性能和效果达到预期的要求。
四、实现和应用通过上述步骤,我们可以在MATLAB中成功设计并实现一个变声器,可以对音频进行实时处理和效果展示。
在使用过程中,我们还可以根据具体音频的特点和需求,调整变声器的参数和效果,以获得更加理想的音频处理效果。
五、个人观点和总结基于MATLAB的变声器设计与实现,不仅可以帮助我们更好地理解音频处理的原理和方法,还可以为音乐创作和语音处理带来更多的可能性。
通过学习和实践,我们可以更深入地了解音频处理的相关知识,并掌握MATLAB在音频处理领域的应用技巧,为自己的学习和工作增添新的动力和乐趣。
function varargout = boy_girl(varargin)% BOY_GIRL M-file for boy_girl.fig% BOY_GIRL, by itself, creates a new BOY_GIRL or raises the existing% singleton*.%% H = BOY_GIRL returns the handle to a new BOY_GIRL or the handle to% the existing singleton*.%% BOY_GIRL('CALLBACK',hObject,eventData,handles,...) calls the local% function named CALLBACK in BOY_GIRL.M with the given input arguments. %% BOY_GIRL('Property','Value',...) creates a new BOY_GIRL or raises the% existing singleton*. Starting from the left, property value pairs are% applied to the GUI before boy_girl_OpeningFcn gets called. An% unrecognized property name or invalid value makes property application % stop. All inputs are passed to boy_girl_OpeningFcn via varargin.%% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".%% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help boy_girl% Last Modified by GUIDE v2.5 07-May-2011 12:11:56% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @boy_girl_OpeningFcn, ...'gui_OutputFcn', @boy_girl_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before boy_girl is made visible.function boy_girl_OpeningFcn(hObject, ~, handles, varargin)% This function has no output args, see OutputFcn.% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% varargin command line arguments to boy_girl (see VARARGIN)% Choose default command line output for boy_girlhandles.output = hObject;% Update handles structureguidata(hObject, handles);% UIWAIT makes boy_girl wait for user response (see UIRESUME)% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.function varargout = boy_girl_OutputFcn(~, ~, handles)% varargout cell array for returning output args (see VARARGOUT);% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)set(handles.time_edit,'string','10');set(handles.freq_edit,'string','8000');% Get default command line output from handles structureoriginalvarargout{1} = handles.output;function time_edit_Callback(~, ~, ~)% hObject handle to time_edit (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of time_edit as text% str2double(get(hObject,'String')) returns contents of time_edit as a double% --- Executes during object creation, after setting all properties.function time_edit_CreateFcn(hObject, ~, ~)% hObject handle to time_edit (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');endfunction freq_edit_Callback(~, eventdata, handles)% hObject handle to freq_edit (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of freq_edit as text% str2double(get(hObject,'String')) returns contents of freq_edit as a double% --- Executes during object creation, after setting all properties.function freq_edit_CreateFcn(hObject, ~, ~)% hObject handle to freq_edit (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');end% --- Executes on button press in start_pushbutton.function start_pushbutton_Callback(hObject, ~, handles)% hObject handle to start_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)freq=str2num(get(handles.freq_edit,'String'));time=str2num(get(handles.time_edit,'string'));ai=analoginput('winsound',0);%初始化录音麦克chanel=addchannel(ai,1);%1表示单声道set(ai,'SampleRate',freq);T=time; %录音时间set(ai,'SamplesPerTrigger',T*freq);start(ai);y=0;time=0;[y,time]=getdata(ai);%读出相应的数据handles.y=y;handles.Fs=freq;handles.yoriginal=y;handles.foriginal=freq;guidata(hObject,handles);plot(handles.axes1,time,handles.y)%画出声音波形title(handles.axes1,'时域图');xlabel(handles.axes1,'时间');ylabel(handles.axes1,'频率');set(handles.axes1,'Xgrid','on');set(handles.axes1,'Ygrid','on');% --- Executes on selection change in xuanpin_popupmenu.function xuanpin_popupmenu_Callback(hObject, eventdata, handles)% hObject handle to xuanpin_popupmenu (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)contents = cellstr(get(handles.xuanpin_popupmenu,'String')) ;%获取listbox1中的细胞矩阵item=contents{get(handles.xuanpin_popupmenu,'Value')};%获取listbox中的值if strcmp(item,'自定义')prompt={'频率编辑'};title='请输入频率:';lines=1;def={'8000'};answer=inputdlg(prompt,title,lines,def);handles.Fs=str2num(answer{1});guidata(hObject,handles);elseend% Hints: contents = cellstr(get(hObject,'String')) returns xuanpin_popupmenu contents as cell array% contents{get(hObject,'Value')} returns selected item from xuanpin_popupmenu% --- Executes during object creation, after setting all properties.function xuanpin_popupmenu_CreateFcn(hObject, eventdata, handles)% hObject handle to xuanpin_popupmenu (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: popupmenu controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');end% --- Executes on button press in open_pushbutton.function open_pushbutton_Callback(hObject, eventdata, handles)% hObject handle to open_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)[filename pathname]=uigetfile({'*.wav','ALL FILES(*.*)'},'选择声音文件');if isequal([filename pathname],[0,0])return;endstrname=[pathname filename];%选择的声音文件路径和文件名[data Fs]=wavread(strname);%temp表示声音数据Fs表示频率handles.y=data;handles.Fs=Fs;handles.yoriginal=data;handles.foriginal=Fs;guidata(hObject,handles);% --- Executes on button press in play_pushbutton.function play_pushbutton_Callback(hObject, eventdata, handles)% hObject handle to play_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)c=handles.Fs;contents = cellstr(get(handles.xuanpin_popupmenu,'String')) ;%获取listbox1中的细胞矩阵item=contents{get(handles.xuanpin_popupmenu,'Value')};%获取listbox中的值if strcmp(item,'默认频率')Fs=c;elseif strcmp(item,'低频')Fs=0.7*c;elseif strcmp(item,'高频')Fs=1.3*c;elseFs=handles.Fs;end;wavplay(handles.y,Fs);N=length(handles.y);y1=fft(handles.y,N);f1=0:Fs/N:Fs*(N-1)/N;plot(handles.axes1,f1,handles.y);title(handles.axes1,'原始时域图');xlabel(handles.axes1,'时间');ylabel(handles.axes1,'频率');set(handles.axes1,'Xgrid','on');set(handles.axes1,'Ygrid','on');plot(handles.axes2,f1(1:N/2),y1(1:N/2));set(handles.axes2,'Xgrid','on');set(handles.axes2,'Ygrid','on');title(handles.axes2,'频谱图');xlabel( handles.axes2,'频率');ylabel( handles.axes2,'幅度');% --- Executes on button press in yuchuli2_radiobutton.function yuchuli2_radiobutton_Callback(hObject, eventdata, handles) % hObject handle to yuchuli2_radiobutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hint: get(hObject,'Value') returns toggle state of yuchuli2_radiobutton% --- Executes on button press in yuchuli1_radiobutton.function yuchuli1_radiobutton_Callback(hObject, eventdata, handles) % hObject handle to yuchuli1_radiobutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hint: get(hObject,'Value') returns toggle state of yuchuli1_radiobutton% --- Executes on selection change in yuchuli3_popupmenu.function yuchuli3_popupmenu_Callback(hObject, eventdata, handles)% hObject handle to yuchuli3_popupmenu (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)contents = cellstr(get(handles.xuanpin_popupmenu,'String')) ;%获取listbox1中的细胞矩阵item=contents{get(handles.xuanpin_popupmenu,'Value')};%获取listbox中的值if strcmp(item,'低通滤波')prompt={'请输入滤波上限频率:'};title='请输入滤波上限频率:';lines=1;def={'2000'};answer=inputdlg(prompt,title,lines,def);handles.limit=str2num(answer{1});elseprompt={'请输入滤波下限频率:'};title='请输入滤波下限频率:';lines=1;def={'1000'};answer=inputdlg(prompt,title,lines,def);handles.limit=str2num(answer{1});endguidata(hObject,handles);% Hints: contents = cellstr(get(hObject,'String')) returns yuchuli3_popupmenu contents as cell array% contents{get(hObject,'Value')} returns selected item from yuchuli3_popupmenu% --- Executes during object creation, after setting all properties.function yuchuli3_popupmenu_CreateFcn(hObject, eventdata, handles)% hObject handle to yuchuli3_popupmenu (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: popupmenu controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end% --- Executes on button press in chuli_pushbutton.function chuli_pushbutton_Callback(hObject, eventdata, handles)% hObject handle to chuli_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)contents = cellstr(get(handles.xuanpin_popupmenu,'String')) ;%获取listbox1中的细胞矩阵item=contents{get(handles.xuanpin_popupmenu,'Value')};%获取listbox中的值v1=get(handles.yuchuli1_radiobutton,'value');v2=get(handles.yuchuli2_radiobutton,'value');y=handles.y;fs=handles.Fs;if v1==1y=y-mean(y);elseendif v2==1y=detrend(y);elseendif strcmp(item,'低通滤波')fs=handles.Fs;limit=handles.limit-500;wp=pi*limit/fs; %归一化通带数字频率wpws=pi*(limit+200)/fs; %归一化阻带数字截止频率wsRp=0.5; %通带波纹系数RpRs=60;[N,Wn]=buttord(wp,ws,Rp,Rs); %求阶数N和滤波器截止频率Wn[num,den]=butter(N,Wn); %传输分子和分母的系数elsefs=handles.Fs;limit=handles.limit;wp=pi*limit/fs; %归一化通带数字频率wpws=pi*(limit-200)/fs;Rp=0.3; %通带波纹系数RpRs=80;[N,Wn]=buttord(wp,ws,Rp,Rs); %求阶数N和滤波器截止频率Wn[num,den]=butter(N,Wn,'high'); %传输分子和分母的系数endf=filter(num,den,y); %滤波M=max(size(f));s=length(f);zh=fft(f,s); %做FFT变换v=0:fs/s:fs*(s-1)/s; %计算频率plot(handles.axes3,v(1:M/2),zh(1:M/2))set(handles.axes3,'Xgrid','on');set(handles.axes3,'Ygrid','on');xlabel(handles.axes3,'频率');ylabel(handles.axes3,'振幅');title(handles.axes3,'滤波后的频谱图');plot(handles.axes1,v,handles.y);title(handles.axes1,'原始时域图');xlabel(handles.axes1,'时间');ylabel(handles.axes1,'频率');set(handles.axes1,'Xgrid','on');set(handles.axes1,'Ygrid','on');N=length(handles.y);y1=fft(handles.y,N);f1=0:fs/N:fs*(N-1)/N;plot(handles.axes2,f1(1:N/2),y1(1:N/2));set(handles.axes2,'Xgrid','on');set(handles.axes2,'Ygrid','on');title(handles.axes2,'频谱图');xlabel( handles.axes2,'频率');ylabel( handles.axes2,'幅度');handles.y=f;handles.Fs=fs;guidata(hObject,handles);% --- Executes on button press in close_pushbutton.function close_pushbutton_Callback(~, ~, ~)% hObject handle to close_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) close();% --- Executes on button press in fft_pushbutton.function fft_pushbutton_Callback(hObject, eventdata, handles)% hObject handle to fft_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)data=handles.y;Fs=handles.Fs;len=max(size(data));%读出声音数据文件的长度[sel,ok]=listdlg('ListString',{'默认长度','128','256','512','1024','2048','4096','8192','16384','32768','65536'},...'name','选择FFT变换的点数', 'OKstring','确定', ...'Cancelstring','取消', 'SelectionMode','single','ListSize',[300 200]);data_frequency=[len,128,256,512,1024,2048,4096,8192,16384,32768,65536];if ok==1M=data_frequency(sel);y=data(1:M);%取前M个数据做变换N=length(y);zh=fft(y,N); %做FFT变换f=0:Fs/N:Fs*(N-1)/N; %计算频率plot(handles.axes2,f(1:M/2),zh(1:M/2))title(handles.axes2,'傅里叶变换图像');set(handles.axes2,'Xgrid','on');set(handles.axes2,'Ygrid','on');xlabel(handles.axes2,'频率');ylabel(handles.axes2,'振幅');elseendhandles.zh=zh;guidata(hObject,handles);% --- Executes on button press in fan_pushbutton.function fan_pushbutton_Callback(hObject, eventdata, handles)% hObject handle to fan_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)zh=handles.zh;y=ifft(zh);plot(handles.axes3,y);title(handles.axes3,'反傅里叶变换图像')xlabel(handles.axes3,'数据序列');ylabel(handles.axes3,'频率');set(handles.axes3,'Xgrid','on');set(handles.axes3,'Ygrid','on');handles.y=y;guidata(hObject,handles);% --- Executes on button press in b2g_pushbutton.function b2g_pushbutton_Callback(hObject, eventdata, handles)% hObject handle to b2g_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)%读取音频信息(双声道,16位,频率44100Hz)% 定义常数FL = 80; % 帧长WL = 240; % 窗长P = 10; % 预测系数个数data=handles.y;fs=handles.Fs; % 载入语音数据data= data/max(data); %归一化L = length(data); % 读入语音长度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); % 合成滤波器的状态% 变速不变调滤波器(假设速度减慢一倍)hw = hamming(WL); % 汉明窗% 依次处理每帧语音for n = 3:FN% 计算预测系数(不需要掌握)s_w = data(n*FL-WL+1:n*FL).*hw; %汉明窗加权后的语音[A E] = lpc(s_w, P); %用线性预测法计算P个预测系数% A是预测系数,E会被用来计算合成激励的能量s_f = data((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);% (13) 将基音周期减小一半,将共振峰频率增加150Hz,重新合成语音,听听是啥感受~PT1 =floor(PT/2); %减小基音周期poles = roots(A);deltaOMG =150*2*pi/fs;for p=1:10 %增加共振峰频率,实轴上方的极点逆时针转,下方顺时针转if imag(poles(p))>0 poles(p) = poles(p)*exp(j*deltaOMG);elseif imag(poles(p))<0 poles(p) = poles(p)*exp(-j*deltaOMG);endendA1=poly(poles);tempn_syn_t = [1:n*FL-last_syn_t]';exc_syn1_t = zeros(length(tempn_syn_t),1);exc_syn1_t(mod(tempn_syn_t,PT1)==0) = G; %某一段算出的脉冲exc_syn1_t = exc_syn1_t((n-1)*FL-last_syn_t+1:n*FL-last_syn_t);[s_syn1_t,zi_syn_t] = filter(1,A1,exc_syn1_t,zi_syn_t);exc_syn_t((n-1)*FL+1:n*FL) = exc_syn1_t; %计算得到的合成激励s_syn_t((n-1)*FL+1:n*FL) = s_syn1_t; %计算得到的合成语音last_syn_t = last_syn_t+PT1*floor((n*FL-last_syn_t)/PT1);endplot(handles.axes3,s_syn_t),set(handles.axes3,'Xgrid','on');set(handles.axes3,'Ygrid','on');xlabel(handles.axes3,'数据序列');ylabel(handles.axes3,'频率');title(handles.axes3,'变音后的时域图'),XLim([0,length(s_syn_t)]);handles.y=s_syn_t;guidata(hObject,handles);Fs=handles.foriginal;N=length(handles.y);y1=fft(handles.y,N);f1=0:Fs/N:Fs*(N-1)/N;plot(handles.axes1,f1,handles.yoriginal);title(handles.axes1,'原始时域图');xlabel(handles.axes1,'时间');ylabel(handles.axes1,'频率');set(handles.axes1,'Xgrid','on');set(handles.axes1,'Ygrid','on');plot(handles.axes2,f1(1:N/2),y1(1:N/2));set(handles.axes2,'Xgrid','on');set(handles.axes2,'Ygrid','on');title(handles.axes2,'频谱图');xlabel( handles.axes2,'频率');ylabel( handles.axes2,'幅度');pause(3);sound(handles.yoriginal);sound(handles.y);% --- Executes on button press in g2b_pushbutton.function g2b_pushbutton_Callback(hObject, eventdata, handles)% hObject handle to g2b_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) y=handles.y;fs=handles.Fs;%读取音频信息(双声道,16位,频率44100Hz)N=length(y)f=0:fs/N:fs*(N-1)/N;Y=fft(y,N); %进行傅立叶变换plot(handles.axes2,f(1:N/2),Y(1:N/2));title(handles.axes2,'声音信号的频谱');xlabel(handles.axes2,'频率');ylabel(handles.axes2,'振幅');f1=0:(fs*0.7)/N:(fs*0.7)*(N-1)/N;syms t;t=[0,9];R=y*exp(2*pi*300*t);P=fft(R,N);Z=ifft(P);z=real(Z);handles.y=y;plot(handles.axes3,f1(1:N/2),Z(1:N/2));title(handles.axes3,'变声后的时域图');xlabel(handles.axes3,'时间序列');ylabel(handles.axes3,'频率')set(handles.axes3,'Xgrid','on');set(handles.axes3,'Ygrid','on');Fs=handles.foriginal;N=length(handles.y);y1=fft(handles.y,N);f1=0:Fs/N:Fs*(N-1)/N;plot(handles.axes1,f1,handles.yoriginal);title(handles.axes1,'原始时域图');xlabel(handles.axes1,'时间');ylabel(handles.axes1,'频率');set(handles.axes1,'Xgrid','on');set(handles.axes1,'Ygrid','on');plot(handles.axes2,f1(1:N/2),y1(1:N/2));set(handles.axes2,'Xgrid','on');set(handles.axes2,'Ygrid','on');title(handles.axes2,'频谱图');xlabel( handles.axes2,'频率');ylabel( handles.axes2,'幅度');pause(3);guidata(hObject,handles);sound(handles.yoriginal);sound(handles.y,handles.foriginal*0.7);% --- Executes on button press in bijiao_pushbutton.function bijiao_pushbutton_Callback(hObject, eventdata, handles) % hObject handle to bijiao_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) handles.y=handles.yoriginal;handles.Fs=handles.foriginal;guidata(hObject,handles);% --- Executes on button press in save_pushbutton.function save_pushbutton_Callback(hObject, eventdata, handles)% hObject handle to save_pushbutton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) Fs=handles.Fs;data=handles.y;[filename]=uiputfile({'*.wav'},'文件保存');wavwrite(data,Fs,filename);%data表示声音数据% 计算一段语音的基音周期function PT = findpitch(s)[B, A] = butter(5, 700/4000);s = filter(B,A,s);R = zeros(143,1);for k=1:143R(k) = s(144:223)'*s(144-k:223-k);end[R1,T1] = max(R(80:143));T1 = T1 + 79;R1 = R1/(norm(s(144-T1:223-T1))+1); [R2,T2] = max(R(40:79));T2 = T2 + 39;R2 = R2/(norm(s(144-T2:223-T2))+1); [R3,T3] = max(R(20:39));T3 = T3 + 19;R3 = R3/(norm(s(144-T3:223-T3))+1); Top = T1;Rop = R1;if R2 >= 0.85*RopRop = R2;Top = T2;endif R3 > 0.85*RopRop = R3;Top = T3;endPT = Top;return。
%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)。
《数字信号处理B》课程项目实施报告题目:数字音效处理器组号: 91任课教师: 方勇组长: 11123701 马骁成员:11123802 梅烜玮成员: 11120989 毛顺亿成员: 11120991 程佳静成员: 11123627 肖淞联系方式:二零一三年10月19日摘要:本论文介绍了在matlab平台下的数字音效处理的实现。
主要使用了matlab中的GUI、FDAtools、audio函数、fft函数、filter函数等制作了图形用户界面、声音的采集和播放、信号在时域和频率的多种处理、滤波器的制作和应用。
通过对声音的时域和频域分析,利用梳状滤波器、IIR2阶滤波器、信号加权线性叠加算法、频域差值算法等理论工具最后实现出对声音的均衡、变声、回声和混音的音效处理。
关键字:数字音效处理、滤波器、matlab目录项目分工 (2)摘要 (3)目录 (4)一、课程项目实施方案 (5)数字音效处理器概述 (5)1.2 设计平台Matlab简介 (5)设计思想 (5)功能指标 (5)1.5 功能原理概述 (5)回声简介 (5)1.5.2 混音音效简介 (6)1.5.3 男女变声简介 (6)1.5.4 均衡器简介 (7)二、系统设计及可行性分析 (7)2.1 系统综述 (7)音频的采集与播放 (8)去噪数字滤波器的设计 (8)音效算法以及理论分析 (11)2.4.1 回音的实现方法和理论分析 (11)混音实现方法和理论分析 (13)2.4.3 男女变声实现方法和理论分析 (13)均衡器 (20)2.4.5 GUI设计 (21)三、系统性能与结果分析 (22)3.1 算法性能和结果分析 (22)3.1.1 回音音效处理 (22)3.1.2 混音音效处理 (25)3.1.3男女变声 (25)3.1.4均衡器 (27)对项目进行所遇到的问题的分析和解决 (30)问题 (30)3.2.2 理论分析问题 (30)参考文献 (32)附录1 组员心得 (33)附录2源程序 (35)一、课程项目实施方案数字音效处理器概述数字音效处理器,是用数字音频信号处理技术来提升和达到各种声音效果的电子装置或者音频变换系统,包括均衡器(EQ)、数字混响器、立体声、特殊音效器等。
基于M A T L A B算法的数字变声器Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】基于MATLAB算法的数字变声器【摘要】变声器的原理是通过改变输入声音频率,进行改变声音的音色、音调,使输出声音在感官上与原声音不同。
变声器是借助对声音音色和音调的双重复合改变,实现输出声音的改变。
通过自己发声,共振峰频率的改变是基于重采样实现的。
同时用LPC倒谱分析法分析共振峰的范围,通过MATLAB编写程序并构置GUI界面。
实验中通过MATLAB软件对采集来的语言信号进行频谱分析,讨论不同人之间的噪音源参数和共振峰参数,通过对不同人语言信号频率和幅度的改变来实现不同人之间的语音转换。
【关键词】短时自相关法; LPC倒谱;语音信号; matlab GUI;1引言随着生活水平的提高,科技的不断进步,很多人为了娱乐,从而希望改变自己的声音;还有如今的许多的访问节目为了保护被访问者,都对声音进行了相应的处理。
本设计通过编写matlab程序,借助对声音音色和音调的双重复合改变,实现输出声音的改变。
共振峰频率的改变是基于重采样实现的,从重采样原理知道,这也同时印发了基频的变化,为保证基频变化和共振峰频率变化的独立、互不相关,在基频移动时必须考虑抵消重采样带来的偏移,理论上只要基频检测足够精确,确实可以保证基频改变和共振峰频率改变间的互不相关。
保证变声效果的自然度主要是没有采用基因检测将基因移动和共振峰变化彻底隔离的缘故。
本次课程设计就是运用我们所学到的理论知识,用MATLAB软件来实现对语音信号的变声处理,理论联系实际,从而更好地掌握以及运用所学习的知识。
2数字变声器的原理与算法基本原理语音科学家将人类发声过程视作一个由声门源输送的气流经以声道、口、鼻腔组成的滤波器调制而成的。
人类语音可分为有声语音和无声语音,前者是由声带振动激励的脉冲信号经声腔调制变成不同的音,它是人类语言中元音的基础,声带振动的频率称为基频。
语音信号变调处理在数字信号处理领域有着广泛的应用,它可以用于音乐制作、语音合成、变声器等方面。
在本文中,我将介绍如何使用MATLAB来进行语音信号的变调处理,包括信号的采样和重放、信号的频谱分析以及频率域的信号处理等内容。
一、信号的采样和重放在进行语音信号的变调处理之前,我们首先需要对语音信号进行采样和重放。
MATLAB提供了丰富的信号处理工具箱,可以很方便地实现信号的采样和重放操作。
以下是一个简单的MATLAB代码示例:```MATLAB读取语音文件[x, fs] = audioread('input.wav');播放语音信号soundsc(x, fs);```在上面的代码中,我们首先使用audioread函数读取了一个名为input.wav的语音文件,并将其存储在变量x中。
我们使用soundsc函数对语音信号进行了重放操作,其中fs表示了语音信号的采样频率。
二、信号的频谱分析对语音信号进行频谱分析是进行语音信号变调处理的重要步骤之一。
通过频谱分析,我们可以了解语音信号的频率成分,并作出相应的处理。
MATLAB中有许多用于频谱分析的函数和工具,比如fft函数、spectrogram函数等。
以下是一个简单的频谱分析MATLAB代码示例:```MATLAB计算语音信号的FFTX = fft(x);绘制语音信号的频谱图f = (0:length(X)-1)*fs/length(X);plot(f, abs(X));xlabel('频率/Hz');ylabel('幅度');```在上面的代码中,我们使用了fft函数对语音信号进行了傅里叶变换,得到了语音信号的频谱。
我们使用plot函数绘制了语音信号的频谱图,并通过设置坐标轴标签使得图像更加直观和易读。
三、频率域的信号处理频率域的信号处理是进行语音信号变调处理的核心步骤之一。
在MATLAB中,我们可以利用频谱的特性对语音信号进行频率域的处理,比如频率的平移、缩放、滤波等。
MATLAB课程设计语音假装器的设计与实现一、咱们每一个人的声音不同,源于咱们的每一个人的音色和音调不一样,例如所说的男中音、女高音确实是音调的不同。
固然即便是音调一致,咱们依然能够区分两个不同人的声音或不同乐器的声音,这确实是音色的不同。
而咱们要实现的语音变音器正是借助对声音音色和音调的双重复合改变,实现输出声音的改变。
由表 1可知,在进行性别变音时,要紧考虑基频和共振峰频率的变化。
当基频伸展,共振峰频率也同时伸展,可由男声变成女声,女声变成童声;反之基收缩共振峰频率也同时伸展,可由男声变成女童;反之,基频收缩,共振峰频率也同时收缩,那么由童声变女声,女声变男声。
表一男声、女声和童声基频、共振峰频率关系表二、实现步骤1. 利用windows和matlab工具进行语音信号的录制与读入;2. 对读入的语音信号进行频谱分析;3. 设计数字滤波器并画出频响特性;4. 对读入的语音信号进行滤波以滤除噪声;5. 通过搬移、改变基波频率实现变声;6. 语音信号恢复7. 实现慢录快放和快录慢放功能;8. 绘制输出各个部份的波形。
三、语音假装器的MATLAB程序与实现%读取音频信号并分析处置[x1,fs]=wavread('C:\Users\Administrator\Desktop\xq.wav');%读取音频文件,识别的是地址sound(x1,fs);N=length(x1);n=[0:N-1];X=fft(x1);%进行傅里叶变换Fs=1*fs;T=1/Fs;f=n/N*Fs;figure(1);subplot(2,1,1);plot(n,x1);%绘制原音频信号title('原音频信号');subplot(2,1,2);plot(f,abs(X));%绘制频谱图title('音频的幅度谱');%快速播放sound(x,1.5*fs);%以倍速度播放%慢速播放sound(x,0.5*fs);%以倍速度播放%巴特沃斯低通滤波器设计与描述fc=9200; %设定滤波器各参数fst=9600;rp=1; rs=30;wp=fc*2/fs;%将模拟指标转换为数字指标ws=fst*2/fs;[n,wn]=buttord(wp,ws,rp,rs);%滤波器的最小阶数n,wn为系统频带[b,a]=butter(n,wn,'low');figure(2);freqz(b,a);%绘制滤波器特性曲线title('低通滤波器特性曲线');%用低通滤波器对原始信号滤波x2=filter(b,a,x1);%用滤波器对原始信号滤波sound(x2,fs);figure(3);y2=abs(fft(x2,30000));%滤波后的频谱subplot(2,1,1);plot(x2); %绘制滤波后的信号title('滤波后语音信号时域图')subplot(2,1,2);plot(y2); %绘制滤波后的音几回谱title('滤波后语音信号频谱图')%男声变成童声p=fft(x2);%男声变童声信号处置xaa=p;N=500;pa=[0.1*xaa(1:1000),2.5*xaa(1:180000),0.1*xaa(1:1000)]; Y1=1*real(ifft(pa));figure(4);subplot(2,1,1);plot(x1);title('原始音频');%绘制原始音频信号subplot(2,1,2);plot(x2);title('变声后的音频');%绘制变声后的音频figure(5);subplot(2,1,1);plot(abs(X));title('原始音几回响');%绘制原始音几回响曲线xlabel('X');ylabel('Y');sound(Y1,fs);subplot(2,1,2);plot(abs(pa));title('变声后的音几回响');%绘变声后音几回响xlabel('X');ylabel('Y');四、程序仿真结果1、搜集的原始信号的频谱分析由上图可见,搜集到的男生声音信号大多散布在低频段上。
matlab女声变男声程序返回列表发新帖回复查看: 823|回复: 3|关注: 0打印上一主题下一主题 [未答复] MATLAB做女生变男声的程序 [复制链接] hoaei新手5 麦片财富积分0502主题5帖子最佳答案发消息电梯直达跳转到指定楼层 1#2013-10-17 19:32:12 | 只看该作者回帖奖励发表于我在做一个女声变男声的程序想法是将女生的音谱向左压缩7/8,使得基频也随之改变,变成女声基频的7/8,最后是有男声的声音,但是男声似乎被截掉了一些语音信号。
比如女生原话是(“请问你是谁啊”),可男声却是(“请问你是谁”),(“啊”)没有了,同时处理后的男声语音文件播放时,还隐约能听到一些女声的声音。
以下是代码:<blockquote>%变声2复制代码其中qu_wan_ting是原始音频文件,参看附件,pinpuyasuo是一个子函数,可以对一个矩阵进行线性压缩,若a=[1 2 3 4 5 6], 如果压缩比为3:6,压缩后a=[2 4 6]; 压缩比若为4:6,则a=[1.5 3 4.5 6],不过由于这是对经过fft的频谱进行压缩的,所以这个函数还是左右对称压缩的。
以下是压缩函数代码:%频谱压缩function [hw2,num]=pinpuyasuo(hw,kn,km)N=length(hw);hw2=hw;for i=1:N/2n=fix(i*km/kn);xiaoshu=(i*km/kn-n);if(n>N/2)break;endtryhw2(i)=hw(n)*(1-xiaoshu)+hw(n+1)*xiaoshu;catchhw2(i)=hw(n)*(1-xiaoshu); endhw2(N-i+1)=hw(N-n+1)*(1-xiaoshu)+hw(N-n)*xiaoshu; endnum=i;end复制代码qu_wan_ting.mat193.23 KB, 下载次数: 47 原始女声音频文件分享到:女声变男声不知道为什么代码不见了,补发一下 %变声2clear allload qu_wan_ting;[m,n]=size(y1);%y1是音频文件t=1:m;N=2^ceil(log2(m));fs=11025;hw=fft(y1,N);HW=abs(hw);W=(0:N-1)*fs/N;figure(1);subplot(211);plot(W,HW);title('1')axis([0,fs,0,20]);[hw2,num]=pinpuyasuo(hw,17,22);%hw2(num/2:N-num/2+1)=hw2(num/2:N-num/2+1)*0; subplot(212);plot(W,abs(hw2));axis([0,fs,0,20]);y2=ifft(hw2);y2=real(y2);%./abs(real(y2)).*abs(y2);y2=y2(1:max(t)); y2=guiyihua(y2)/2;figure(10);subplot(211); y1=guiyihua(y1)/2; plot(t,y1); subplot(212); plot(t,y2);wavplay(y2,fs); 复制代码回复此楼支持举报探索者~新手6 麦片财富积分0502主题23帖子最佳答案发消息3#发表于 2013-12-9 17:23:51 | 只看该作者你是想问什么,你的变声代码第28行“y2=guiyihua(y2)/2;”,"guiyihua"是什么,回复此楼支持举报 qsj8362234入门141 麦片财富积分5050021主题1004帖子31最佳答案QQ发消息关注者: 14#发表于 2013-12-9 17:47:52 | 只看该作者'阿'是单音信号吧,可以单独看看这个音的频谱。
Matlab技术声音处理方法Matlab技术在声音处理方法中的应用声音是我们日常生活中不可或缺的一部分,而如何对声音进行处理和分析则成为了一个重要的研究领域。
Matlab作为一种功能强大的工具,提供了丰富的声音处理方法和函数,可以帮助我们更好地理解和处理声音。
本文将探讨Matlab技术在声音处理方法中的应用。
1. 音频录制与播放Matlab中的`audiorecorder`和`audioplayer`函数可以轻松实现音频的录制和播放。
我们可以使用这些函数来获取外部声音设备的输入,并且实时监测并录制声音。
在录制完成后,我们可以使用`play`函数对录制的声音进行播放,或者使用`wavwrite`函数将声音保存为WAV格式文件。
这些函数为我们提供了方便的工具,可以进行实时采集和回放。
2. 语音信号分析语音信号分析是声音处理中的一个重要领域,它涉及到音频的频率、能量和语音特征等方面的研究。
Matlab中的`fft`函数和`spectrogram`函数可以帮助我们进行频率分析和谱图生成。
通过对语音信号进行调频谱分析,我们可以了解声音信号的频率成分和强度分布。
同时,利用谱图可以对语音信号进行时频分析,识别声音的特征和共振峰等信息。
3. 降噪和滤波技术在实际的声音处理中,常常伴随着各种噪音的干扰。
Matlab提供了各种降噪和滤波技术,可以有效地去除噪音并提升声音质量。
其中,常用的方法包括均值滤波、中值滤波和高斯滤波等。
这些滤波方法可以通过调整滤波窗口的大小和权重来实现不同程度的降噪效果。
此外,Matlab还提供了自适应滤波和谱减法等高级降噪方法,可以根据不同噪声类型进行自主调整和处理。
4. 语音合成和变声语音合成和变声是声音处理中的两个有趣的方向。
使用Matlab中的`synth`函数和`pitchshift`函数,我们可以对声音进行合成和变调操作。
通过改变声音的频率和音高,可以实现从机器语音到人声和从男声到女声的变换。
利用Matlab进行声音处理的基本原理与实现声音处理是一门利用计算机技术对声音进行采集、分析、处理和合成的领域。
Matlab是一种功能强大、易于使用的科学计算工具,被广泛应用于声音处理领域。
本文将介绍利用Matlab进行声音处理的基本原理和实现方法。
一、声音的采集与表示声音是由空气分子的振动引起的,采集声音需要将振动转换为电信号。
常见的声音采集设备有麦克风和电子麦克风。
麦克风接收到声音后,会将声音转换为模拟电信号,并通过模拟-数字转换器(ADC)转换为数字信号,以便计算机进行处理。
在计算机中,声音一般以波形图的形式进行表示。
波形图描述了声音在不同时间点上的振幅变化。
在Matlab中,可以使用音频文件格式如.WAV、.MP3等加载和保存声音数据。
二、声音数据的读取与播放利用Matlab可以读取和播放声音数据。
读取声音数据可以使用函数`audioread`,该函数可以读取声音文件并将其转换为数字信号。
例如,通过以下代码可以读取名为“sound.wav”的声音文件:```[sound, Fs] = audioread('sound.wav');```其中声音数据将存储在变量`sound`中,采样频率将存储在变量`Fs`中。
要播放声音数据,可以使用Matlab中的`sound`函数。
例如,通过以下代码可以播放声音数据:```sound(sound, Fs);```以上代码中,第一个参数为声音数据,第二个参数为采样频率。
三、基本声音处理功能Matlab提供了丰富的工具和函数来进行声音处理。
以下是一些常用的声音处理功能和对应的实现方法:1. 声音频谱分析声音频谱分析是指将声音信号转换为频域表示,以便分析声音中各个频率成分的能量分布。
在Matlab中,可以使用`fft`函数进行快速傅里叶变换,将声音信号转换为频谱。
转换后的频谱可以通过绘制频率和幅度的图形进行可视化。
2. 声音滤波声音滤波是指通过滤波器改变声音信号的频率特性。
矿产资源开发利用方案编写内容要求及审查大纲
矿产资源开发利用方案编写内容要求及《矿产资源开发利用方案》审查大纲一、概述
㈠矿区位置、隶属关系和企业性质。
如为改扩建矿山, 应说明矿山现状、
特点及存在的主要问题。
㈡编制依据
(1简述项目前期工作进展情况及与有关方面对项目的意向性协议情况。
(2 列出开发利用方案编制所依据的主要基础性资料的名称。
如经储量管理部门认定的矿区地质勘探报告、选矿试验报告、加工利用试验报告、工程地质初评资料、矿区水文资料和供水资料等。
对改、扩建矿山应有生产实际资料, 如矿山总平面现状图、矿床开拓系统图、采场现状图和主要采选设备清单等。
二、矿产品需求现状和预测
㈠该矿产在国内需求情况和市场供应情况
1、矿产品现状及加工利用趋向。
2、国内近、远期的需求量及主要销向预测。
㈡产品价格分析
1、国内矿产品价格现状。
2、矿产品价格稳定性及变化趋势。
三、矿产资源概况
㈠矿区总体概况
1、矿区总体规划情况。
2、矿区矿产资源概况。
3、该设计与矿区总体开发的关系。
㈡该设计项目的资源概况
1、矿床地质及构造特征。
2、矿床开采技术条件及水文地质条件。