matlab 产生回声,回声信号的产生与消除

第十组讨论报告 回声信号

设计人员【张峻凯、董晓民、严子轩@电子科技大学自动化工程学院】

问题描述:

语音信号频率分量分离的设计与仿真

回声信号可建模为 y[n]=x[n]+αx[n-N],其中 x[n]是未被污损的语音信号, N为回声延迟值, α<1为回声衰减系数。

(1)采用matlab中的audiorecorder命令录制一段3秒的语音信号,并将录制的语音信号转换为音频数据,显示其时域和频域特征;

(2)根据回声的模型,选择合适的延迟值和衰减系数,合成回声信号,显示其时域和频域特征,并进行播放

(3)利用相关性,判断回声的参数值

designed by Liu Ke @school of automation of UESTC

解决方案:

(1)

首先使用 matlab中的audiorecorder命令录制3秒的语音信号,

ysound = audiorecorder;

%recorder = audiorecorder 创建 8000 Hz、8 位、1 通道的 audiorecorder 对象。

disp('开始录制');

recordblocking(ysound,3); %录音3秒钟

disp('结束录制');

将录制的语音信号转化为音频数据,并显示频域时域特征

ysound_1 = getaudiodata(ysound); %获取录音数据

plot(ysound_1); %做录音数据的时域图形

title('原始语音信号时域');

xlabel('采样点 n');

ylabel('幅度 n');

y1 = fft(ysound_1); %做ysound_1的FFT

%y1 = fftshift(y1); 频率分量将会移到坐标中心

subplot(2,2,2);

plot(abs(y1)); %使用abs函数画出原始语音信号的频谱图

title('原始语音信号的频谱幅度');

xlabel('采样点 n');

ylabel('幅度 n');

subplot(2,2,3);

plot(angle(y1)); %使用angle函数画出原始语音信号的频谱相位

title('原始语音信号的频谱相位');

xlabel('采样点 n');

ylabel('幅度 n');

grid on;

输入信号的时频图像

(2)

由题意可知回声模型如下所示

y[n]=x[n]+αx[n-N]

因为后面会用到噪声信号,因此我们首先将源信号增益并时移得到噪声hsound之后将两个函数叠加得到y[n]。

选取α为0.5,N为2000,由于采样率为8000Hz,2000对应着延迟0.25s

噪声信号可以通过filter函数取得,filter函数使用z变换的有理相关函数,

对y[n]=αx[n-N] 两侧进行z变换之后可以将其有利传递函数得出,使用zeros函数生成全为零的空矩阵,并且由于filter函数的特性,

a = 1;

b = [zeros(1,1999),0.5]; %定义两个频率响应的有理传递函数系数向量

hsound = filter(b,a,ysound_1); %得到回声信号

流程图如下:

大概的流程

回声信号的时频特性如下:

回声信号时频特性

代码如下:

%第二部分开始,增益设置为0.5,时移变为0.25s,由于音频信号是默认的8000Hz的,所以时移0.125s即是2000

a = 1;

b = [zeros(1,1999),0.5]; %定义两个频率响应的有理传递函数系数向量

hsound = filter(b,a,ysound_1); %得到回声信号

zsound = hsound + ysound_1;

figure('name','2','color','r');

subplot(2,2,1);

plot(zsound); %做回声的时域图形

title('回声信号时域');

xlabel('采样点 n');

ylabel('幅度 n');

y2 = fft(zsound); %做ysound_1的FFT

%y1 = fftshift(y1); 频率分量将会移到坐标中心

subplot(2,2,2);

plot(abs(y2)); %画出原始语音信号的频谱图

title('回声语音信号的频谱幅度');

xlabel('采样点 n');

ylabel('幅度 n');

subplot(2,2,3);

plot(angle(y2)); %画出原始语音信号的频谱相位

title('回声语音信号的频谱相位');

xlabel('采样点 n');

ylabel('幅度 n');

grid on;

(3) 利用相关性,判断回声的参数值

(注:本小组对于这道题求解分两个部分)

第一部分,求其延迟值:

利用函数的自相关特性,做出回声信号的自相关函数

回声信号的自相关函数

从自相关函数图像可以看到,在采样点的中心有一最大的赋值,其含义就是当延时量为0时,信号相关程度最高;而在这一峰值的两侧有两个次大的赋值,其含义就是在该信号的相关程度次高;而在别的点处其相关程度相对于两个峰值都可以忽略,因此算出这两个峰值所对应的采样点之差,就是回声信号中,原始信号与回声信号对应的采样点之差。

通过matlab实现:

%回声自相关:

y=zsound;

Cy=xcorr(y);

figure(11);

plot(cy);

title('回声信号的自相关');

xlabel('采样点');

ylabel('相关程度');%**对回声信号进行自相关**

%计算延时

[h1_y,h1]=max(cy);%把最大值极其位置取出

cy2=cy;

cy2(h1-1500:h1+1500,1)=0; %令最大值的邻域为0

