idea
关于系统
我们将一个空旷的房间类比于一个系统,如果我们在房间内放置一个声源,声音信号经过墙壁,天花板,地面,放置的种种物品的反射,最终会被我们人耳或者声音采集设备收集。这个系统显然对声音具有一定的处理作用,并且这些放置物品以及房间本身结构以及材料的独特性,决定了代表其特征的传递函数。
关于传递函数
在自动控制原理中我们获悉,一个系统的传递函数可以通过实验的方法获得,一个系统的冲激响应即为其传递函数。
Y(s) = G(s)·L[δ(t)]
完美的冲激信号我们无法轻易获得,事实上我们可以用一个尖锐的声音信号代替之。在这里,我将收集拍手声经过房间这个系统作用之后的信号,以此求出房间这个系统的传递函数。
关于卷积
时域信号的卷积等于频域的相乘,这一点与传递函数的理解是一致的,即有:
Y[s] = G(s)·X(s)
值得一提的是,本次实验中我采用了手机进行声音信号的采集,手机采集到的声音信息是双通道的,我们在进行卷积之前,需要对声音信号预先进行声道合并和格式处理。
思路
用拍手声模拟冲激响应之后,我们需要在另一相对安静的环境下采集另一段音频信号,同样地在卷积运算之前需要对信号进行预处理。而后即可通过matlab进行编程实现卷积运算了。
代码展示
读取两段音频
clear;
clc
% 读取两段音频
IR = audioread('Gs.wav');
voice = audioread('warm_song.wav');
mix = conv(voice,IR);
% 作图观察冲激信号
plot(IR);
audiowrite('conv_song.wav',mix,48000);
图像如下:
可见在信号发生之初还是比较“锐利”的。
卷积之前的声音
在命令行直接输入即可
sound(voice,48000)
卷积之后的声音
在命令行直接输入即可
sound(mix,48000)
完整声音文件及调试见:
链接:https://pan.baidu.com/s/10zaN58aUof37uqg5ERSfZQ
提取码:g6j1