使用麦克风脉冲响应的虚拟麦克风

信息处理 冲动反应
2022-02-17 04:37:41

我正在开发一个虚拟麦克风项目,该项目试图模拟使用另一个麦克风获得的音频信号的输出。让我知道这听起来是否合理的解决方案。

假设,我们有两个麦克风:Mic1Mic2s使用 . 通过扬声器播放声源Mic1h1和分别为使用同一扬声器的和获得h2的脉冲响应。现在,如果我们使用 记录,我们会得到:Mic1Mic2Mic1

s1(t) = h1(t) * s(t) % (*) operator is convolution. 

如果我们想实现 s2(Mic2 产生的声音),我们可以这样做:

% Take fft of h1(t) & h2(t)
H1f = fft(h1); H2f = fft(h2);

% Obtain S(f) using division in fft
S1f = fft(s1);
Sf = S1f/H1f;

% Obtain s2(t) using multiplication in freq domain & ifft 
S2f = Sf .* H2f;
s2 = ifft(S2f);

作为解决问题的方法,这听起来可行吗?更实际的实现(建议)将不胜感激。

2个回答

这行得通吗?好吧,它会做一些事情,但它不会神奇地让一个麦克风听起来像另一个。麦克风不仅仅是具有脉冲响应的信号接收器。麦克风的特性取决于它的方向特性以及它如何耦合到扩散和直接场分量、与压力场的耦合类型、薄膜和集成前置放大器的非线性、薄膜和电子元件的噪声。

您将只能通过脉冲响应捕获所有这些的一小部分,而且很可能完全不是麦克风中负责赞美其声音的部分。

但即使你忽略了所有这些,你仍然会遇到一个并非微不足道的反卷积问题,尤其是在存在潜在未知字符的噪声的情况下。您的光谱划分方法相当幼稚,并且会在一定程度上起作用。如果你想得到好的结果,你将不得不走一条更艰难的路,你甚至可能在这方面都无法得到你想象的结果。此外,您总是必须从一个非常好的麦克风开始。一个坏的麦克风通常不允许这样简单的改进。

简而言之,即使我听起来过于悲观:不,这不会像您期望的那样起作用。如果你想这样做来开始一个研究项目,那么你很好。但它不会成为麦克风爱好者的即插即用产品。

我认为这基于我在下面喜欢的帖子中所做的类似工作是可行的,但正如 Jazzmaniac 在评论中指出的那样,我的解决方案仅适用于空间环境中的单点源。也就是说,对于模拟来自一个来源的响应的情况,您可以捕获所有效果,包括麦克风本身的效果,作为通道响应的一部分。您执行此操作的能力取决于您准确表征虚拟麦克风通道的能力。

请参阅这篇文章,我在其中做了与此非常相似的事情:

补偿音频信号中的扬声器频率响应

在我回复的上述链接中该帖子的底部,我展示了我在声音文件中使用的均衡器功能示例,以均衡左右声道接收到的波形,就像两个麦克风接收到的一样。这两个通道在均衡之前是无法识别的,而在均衡之后则在幅度、相位和特性上完全对齐!这是基于应用我从测量中确定的通道脉冲响应。

在该方法的细节中,我展示了我是如何确定通道响应的。使用通道响应,您可以以同样的方式轻松准确地确定其他麦克风将接收到的内容。

要在您的应用程序中最准确地执行此操作,您需要在两个位置都有一个测试麦克风,以便能够使用我在链接中提供的方法捕获接收到的波形并确定通道脉冲响应。只要房间条件没有改变(这很重要),并且正如 Jazzmaniac 指出的那样,实验是使用一个主要声源完成的,您就可以移除其中一个测试麦克风,并用另一个麦克风确定虚拟麦克风是什么位于测试位置的声音将接收到来自与信道表征时传输的相同空间位置的声音。

有趣的是(我还没有这样做,以下只是建议),是有两个麦克风甚至是一个麦克风阵列,每个麦克风隔开你想要处理的最低频率的半波长,这样方向性可以确定。使用这种方法应该有足够的自由度,以便您可以均衡整个房间(但我想您需要有一个已知的通道发声器,可以移动到每个不相关的空间位置,在这种情况下,间隔为 1/2您想要处理的最高频率的波长,并且您的设备不能干扰通道响应本身......这怎么可能做到??)。因此,对于数组,这个概念至少应该是可行的;但是,我还没有研究过数组的大小。