matlab课程设计-基于MATLAB的回波信号的产生与消除
- 格式:doc
- 大小:524.00 KB
- 文档页数:12
数字信号处理课程设计
题目:基于MATLAB的回波信号的产生与消除课程:MATLAB课程设计
姓名:
学号:
摘要
在这个课程设计中,利用matlab采集一段语音,在这段语音的基础上,加入一定延时和衰减的回音,最后消去回音并且测出延时时间来计算障碍物距离
正文
①设计目的与要求
采集语音:采集一段语音,绘制其时域波形,对此音频信号用FFT作谱分析。
加入回声:对采集的语音进行处理,加入一段回声,并绘制其时域波形,对其进行FFT频谱分析,绘制频谱图。
从带有回声的声音信号中恢复原信号:设计合适的滤波器,对带有回声的声音信号进行滤波,恢复原信号。绘制所设计滤波器的幅频和相频特性,及滤波后的信号的时域波形和频谱图。
从带有回声的声音信号中估计反射物的距离:采用相关分析法从带有回声的声音信号中估计反射物的距离。
②具体内容及原理
(1)语音采集
利用matlab采集一段语音并保存,代码如下
fs=8000;
x=wavrecord(3*fs,fs,'double');
wavplay(x,fs);
wavwrite(x,'原始信号'); //存储音频:原始信号
(2)原始信号的时域波形,FFT频谱分析
代码如下
subplot(3,1,1);
plot(x);grid on;
xlabel('时间');ylabel('幅值');title('原始信号时域波形');
subplot(3,1,2);
f=(0:3*fs-1)*fs/(3*fs);
plot(f,abs(wx));grid on;
xlabel('频率');ylabel('幅值');title('幅频特性');
subplot(3,1,3);
plot(f,angle(wx));grid on;
xlabel('频率');ylabel('相位') ;title('相频特性');
图如下:
(3)加入回声
在已有声音信号x的基础上产生带回声的声音信号,可以表达为在原信号的基础上叠加其延时衰减的分量。假设只有一个回声的情况下,可简化其模型为:
y(n)=x(n)+ax(n-N)
a为反射系数;N为延迟时间。
在这里,取a=0.5,N=2400(即0.3秒的延时)
下面则加入回声且保存
代码如下:
N=2400;
y=[x;zeros(N,1)]+0.5*[zeros(N,1);x];
wavwrite(y,'加回声后的信号');
加回声后的信号.wav
加回声后信号附件(双击打开):
(4) 加回声后信号的时域波形,FFT频谱分析
代码如下:
subplot(3,1,1);
plot(y);grid on;
xlabel('时间');ylabel('幅值');title('加回声后信号时域波形'); subplot(3,1,2);
wy=fft(y);
f=(0:3*fs+N-1)*fs/(3*fs+N);
plot(f,abs(wy));grid on;
xlabel('频率');ylabel('幅值');title('幅频特性');
subplot(3,1,3);
plot(f,angle(wy));grid on;
xlabel('频率');ylabel('相位') ;title('相频特性');
图如下:
(5) 从带有回声的声音信号中恢复原信号且估计反射物的距离
这里把信号的恢复和反射物距离的估计放到一起是基于这么一种考虑,说明如下:
在回声产生的过程中,用到了:y(n)=x(n)+ax(n-N),用的a=0.5,N=2400。然而现在要从加回声后的信号中恢复原信号,应该是在这么一种前提下,即“只有y(n)已知,其他都是未知的”。就是说,要假设我们并不知道原信号,且a与N都是未知的,这就给信号的恢复带来了困难,如果直接用y(n)=x(n)+0.5*x(n-2400)是不合理的。这个时候就要用到对反射物距离的估计的过程,在这个过程中利用相关分析法可以估算出N的值,利用N来算反射物的距离,求得N,则可以进一步求得a,具体方法和原理如下:
如何求N
利用自相关函数xcorr来估计N,对于信号x(n),其长度为N,其求得的自相关函数为
r(m)=
1()*()
N
n
x n x n m =
+
∑,其中m的范围为-(N-1)到N-1,而且显然是左右对称的。下面是一
个简单例子
运行代码
xcorr([1 2 3])
结果如下
ans =
3.0000 8.0000 1
4.0000 8.0000 3.0000
自相关函数是对函数本身在两个时刻t1,t2的相关程度的一种衡量标准,对于加回声后信号y(n)=x(n)+ax(n-N),y(n)是由x(n)与它的一个衰减延时ax(n-N)叠加而成,因为相关函数是函数本身相关程度的一种衡量,可以看到,y(n)的自相关函数将出现几个极值点,自相关函
数为r(m)=
1()*()
N
n
x n x n m =
+
∑,对于y(n)极值点应该出现在m=0,m=+-N,这时候相关程度相对较大。所以只要求出两个极值点之间的距离就能得到N
如何求a
知道N后该怎么求得a值,下面是一种想法:
y(n)是x(n)前补零与后补零的叠加,于是有
y(1)=x(1)
y(1+N)=x(1+N)+ax(1)
y(1+2N)=x(1+2N)+ax(1+N)
...
y(1+(k-1)N)=x(1+(k-1)N)+ax(1+(k-2)N)
y(1+kN)=ax(1+(k-1)N)
设y(n)的长度为L,对于k,则满足1+kN