w = linspace(-Ft/2,Ft/2,length(y2)); subplot(2,1,2)
plot(w,abs(F0)); %画出滤波后的频谱图 title('IIR带通滤波器滤波后的频谱') xlabel('频率/Hz'); ylabel('幅值');
7. 设计系统界面
为了使编制的程序操作方便,设计处理系统的用户界面,在所设计的系统界面上可以选择滤波器的类型,输入滤波器的参数、显示滤波器的频率响应,选择信号等。
题目六:语音信号变声系统处理
电视台经常针对某些事件的知情者进行采访,为了保护知情者,
经常改变说话人的声音,请利用所学的知识,将其实现。
要求处理后的语音信号基本不受影响正常收听与理解; 对处理参数能够通过matlab界面进行调节,以对比不同处理结果;
语音信号变声系统程序:
[y,fs,nbits]=wavread('D:\\yuyin\\hc'); %读取声音文件 x=y(:,1); %读入的y矩阵有两列,取第1列
sound(voice(x,1.4),fs,nbits); %调整voice()第2个参数转换音调,>1降调,<1升调
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
心得体会:
通过这次MATLAB的学习,我对MATLAB有了一个基础的认识,matlab
是一个可以完成各种精确计算和数据处理的、可视化的、强大的计算工具。它集图示和精确计算于一身,在应用数学、物理、化工、机电工程、医药、金融和其他需要进行复杂数值计算的领域得到了广泛应用。MATLAB是一个高级的矩阵/阵列语言,它包含控制语句、函数、数据结构、输入和输出和面向对象编程的特点。用户可以在命令窗口中将输入语句与执行命令同步,也可以先编写好一个较大的复杂程序(M文件)后再一起运行。 在这短短的一周内从开始的一头雾水,到自己看书学习,到同学讨论,再进行整个题目的理论分析和计算,参考课程上的代码,写出自己的代码。
我们也明白了学无止尽的道理,在我们所查的很多参考书中,很多知识是我们从没有接触过的,我们对它的了解还仅限于皮毛,对它的很多功能以及函数还不是很了解,所以在这个学习的过程中我们穿越在知识的海洋中,一点一点吸取着它的知识。在MATLAB编程中需要很多的参考书,要尽量多的熟悉matlab自带的函数及其作用,因为matlab的自带函数特别多,基本上能够满足一般的数据和矩阵的计算,所以基本上不用你自己编函数。这一点对程序非常有帮助,可以使程序简单,运行效率高,可以节省很多时间。本次课设中用了很多MATLAB自带的函数,使程序变得很简单。 把基本的知识看过之后,就需要找一个实际的程序来动手编一下,不要等所有的知识都学好之后再去编程,你要在编程的过程中学习,程序需要什么知识再去补充,编程是一点一点积累的,所以你要需做一些随手笔记什么的。 在编写程序代码时,需要什么函数,需要什么模块就应该去着重看那个知
识点,不要一步登天,一步一步学,如果太急于把所有东西都学到,也是不好的,更是实现不了的。所以那时一天一天积累的,慢慢地学通这个软件。 总之,通过这次学习,我了解了一下这个软件总体的功能,以及通过自己编写一些代码也学到了一些用法和知识。更了解到了,我们还有好多东西去学,学无止尽。