数字信号处理报告.docx
- 文档编号:9339958
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:31
- 大小:856.46KB
数字信号处理报告.docx
《数字信号处理报告.docx》由会员分享,可在线阅读,更多相关《数字信号处理报告.docx(31页珍藏版)》请在冰点文库上搜索。
数字信号处理报告
《数字信号处理B》课程项目
实施报告
题目:
数字音效处理器
组号:
40
任课教师:
2013年10月18日
报告提纲
一.课程项目要求
设计要求:
设计一个数字音效处理器,能够实现语音信号的各种音效处理。
要求:
(1)输入语音信号源为实际环境采集语音;
(2)至少实现3种音效处理功能;
(3)用人机交互界面操控、扬声器/耳机输出音效。
语音处理
后播放
保存音
频文件
采集
一段信号
不同音效
处理
二.设计思路
3.实现音效处理的成果
1.回音增强2.娃娃音3.老人音4.男变女5.高频去噪6.音频加密解密7.音量调节8.节奏变化.9.播放暂停功能。
4.具体处理过程及代码实现
1、信号采集
通过matlab编程使用wavrecord函数驱动电脑自带的声卡设备采集一段语音信号,其调用格式为mysound=wavrecord(n,fs,channel,dataType);其中n为采样点数,fs为采样频率,channel(通常取1或者2)为录音通道数,dataType(例如double,single,int16,uint8)是采样点的数据类型。
然后通过wavwrite函数保存在当前matlab指定的工作路径下,以此信号作为信号处理的信号源。
为了将其控制方便,我们将其使用global函数定义为全局变量。
在后面的处理就可以对这个信号进行不同的效果处理了。
具体在gui里面这样设计再点击新建按钮后会弹出一对话框,如图1所示:
图1
输入好录制时间长度(例如20s)和要保存音频的文件名(sound),点击OK按钮后就开始录音,直到窗口消失,就表示录音结束,生成的***.wav(sound.wav)文件就被保存在matlab当前的工作路径下。
实现这个窗口的函数是inputdlg
具体代码是:
prompt={'?
?
?
?
?
?
?
?
?
?
?
','?
?
?
?
?
?
?
?
(?
?
?
?
?
?
?
?
?
?
)'};
name='?
?
OK?
?
?
?
?
?
?
';表示窗口的显示名称
numlines=1;
options.Resize='on';
defaultanswer={'20','sound'};默认值为20和sound
options.WindowStyle='normal';
options.Interpreter='tex';
answer=inputdlg(prompt,name,numlines,defaultanswer,options);
从输入到对话框中的字符串读取录音时间长短和保存的文件名。
代码为:
s=str2double(answer{1});%anwer{1}为要录音的时间长短
tex=answer{2};%answer{2}为要保存的文件名称
mysound=wavrecord(s*8000,9000,1);
wavwrite(mysound,4000,tex);%保存文件名称为输入的字符串
globalFileName;%将文件名定义成全局变量,供后边处理
FileName=tex;
至此就可以实现语音信号的采集。
为了处理已经存在我们电脑里的信号,我们还设置了打开电脑里的wav文件。
通过点击打开按钮,调用其callback里面的程序代码:
clearall;
clc;
[b,PathName]=uigetfile('*.wav','SelecttheWav-file');
[a,fs,nbits]=wavread(b);将声音文件读取到a序列中
sound(a,8000,nbits);
globalFileName;
FileName=b;%将打开的文件定义成全局变量和新建的文件一样执行处理过程。
从而可以打开电脑里已经录制好的音频文件。
其中打开文件界面如图2
图2
2、音效处理过程
1)音量调节过程
通过计算机录取的语音是一段向量,给其乘以一个系数就可以改变其幅值,通过改变系数的大小就可以实现音量的增大或衰减。
为了实现更利与控制这个系数,我们使用了sider滑动条来控制这个系数的大小。
同样定义成全局变量,使得后边的处理效果都能实现音量的控制。
使用slider时要先配置slider的属性,在属性窗口中改变其value的最大值和最小值,然后保存。
通过拖动滑动条使其处于不同的位置,就会返回一个数值,我们使用这个变量就能实现实时控制。
其中slider的callback代码为:
value=get(handles.slider3,'value');globalcd;%读取value值赋值给value
c=round(value);cd=c/20;
set(handles.edit1,'string',num2str(c));%将其实时显示到edittext中
通过sound函数可以控制音频的输出的幅度的大小。
通过变sound函数里的第一个变量的值可以实现音量的加强与衰减。
2)播放速度的调节过程
播放速度我们是通过改变sound函数里的Fs参数实现的,sound函数会将信号y以频率Fs发送至speaker(扬声器)。
如果不对频率定义的话,默认的频率就是8192HZ.对于单声道来说,y值是一个m行-1列的向量,其中m表示的是采样点数。
当频率fs增大时,采样点数增多,对同一段相同长度的时间抽取的点数增多,相邻两点之间的时间间隔变小,从而使播放的速度增大,反之当fs减小时,播放速度减缓。
具体的fs减小的值为了便于控制,我们同样是使用slider来改变。
在slider的callback函数下添加以下代码:
globalv;
v=get(handles.slider4,'value');
set(handles.edit3,'string',num2str(v));
然后在“播放”按钮下添加以下代码:
globalFileName;globalcd;globalv;
[a,fs,nbits]=wavread(FileName);a=a*cd
%sound(a*cd,8000,nbits);
globalp;
p=audioplayer(a,8000*v);
play(p);
axes(handles.axes1);plot(a,'b');title('?
?
?
?
?
?
');holdon;
axes(handles.axes3);
z=fft(a);
plot(abs(z),'m');title('?
?
?
?
?
?
?
?
');holdon;
通过这代码就可以通过拖动滑动条的位置,改变播放的音量和播放速度。
并实时的在edittext显示当前的播放速度和声音放大或衰减的倍数。
其中实现实时显示的代码是放在edittext下的代码:
globalv;
v=get(handles.slider4,'value');从slider获取中获取当前value值
set(handles.edit3,'string',num2str(v));将这个值以字符形式显示在text中
其效果图:
3)娃娃音实现
通过不断的尝试改变fs的值,我们发现,将fs设置成15000hz就可以实现此功能,但是发现一缺点就是在改变了fs的值后,不仅变调还变速,当将其设置成15000是正好实现这个功能。
其原理就是,对于一段给定的序列,对其播放的时候是以fs发送给speaker的,改变此时的fs值,若是其增大,即就是采样频率加快,采样点数增多,相邻节点之间的时间间隔变小,播放速度就加快,但是同时使得播放的频率加快,所以出现既变调又变速。
具体代码为:
clearreset;
globalFileName
[x,fs,nbits]=wavread(FileName);globalcd;
sound(x*cd,15000);clearreset;
axes(handles.axes4);plot(10*x,'g');title('?
?
?
?
?
?
?
');
axes(handles.axes5);y=fft(10*x);plot(abs(y));title('?
?
?
?
?
?
?
');
4)老人音实现
老人音的实现和娃娃音的原理一样,改变降低采样频率,使采样间隔增大,播放速度就减慢,就可以实现节奏变慢,我们通过实验,将其fs确定为6000Hz,就能实现这个功能,具体代码:
globalFileName
[x,fs,nbits]=wavread(FileName);globalcd;
sound(x*cd,6000,nbits);clearreset;
axes(handles.axes4);plot(0.6*x,'g');title('?
?
?
?
?
?
?
');
axes(handles.axes5);y=fft(0.6*x);plot(abs(y));title('?
?
?
?
?
?
?
');
5)回音实现
回音效果:
通过对全局变量添加几段段等长度的零序列zeros()函数,并将原始信号与倒序后的信号相加实现其混叠,表现出回音的效果.,主要具体代码见下:
globalFileName;
a=FileName;
[x,fs,nbits]=wavread(a);
m=size(x);a=m(1,1);b=m(1,2);
z=[zeros(2000,b);x];%?
?
?
?
x1=[x;zeros(2000,b)];%?
?
?
?
?
?
?
?
?
?
?
?
y1=x1+z;clearreset;
sound(cd*y1,8000,nbits);
实现后的时域波形和频域的波形为:
6)男声变女声实现
一般来说,由声门振动决定的基频跟说话人的性别特征有关,而且还跟另外一个声学参数——共振峰频率的分布有关,关系入下表,说话人的个性化音色和语音的。
儿童由于声道短,其共振峰频率高于成年人,成年女性的声道一般短于成年男性,所以女性的共振峰频率一般高于男性。
在进行性别变声时,主要考虑基频和共振峰频率的变化。
当基频伸展,共振峰频率也同时伸展时,可由男声变成女声,女声变成童声;
表男声、女声和童声基频、共振峰频率关系表
人群
基频分布
共振峰频率
男声
[150,180]Hz
偏低
女声
[160,380]Hz
中
童声
[400, 1000]Hz
高
共振峰是指在声音的频谱中能量相对集中的一些区域,共振峰频率的改变是基于重采样实现的,从重采样原理知道,这也同时引发了基频的变化,为保证基频变化和共振峰频率变化的独立、互不相关,在基频移动时必须考虑抵消重采样带来的偏移,理论上只要基频检测足够精确,确实可以保证基频改变和共振峰频率改变间的互不相关。
通过改变声音的基频和播放的速度就可以使其功能实现。
男生的基频比女生的基频底,所以将通过抬高基频实现。
具体代码实现如下:
globalFileName;
[s,fs,nbits]=wavread(FileName);%?
?
?
?
s
s=s/max(s);%?
?
?
L=length(s);%?
?
?
?
?
?
S=fft(s,L);
FL=80;%?
?
WL=240;%?
?
P=10;%?
?
?
?
?
?
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_t=zeros(L,1);%?
?
?
?
?
?
?
s_syn_t=zeros(L,1);%?
?
?
?
last_syn_t=0;%?
?
?
?
?
(?
?
?
)?
?
?
?
?
?
?
?
?
?
?
zi_syn_t=zeros(P,1);%?
?
?
?
?
?
?
?
hw=hamming(WL);%?
?
?
%?
?
?
?
?
?
?
?
forn=3:
FN%?
?
?
?
?
?
s_w=s(n*FL-WL+1:
n*FL).*hw;%?
?
?
?
?
?
?
?
?
[AE]=lpc(s_w,P);%?
?
?
?
?
?
?
?
P?
?
?
?
?
%A?
?
?
?
?
E?
?
?
?
?
?
?
?
?
?
?
?
?
ifn==27
end
s_f=s((n-1)*FL+1:
n*FL);%?
?
?
?
?
?
?
?
?
?
?
?
?
[exc1,zi_pre]=filter(A,1,s_f,zi_pre);
exc((n-1)*FL+1:
n*FL)=exc1;%?
?
?
?
?
?
?
[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);%?
?
?
?
?
?
PT
G=sqrt(E*PT);%?
?
?
?
?
?
?
?
?
G
PT1=floor(PT/2);%?
?
?
?
?
?
poles=roots(A);
deltaOMG=700*2*pi/8000;
forp=1:
10%?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
ifimag(poles(p))>0poles(p)=poles(p)*exp(j*deltaOMG);
elseifimag(poles(p))<0poles(p)=poles(p)*exp(-j*deltaOMG);
end
end
A1=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
S=(s_syn_t)%?
?
?
?
?
clearreset;
axes(handles.axes4);plot(exc_syn_t,'g');title('?
?
?
?
?
?
?
');
axes(handles.axes5);plot(abs(s));title('?
?
?
?
?
?
?
')
sound(s_syn_t);
处理后的时域波形和频域波形为:
7)音频加密
完成对于录音的加密,使得声音信号改变,变成一种类似“密码”的信号,人无法识别,但通过后面的音频解密,能恢复出原声音信号。
便于保密传输。
其加密原理很简单,就是将其的采样后的序列倒序排列保存成新序列。
实现过程为:
globalFileName
[x,fs,nbits]=wavread(FileName);
y=x(end:
-1:
1);globalcd;
sound(cd*y,8000,nbits);
prompt={'?
?
?
?
?
?
?
:
'};
name='?
?
save';
numlines=1;
defaultanswer={'important'};
options.Resize='on';
options.WindowStyle='normal';
options.Interpreter='tex';
answer=inputdlg(prompt,name,numlines,defaultanswer,options);
Q=answer{1};
wavwrite(y,8000,Q);
clearreset;
axes(handles.axes4);plot(y,'g');title('?
?
?
?
?
?
?
');axistight;
axes(handles.axes5);z=fft(y);plot(abs(z));title('?
?
?
?
?
?
?
');axistight;
经过加密后的音频文件还可以保存在不同的路径下成不同名称的文件。
实现保密传输。
文件保存的时候会弹窗提示输入要保存的文件名,用户可以通过自己设置。
文件加密前后的波形比较:
通过比较可以发现倒放后的时域波形发生了明显的变化,序列发生倒转,而且频域波形没有变化,主要是期间没有涉及到频率给变,所以在频域频谱分布是不会发生变化的。
8)音频解密
globalFileName
[x,fs,nbits]=wavread(FileName);
n=length(x);
t=(0:
n-1)/8000;
d=[0.05*cos(2*pi*3800*t)]';x=x+d;e=fft(x);
sound(x);axes(handles.axes4);plot(x,'g');title('?
?
?
?
?
?
?
');
axes(handles.axes5);plot(abs(e));title('?
?
?
?
?
?
?
')
9)加进噪声
相对上述的音频加密,还原上述的音频声音信号。
只要将其再通过一次倒放,既序列的逆序排列就好。
代码为:
globalFileName;
[x,fs,nbits]=wavread(FileName);
y=x(end:
-1:
1);globalcd;
sound(y*cd,8000,nbits);
clearreset;
处理后波形:
10)去除噪音
通过设计一个低通的滤波器,将包含在信号源里的高频成分滤除,从而使音效更加接近原声。
人一般的声音的最高频率不超过2khz,我们设计的滤波器的截止频率是2100hz.通带增益为100,阻带衰减为0。
所以一般的声音通过这个低通滤波器就可以滤掉录音时的高频成分,使得声音纯正!
实现代码是:
globalFileName
[x,fs,nbits]=wavread(FileName);
x2=x
fs=20000;
fedge=[20002400];%?
?
?
?
?
?
?
?
?
?
?
?
?
?
mval=[1000];%?
?
?
?
?
1?
?
?
?
?
0?
dev=[0.05990.00316];%?
?
?
?
0.5dB,?
?
?
?
?
?
?
?
50dB?
[N,fpts,mag,wt]=remezord(fedge,mval,dev,fs);%?
?
?
?
?
?
?
?
?
?
?
?
?
?
b=remez(N,fpts,mag,wt);
[h,w]=freqz(b,1,512);
clearreset;
figure
(1);%plot(w,abs(h));gridon;axistight;
plot(w/pi,20*log10(abs(h)));axistight;title('?
?
?
?
?
?
?
?
?
');
xlabel('?
?
/Hz');ylabel('?
?
/db');
lb=filter(b,1,x2);%?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
c=fft(lb);
sound(lb);axes(handles.axes4);plot(lb,'g');title('?
?
?
?
?
?
?
');axistight
axes(handles.axes5);plot(abs(c));title('?
?
?
?
?
?
?
');axistight
其中滤波器的幅频幅性为:
滤波前后语音信号的波形变化为:
3.人机交互界面
使用matlab里面的gui编写程序,实现人机交互的设计。
在matlab命令窗口中键入guide指令,打开gui设计界面,设置好所需要的控件后,在matlab里面便自动生成一个fig文件和一个m文件。
通过访问fig文件便可打开人机交互界面。
通过组员的设计和最终的努力,我们的界面有以下三个:
(1)登陆界面:
通过输入随机的验证码可以进入到我们组的音效处理程序。
调高安全性。
具体代码为:
globala;
a=randi([10009999]);获得随机的四位的验证码
R=get(handles.edit1,'string');globalb;从edit1中获取一个字符串赋值给R。
并定义成全局变量
b=str2double(R);转换成字符串
ifb==a;条件判断如果输入的字符串和验证码一样,则执行下面的代码
h=gcf;
Yuyin;运行yuyin.m文件
clearb;
close(h);退出欢迎界面
end
(2)音效处理界面:
(3)【关于我们】界面
以上这些界面背景都是组员通过photoshop自己做出来的效果,以上这些就是团队合作的成果,也是我们组员奋战七周的结果。
4.小结:
总体上来说,做完这次课外实验,感觉收获了好多,从一开始学习MATLAB软件,再进行程序的编写,直到MATLAB的调试与测试,都是我们小组成员独立完成,虽然一开始有些不懂,但是经过问老师,请教学霸,上网XX。
到后来我们都一一解决掉了,问题摆在那儿,如果不去解决掉的话,问题始终存在,有问题就要及时解决问题,这是我们最大的收获。
还有就是我们小组的团结与分工明确,这是确保我们小组顺利完成这次课程实验的最根本的条件,很个人去查一种或多种音效处理的matlab实现方法和原理,最后进行整合。
最终我们每个人都做到了,当然,最后要实现的功能都实现了,在设计音效处理和人机交互界面的时候,也被各种小问题绊倒,其中一些小问题差点成为我们的致命伤,通过完成本次项目后,使大家都记得,细节决定成败。
比如说我们的在设计slider的时候碰到的问题,不管我们怎么处理在gui界面里面都智能只能显示一个slider,第二个slider怎么都显示不出来,后来才发现按照matlab的使用习惯,必须将slider的属性值中的min值赋值为0,否则就不能使用第二个滑动条。
我们具体实现的音效处理功能有,回音增强,娃娃音,老人音,男变女,高频去噪,音频加密解密,音量调节,节奏变化,播放暂停功能。
从最初的音量改变,最后我们想到了设计密码对语音信号进行加密的设计方案。
虽说加密和解密不难,但也是我们组员的智慧。
加密即是利用倒放的方法使得我们所听到的语音不能为我们理解,达到加密的手段。
解密就是对语音信号再次倒放。
数字信号处理的设计项目与之前所做的其他课程的项目也有一定差异,不仅其内容是我们以前很少接触过的对于多媒体信号的处理,而且实验给出的要求非常简单基本。
却要实现比较智能的功能,着实对我们是一种挑战。
具体的设计方案、布局操作和结果调试都必须由我们亲自拟定并实施。
一开始拿到题目时完全没有头绪,无从下手,但通过在网上耐心地查找资料,细心研究MATLAB软件,以及与小组成员的讨论,逐步理清思路,有了初步的方案,之后经由向老师请教,才有了比较成熟完善的设计方案。
做实验就像完成一件艺术品,只要有所投
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字信号 处理 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)