回声系统

  你骂它一声,它回你三声

Posted by     Keyon                      on April 15, 2018

上学期学信号与系统,第一个信号设计就是这个回声系统,这个设计算是所有设计作业里最有趣的一个了。

首先,我们需要生成单位冲激响应的代码,将其命名为delta.m

function [y] = delta(t)
%UNTITLED5 此处显示有关此函数的摘要
%   此处显示详细说明
for i = 1: length( t)
if t( i) ==0
y( i) = 1e4; %零时刻为无穷大;
else
y( i) = 0;
end
end

然后,以下代码是主系统,可以命名为echo_system.m

%录制声音
fs = 20000;  %声音采样率
duration = 2; %录音时间为 1 s
fprintf( '按任意键开始录音\n。',duration) ;
pause; %暂停
fprintf( '录音中……\n') ;
recObj = audiorecorder;
recordblocking(recObj,duration); %录音函数
fprintf( '录音完成。\n') ;
f0= getaudiodata(recObj);
%冲激响应函数 h( t)
a0 = 1.0; %反射系数
a1 = 0.5;
a2 = 0.2;
T = 1 /fs;
t = 0: T: duration;
h = a0*delta ( t-0.1) + a1*delta ( t-0.5) + a2*delta ( t-0.9) ;
%卷积得到回音
f0 = f0'; %信号转置, 将列向量变为行向量
y = T* conv( f0,h) ;
y = y';
sound(y,10000);
%p=audioplayer(y,fs) ; %播放卷积结果, 即回音
%play(p,[1 (get(p, 'SampleRate') * 3)]);
subplot( 211) ;
plot( f0) ; %绘制原始音
title( '原始音') ;
subplot( 212) ;
plot( y ( 1: length( y) ) ) ; %绘制回音
title( '经过回音系统') ; 

最后在命令行运行echo_system。

这个代码第一次生成回声的时候只能生成你语音输入的后半段,再运行一次就可以将你整个语音输入生成回声了。至于为什么会这样,我也不知道😂。