基于MATLAB的 回声信号产生器资料.docx
《基于MATLAB的 回声信号产生器资料.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的 回声信号产生器资料.docx(26页珍藏版)》请在冰点文库上搜索。
基于MATLAB的回声信号产生器资料
电子信息工程学院
《DSP技术及应用》课程设计报告
题目:
基于MATLAB的回声信号产生器
专业班级:
通信工程专业
二〇一三年六月十六日
一、设计目的…………………………………………………………1
二、设计要求…………………………………………………………1
三、设计原理及方案…………………………………………………1
四、设计流程…………………………………………………………5
五、调试分析…………………………………………………………5
六、GUI界面…………………………………………………………17
七、设计总结.………………………………………………………..20
一、设计目的
综合运用我们掌握的数字信号处理知识,利用matlab语言编程进行回声信号产生器的设计再对其进行频谱分析,实现回声的产生,消除和隐藏。
1、首先熟练掌握对声音采集、处理、衰减、延时等过程的理论知识。
2、根据设计思路,学习资料的搜集与整理。
3、通过理论与实际的结合,在理论的基础结合实际情况完成课程的设计。
关于MATLAB软件:
MATLAB语言具备高效、可及推理能力强等特点,是目前工程界流行最广泛的科学计算语言。
MATLAB强大的运算和图形显示功能,可使信号与系统上机实验效率大大提高。
特别是它的频谱分析和滤波器分析与设计功能很强,使数字信号处理工作变得十分简单,直观。
关于GUI界面:
图形用户界面GUI(GraphicsUserInterface)是由各种图形对象,如图形窗口、图轴、菜单、按钮、文本框等构建的用户界面,是人机交流信息的工具和方法。
GUI设计即可以基本的MATLAB程序设计为主,也可以鼠标为主利用GUIDE工具进行设计。
二、设计要求
首先,自己录取一个合适的原声信号,并对其进行频谱分析;然后通过数字信号处理对已录制好的原声信号进行延时,衰减,产生出回声信号,通过图形与原声信号进行比较;再把信息转换成二进制信号将其叠加在回声中,通过数字信号处理实现信息的隐藏;最后,通过设计GUI界面将结果展示出来。
1、通过计算机中的y=fft(x)傅里叶变换,对原声信号和回声信号进行频谱分析。
2、通过设计FIR、IIR滤波器对原声信号进行衰减、延时产生一次、三次、六次无限次回声。
3、学习并掌握MATLAB的使用方法,用MATLAB编程和会使用MATLAB中的GUI界面设计。
三、设计原理及方案
1、设计原理
(1)回声的定义:
当声投射到距离声源有一段距离的大面积上时,声能的一部分被吸收,而另一部分声能要反射回来,如果听者听到由声源直接发来的声和由反射回来的声的时间间隔超过十分之一秒,它就能分辨出两个声音这种反射回来的声叫“回声”。
(2)回声信号产生:
根据回声的定义,回声信号可以是原始信号通过延时、衰减来生成。
(3)回声信号消除:
数字滤波器的作用是滤除信号中某一部分频率分量。
可以将回声信号消除。
(4)回声信号隐藏:
回声隐藏利用了人耳的听觉掩蔽效应,是一种有效的音频信息隐藏方法。
(5)处理单元原理:
假设x(n)为原始信号,y(n)为经过延时、衰减迭加后产生的“回声信号”,声音信号和经延迟R个周期,衰减系数α(α<1)的单个回声的差分方程有如下表示:
y(n)=x(n)+α·x(n-R)
上述差分方程可用系统函数表示为:
H(z)=1+α·z-R
此滤波器为FIR滤波器,其结构图如下:
在实际生活中,往往不止存在一重回声,因此,需要实现多重回声的设计,关于均匀间隔的多重回声的实现,是将每一级回声相对于上一级回声依次衰减和延时R个周期,此时不能再用FIR滤波器来实现,应该用IIR滤波器设计。
IIR滤波器设计的系统函数如下:
当回声次数很多时多重回声的系统函数如下:
IIR滤波器结构图:
IIR滤波器结构
隐藏目的是以添加回声的方式在原有音频信息中嵌入新信息,实现信息隐藏。
它的数学模型可以表示为:
典型的回声核脉冲
嵌入回声的声音
可表示为
和
的卷积,
和
,分别为原始声音信号和回声核的单位脉冲响应。
回声信号由
引入到原始声音当中,其中,d为延迟时间,
为衰减系数。
嵌入回声后的声音信号可以表示为
2、设计方案
(1)读取语音信号与回放
录制一段合适的原声信号,用“[x,fs,bits]=wavread('y',[140000])”来读取录制好的语音信号,这是以采样频率fs、采样位数bits从[140000]来读取语音,并将采样值放在x中。
用sound(5*x,fs,bits)对声音信号进行回放,乘以5以加强信号,便于听取。
(2)傅里叶变换FFT
傅里叶变换调用格式:
y=-fft(x)
其中,x是序列,y是序列的FFT,,x可以为一向量或矩阵,若x为一向量,y是x的FFT。
且和x相同长度。
若x为一矩阵,则y是对矩阵的每一列向量进行FFT。
如果x长度是2的幂次方,函数fft执行高速基-2FFT算法;否则fft执行一种混合基离散傅里叶变换算法,计算速度较慢。
(3)函数filter
函数filter的调用格式为:
y=filter(b,a,x)
该格式采用数字滤波器对数据进行滤波,既可以用于IIR滤波器,也可以用于FIR滤波器。
其中向量b和a分别表示系统函数的分子、分母多项式的系数,若a=1,此时表示FIR滤波器,否则就是IIR滤波器。
该函数是利用给出的向量b和a,对x中的数据进行滤波,结果放入向量y。
(4)函数zearos
函数的一种调用格式为:
B = zeros(n)
返回一个n*n的矩阵,其元素都为零,如果参数n不是一个标量就会报错。
函数的另一种调用格式为:
B = zeros(m,n) 或B = zeros([m n])
返回一个m*n的零矩阵。
函数的另一种调用格式为:
B = zeros(m,n,p,…)或B = zeros([m n p …])
返回一个m*n*p*…的零矩阵。
注意:
参数m,n,p都是非负整数,负整数都会看成零。
四、设计流程
五、调试与分析
1、原始信号分析
读取一段语音信号,画出其时域波形,用fft对读取的语音信号进行傅里叶变换,并画出其相位与幅值。
[x,fs,bits]=wavread('y',[140000]);%读取语音信号
n1=0:
2000;
figure
(1)
subplot(2,1,1);plot(x);%原始信号时域波形
title('原始信号时域波形');
X=fft(x);%对原始信号做FFT变换
subplot(2,1,2);plot(n1(1:
1000),X(1:
1000));%原始信号频谱图
title('原始信号频谱图');
figure
(2)
subplot(2,1,1);plot(abs(X));%经傅里叶变换之后的信号的幅值
title('幅值');
subplot(2,1,2);plot(angle(X));%经傅里叶变换之后的信号的相位
title('相位');
sound(5*x,fs,bits);%原始语音信号,乘以5是为了加强信号
2、回声信号的产生
对原始信号取出单声道信号,并用filter函数对其进行衰减和延时,得到回声信号。
(1)FIR滤波器产生一次回声
[x,fs,bits]=wavread('y',[140000]);%读取语音信号
n1=0:
2000;
b=x(:
1);%取单声道信号
yy1=filter([1,zeros(1,12000),0.7],1,[b',zeros(1,30000)]);%FIR滤波器进行滤波
figure
(1)
subplot(2,1,1);plot(yy1);%单回声滤波器时域波形
title('单回声滤波器时域波形');
YY1=fft(yy1);%对单回声信号做2001点的FFT变换
subplot(2,1,2);plot(n1(1:
1000),YY1(1:
1000));%单回声滤波器频谱图
title('单回声滤波器频谱图');
figure
(2)
subplot(2,1,1);plot(abs(YY1));%经傅里叶变换之后的信号的幅值
title('幅值');
subplot(2,1,2);plot(angle(YY1));%经傅里叶变换之后的信号的相位
title('相位');
sound(5*yy1,fs,bits);%经单次回声滤波器后的语音信号,乘以5是为了加强信号
(2)IIR滤波器产生多次回声:
yy2=filter(1,[1,zeros(1,80000/(N+1)),0.7],[b',zeros(1,40000)]);通过改变式中N的数值可设置回声的次数,
三次回声:
[x,fs,bits]=wavread('y',[140000]);%读取语音信号
n1=0:
2000;
b=x(:
1);%产生单声道信号
N=3;
yy2=filter(1,[1,zeros(1,80000/(N+1)),0.7],[b',zeros(1,40000)]);
%IIR滤波器进行滤波
figure(3)
subplot(2,1,1);plot(yy2);%三次回声滤波器时域波形
title('三次回声滤波器时域波形');
YY2=fft(yy2);%对三次回声信号做FFT变换
subplot(2,1,2);plot(n1(1:
1000),YY2(1:
1000));%三次回声滤波器频谱图
title('三次回声滤波器频谱图');
figure(4)
subplot(2,1,1);plot(abs(YY2));%经傅里叶变换之后的信号的幅值
title('幅值');
subplot(2,1,2);plot(angle(YY2));%经傅里叶变换之后的信号的相位
title('相位');
sound(5*yy2,fs,bits);%经三次回声滤波器后的语音信号,乘以5是为了加强信号
使用叠加法产生三次回波:
[x,fs]=wavread(‘ding.wav’);
x1=x(1:
40000);%产生40000行1列矩阵
x2=x(1:
40000);
x3=x(1:
40000);
x4=x(1:
40000);
x1=[x1’,zeros(1,18000)];%x1’为x1的转置,zero是(1,18000)产生1行18000列全零矩阵并加到x1’的后面
x2=[zeros(1,6000),0.7*x2’,zeros(1,12000)];
x3=[zeros(1,12000),0.4*x3’,zeros(1,6000)];
x4=[zeros(1,18000),0.2*x4’];
yy1=x1+x2+x3+x4;
figure(3)
subplot(2,1,1);plot(yy1);%三次回声时域波形
title(‘三次回声滤波器时域波形’);
YY1=fft(yy1);%三次回声信号做FFT变换
subplot(2,1,2);plot(n1(1:
1000),YY1(1:
1000));%三次回声频谱图
title(‘三次回声滤波器频谱图‘);
figure(4)
subplot(2,1,1);plot(abs(YY1));%经傅里叶变换之后的信号的幅值
title(‘幅值’);
subplot(2,1,2);plot(angle(YY1));%经傅里叶变换之后的信号的相位
title(‘相位');
sound(5*yy1,fs);
六次回声:
[x,fs,bits]=wavread('y',[140000]);%读取语音信号
n1=0:
2000;
b=x(:
1);%产生单声道信号
N=6;
yy2=filter(1,[1,zeros(1,70000/(N+1)),0.7],[b',zeros(1,40000)]);
%IIR滤波器进行滤波
figure(3)
subplot(2,1,1);plot(yy2);%六次回声滤波器时域波形
title('六次回声滤波器时域波形');
YY2=fft(yy2);%对六次回声信号做FFT变换
subplot(2,1,2);plot(n1(1:
1000),YY2(1:
1000));%三次回声滤波器频谱图
title('六次回声滤波器频谱图');
figure(4)
subplot(2,1,1);plot(abs(YY2));%经傅里叶变换之后的信号的幅值
title('幅值');
subplot(2,1,2);plot(angle(YY2));%经傅里叶变换之后的信号的相位
title('相位');
sound(5*yy2,fs,bits);%经六次回声滤波器后的语音信号,乘以5是为了加强信号
(3)IIR滤波器产生无限次回声
函数yy1=filter(B,A,x)利用给出的向量b和a,对x中的数据进行滤波,结果放入向量yy1。
[x,fs,bits]=wavread('y',[140000]);%读取语音信号
n1=0:
2000;
a=0.7;%a取小于等于1
B=[1,a];%分子的系数
A=1;%分母的系数
yy1=filter(B,A,x);%IIR滤波器进行滤波
figure(11)
subplot(2,1,1);plot(yy1);%无限回声滤波器时域波形
title('无限个回声滤波器时域波形');
YY1=fft(yy1);%经无限回声滤波器后的信号做FFT变换
subplot(2,1,2);plot(n1(1:
1000),YY1(1:
1000));%无限回声滤波器频谱图
title('无限个回声滤波器频谱图');
figure(12)
subplot(2,1,1);plot(abs(YY1));
title('幅值');
subplot(2,1,2);plot(angle(YY1));
title('相位');
sound(5*yy1,fs,bits);%回放经无限回声滤波器后的语音信号
3、回声信号的滤除
数字信号滤波器的作用是滤除一部分频率分量,利用y=filter(B,A,x)函数,设计出回声信号消除滤波器。
y=x?
(1)单回声消除:
产生回声过程:
yy1=filter([1,zeros(1,12000),0.7],1,[b',zeros(1,30000)]);
回声滤除过程:
z=filter(1,[1,zeros(1,12000),0.7],yy1);
[x,fs,bits]=wavread('y',[140000]);%读取语音信号
n1=0:
2000;
b=x(:
1);%取单声道信号
yy1=filter([1,zeros(1,12000),0.7],1,[b',zeros(1,30000)]);
subplot(3,1,1);plot(yy1);%单回声滤波器时域波形
title('单回声滤波器时域波形');
YY1=fft(yy1);%对单回声信号做2001点的FFT变换
subplot(3,1,2);plot(n1(1:
1000),YY1(1:
1000));%单回声滤波器频谱图
title('单回声滤波器频谱图');
z=filter(1,[1,zeros(1,12000),0.7],yy1);
subplot(3,1,3);
plot(z);
title('滤波后信号波形');
sound(z,fs);
(2)多重回声消除
产生回声:
yy2=filter(1,[1,zeros(1,80000/(N+1)),0.7],[b',zeros(1,40000)]);
回声消除:
z=filter([1,zeros(1,80000/(N+1)),0.7],1,yy2);
通过改变N的数值,实现多次回声的消除。
三次回声消除:
[x,fs,bits]=wavread('y',[140000]);%读取语音信号
n1=0:
2000;
N=3;
b=x(:
1);
yy2=filter(1,[1,zeros(1,80000/(N+1)),0.7],[b',zeros(1,40000)]);
%IIR滤波器进行滤波
subplot(3,1,1);plot(yy2);%三次回声滤波器时域波形
title('三次回声滤波器时域波形');
YY2=fft(yy2);%对三次回声信号做FFT变换
subplot(3,1,2);plot(n1(1:
1000),YY2(1:
1000));%三次回声滤波器频谱图
title('三次回声滤波器频谱图');
z=filter([1,zeros(1,80000/(N+1)),0.7],1,yy2);
subplot(3,1,3);
plot(z);
title('滤波后信号波形');
sound(z,fs);
六次回声消除:
[x,fs,bits]=wavread('y',[140000]);%读取语音信号
n1=0:
2000;
N=6;
b=x(:
1);
yy2=filter(1,[1,zeros(1,70000/(N+1)),0.7],[b',zeros(1,40000)]);
%IIR滤波器进行滤波
subplot(3,1,1);plot(yy2);%六次回声滤波器时域波形
title('六次回声滤波器时域波形');
YY2=fft(yy2);%对六次回声信号做FFT变换
subplot(3,1,2);plot(n1(1:
1000),YY2(1:
1000));%六次回声滤波器频谱图
title('六次回声滤波器频谱图');
z=filter([1,zeros(1,70000/(N+1)),0.7],1,yy2);
subplot(3,1,3);
plot(z);
title('滤波后信号波形');
sound(z,fs);
(3)无限次回声滤波器
函数yy1=filter(B,A,x)利用分子B,分母A的设置对回声信号进行滤除。
产生回声:
yy1=filter(B,A,x);
滤除回声:
z=filter(B,A,yy1);
[x,fs,bits]=wavread('y',[140000]);%读取语音信号
n1=0:
2000;
a=0.7;%a取小于等于1
B=[1,a];%分子的系数
A=1;%分母的系数
yy1=filter(B,A,x);%IIR滤波器进行滤波
subplot(3,1,1);plot(yy1);%无限回声滤波器时域波形
title('无限个回声滤波器时域波形');
YY1=fft(yy1);%经无限回声滤波器后的信号做FFT变换
subplot(3,1,2);plot(n1(1:
1000),YY1(1:
1000));%无限回声滤波器频谱图
title('无限个回声滤波器频谱图');
z=filter(B,A,yy1);
subplot(3,1,3);
plot(z);
title('滤波后信号波形');
sound(z,fs);%回放经无限回声滤波器后的语音信号
4、回声隐藏
[s,fs,bits]=wavread('goinghome3.wav');
[row,col]=size(s);
if(row>col)
s=s';
end;%把矩阵转换
msgfid=fopen('hidden.txt','r');
[msg,count]=fread(msgfid);
msg=str2mat(msg);
msg=uint8(msg)';
len=length(s);
i=0;
fragment=56;
N=floor(len/fragment);
lend=length(msg);
atten=0.9;
d0=100;
d1=200;
s0=atten*[zeros(1,d0),s(1:
len-d0)];%backwardechowithdelay0
s1=atten*[zeros(1,d1),s(1:
len-d1)];%backwardechowithdelay1
o=s0;
fori=0:
N-1
if((i+1)>lend)
bit=0;
else
bit=msg(i+1);
end;
ifbit==1
st=i*fragment+1;
ed=(i+1)*fragment;
o(st:
ed)=s1(st:
ed);
end;
end;
o=s+o;
x=0:
len-1;
figure;
plot(x,o,x,s);
wavwrite(o,fs,'wateramarked.wav');
六、GUI软件界面
主界面:
原声信号产生界面:
回声信号产生界面:
回声滤除界面:
回声隐藏界面:
七、设计总结
本次DSP课程设计,通过编程与GUI界面的实现,完成回声信号产生器的基本功能与两个拓展功能的实现。
1、课程设计的可取之处:
(1)回声信号产生器可自主选择产生多少次的回声,并且可设置回声的延时时长。
(2)回声信号实现拓展功能的可应用的回声滤除。
(3)完成回声隐藏的设计。
2、课程设计的不足:
(1)回声信号采样点增多,执行程序时间过长
(2)GUI界面插入背景图片会影响下几个界面,因而造成不太美观
(3)回声隐藏优化欠缺。
3、在编程中遇到下列几项问题:
(1)分析声音信号时,要注意选择单声道信号进行分析。
由于起初并没有进行选择,数据处理过程连连出错,后经对数字信号处理实验的回忆进行修改从而解决问题。
(2)利用滤波器做回声时,系统函数原理有多种应用。
根据老师建议增加了叠加法设计回声的产生。
(3)利用叠加法做回声信号的时候,出现延时程序出错。
后来发现数组长度没有统一,经修改后,成功实施。
(4)回声滤除过程中,系统函数编写出错。
后经查的文献资料进行修改。
(5)由于回声隐藏是自主思考程序,程序语句出现不少问题。
后经长期修改,最终实现隐藏功能。
八、参考文献
[1]杨榆,回声隐藏的研究与实现,中山大学学报(自然科学版),2004
[2]梁虹等,信号与系统分析及MATLAB实现,电子工业出版社,2002
[3]刘树棠,数字信号处理—使用MATLAB,西安交通大学出版社,2002
[4]程佩青,数字信号处理教程[M],清华大学出版社,2002