[h2_y,h2]=max(cy2);%取出次大值

N_delay=abs(h1-h2);%算出差距

disp(sprintf('延时等于= %8.5f',N_delay/8000));%显示延时

第二部分 计算衰减值:

通过自相关函数的性质知:函数的自相关在自变量等于0的时候其相关程度最大,且其值为函数的能量,所以我们组用自相关函数计算能量的方法分别求出原声音和回声信号的能量,再将其做比,得到衰减值的平方。

原信号的自相关函数:

yx=xcorr(ysound_1,'biased');

yx=yx(length(ysound_1):1:end);

figure('name','4');

subplot(111);

plot(0:1:60, yx(1:61));

xlabel('n');

ylabel('y_x(n)');

title('y_x(n)');%将原信号自相关函数进行表示

原信号的自相关函数

回声信号的自相关函数:

qx=xcorr(zsound,'biased');

qx=qx(length(zsound):1:end);

figure('name','4');

subplot(111);

plot(0:1:60, qx(1:61));

xlabel('n');

ylabel('q_x(n)');

title('q_x(n)');%将回声噪声自相关函数进行表示

回声噪声信号的自相关函数

将其在0时刻的值做比,得到衰减系数的平方:

e = yx(1,1);

f = rx(1,1);

c = e/f;

disp(sprintf('阿尔法平方等于= %8.5f',c));

最后的输出

附代码:

ysound = audiorecorder;

%recorder = audiorecorder 创建 8000 Hz、8 位、1 通道的 audiorecorder 对象。

disp('开始录制');

recordblocking(ysound,3); %录音3秒钟

disp('结束录制');

%play(ysound); %播放录音

figure('name','1','color','c'); %创建一个新的视图1选个够骚的配色

subplot(2,2,1);

ysound_1 = getaudiodata(ysound); %获取录音数据

plot(ysound_1); %做录音数据的时域图形

title('原始语音信号时域');

xlabel('采样点 n');

ylabel('幅度 n');

y1 = fft(ysound_1); %做ysound_1的FFT

%y1 = fftshift(y1); 频率分量将会移到坐标中心

subplot(2,2,2);

plot(abs(y1)); %画出原始语音信号的频谱图

title('原始语音信号的频谱幅度');

xlabel('采样点 n');

ylabel('幅度 n');

subplot(2,2,3);

plot(angle(y1)); %画出原始语音信号的频谱相位

title('原始语音信号的频谱相位');

xlabel('采样点 n');

ylabel('幅度 n');

grid on;

% %第二部分开始,增益设置为0.5,时移变为0.25s,由于音频信号是默认的8000Hz的,所以时移0.25s即是2000

a = 1;

b = [zeros(1,1999),0.5]; %定义两个频率响应的有理传递函数系数向量

hsound = filter(b,a,ysound_1); %得到回声信号

zsound = hsound + ysound_1;

figure('name','2','color','r');

subplot(2,2,1);

plot(zsound); %做回声的时域图形

title('回声信号时域');

xlabel('采样点 n');

ylabel('幅度 n');

y2 = fft(zsound); %做zsound的FFT

%y1 = fftshift(y1); 频率分量将会移到坐标中心

subplot(2,2,2);

plot(abs(y2)); %画出回声语音信号的频谱图

title('回声语音信号的频谱幅度');

xlabel('采样点 n');

ylabel('幅度 n');

subplot(2,2,3);

plot(angle(y2)); %画出回声语音信号的频谱相位

title('回声语音信号的频谱相位');

xlabel('采样点 n');

ylabel('幅度 n');

grid on;

rx=xcorr(hsound,'biased');

rx=rx(length(hsound):1:end);

figure('name','3');

subplot(111);

plot(0:1:60, rx(1:61));

xlabel('n');

ylabel('r_x(n)');

title('r_x(n)');

yx=xcorr(ysound_1,'biased');

yx=yx(length(ysound_1):1:end);

figure('name','4');

subplot(111);

plot(0:1:60, yx(1:61));

xlabel('n');

ylabel('y_x(n)');

title('y_x(n)');

qx=xcorr(zsound,'biased');

qx=qx(length(zsound):1:end);

figure('name','4');

subplot(111);

plot(0:1:60, qx(1:61));

xlabel('n');

ylabel('q_x(n)');

title('q_x(n)');

e = yx(1,1);

f = rx(1,1);

c = e/f;

disp(sprintf('阿尔法平方等于= %8.5f',c));

y=zsound;

cy=xcorr(y);

figure(11);

plot(cy);

title('回声信号的自相关');

xlabel('采样点');

ylabel('相关程度');

[h1_y,h1]=max(cy);

cy2=cy;

cy2(h1-1500:h1+1500,1)=0;

[h2_y,h2]=max(cy2);

N_delay=abs(h1-h2);

disp(sprintf('延时等于= %8.5f',N_delay/8000));

sound (zsound); %以默认采样率进行播放

你可能感兴趣的:(matlab,产生回声)