是否可以使用 DSP System Toolbox(MATLAB) 实时处理两个麦克风输入?
Posted
技术标签:
【中文标题】是否可以使用 DSP System Toolbox(MATLAB) 实时处理两个麦克风输入?【英文标题】:Is it possible to process two microphones input in real time using DSP System Toolbox(MATLAB)? 【发布时间】:2015-09-29 10:59:21 【问题描述】:我一直在尝试使用数字系统处理系统工具箱来实现主动降噪 (ANC) 系统。我也使用过dsp.AudioRecorder
和dsp.AudioPlayer
。这是我的初始化代码:
mic_reference = dsp.AudioRecorder('NumChannels',1);
mic_reference.DeviceName='ASIO4ALL v2';
mic_error = dsp.AudioRecorder('NumChannels',1);
mic_error.DeviceName='ASIO4ALL v2';
sink1_2 = dsp.AudioPlayer;
sink1_2.DeviceName='ASIO4ALL v2';
我为每个麦克风拨打step(frame)
。我收到一个错误提示
使用 AudioRecorder/step 时出错 给定的音频设备只能打开一次。
是 DSP 系统工具箱的限制是一次只能在一个录音机设备上操作,还是一次可以使用两个录音机设备?
有规定对同一音频设备进行多声道处理,但是如何实时处理来自两个独立设备的音频?
【问题讨论】:
【参考方案1】:查兰塞,
这不是 DSP System Toolbox 的限制,而是 ASIO 驱动程序的行为。 ASIO 驱动程序授予对应用程序播放或录制的独占访问权限。因此,第二个对象试图重新使用相同的设备进行记录,从而导致错误。
在您的情况下,如果您的参考信号是通道 1,错误信号是通道 2,则您需要记录 2 个通道的数据,而不是使用两个记录器对象。
har = dsp.AudioRecorder('NumChannels', 2);
har.DeviceName = 'ASIO4ALL v2';
hap = dsp.AudioPlayer;
hap.DeviceName = 'ASIO4ALL v2';
data = step(har);
refData = data(:, 1);
errData = data(:, 2);
outData = doSomething(refData, errData);
step(hap, outData);
希望这会有所帮助。
点菜
【讨论】:
谢谢你,Dinesh。我认为这是 ASIO 驱动程序的问题。现在我将音频驱动程序更改为“Direct Sound”,并且可以为两个麦克风提供两个不同的设备名称并同时处理它们。因此,DSP 系统工具箱不能处理两个音频输入是不正确的。但是如何控制 ASIO 驱动程序授予独占访问权限(假设它是比 'Direct Sound' 稳定的驱动程序)? 你能解释一下如何映射两个通道(左通道到一个设备,右通道到另一个设备)。我无法理解您在上面的代码中在做什么,您正在使用一个录音机(麦克风)并将其两个立体声(左和右)输入处理为两个数据(参考,错误)。图片中的第二个麦克风在哪里? DirectSound 和 ASIO 有不同的用途。 ASIO 主要用于低延迟应用程序,而 DirectSound。 DirectSound 创建应用程序与之对话的虚拟设备层。每个应用程序都与这个虚拟层而不是实际的物理设备进行通信。在播放过程中,如果两个应用程序尝试将两种声音播放到同一个输出,DirectSound 将负责混音,这会增加延迟。因此,驱动程序模型的选择取决于您的应用程序的目的 我不完全清楚您要记录多少信号。如果您使用两个记录器对象,我假设您需要两个输入信号。 使用 DirectSound 我有 1.2 秒的音频延迟,没有任何额外的处理只是“dspStreamingPassthrough”。使用 ASIO 可以减少多少?将脚本转换为 MEX 文件会影响处理时间吗?【参考方案2】:当您记录信号时,您应该从 2 个麦克风(每个称为通道/观察 - 即左右通道)进行记录,并且您应该将这两个观察组合成一个流,然后再将其传递给 Matlab,您应该只将 1 个双通道信号输入传递到 dsp AudioRecorder 工具箱 - 它不接受我不认为的两个来源。当您读入数据时,它应该是 2 个向量的矩阵(假设您在 AudioRecorder 设置中指定了 2 个通道)。
【讨论】:
感谢回复。实际上在主动降噪中,我会使用两个不同的麦克风(参考和错误)和一个扬声器,所有这些都应该实时处理。我不是在谈论两个通道(左和右)处理。所以,不可能用dsp AudioRecorder实时处理两个麦克风和一个扬声器..!是否有可能使用单个录音机来处理来自一个麦克风(参考)的一帧和来自另一个麦克风(错误)的下一帧。所以,我可以处理一些滞后的数据。 你有两个立体声麦克风吗?否则,您可以将一个麦克风连接到左声道,将另一个麦克风连接到右声道,然后同时读取两者。 正如@hbaderts 所说,两个麦克风应该形成一个实时数据流。 @hbaderts 如何将通道映射到不同的音频设备? (左声道到一个麦克风,右声道到另一个麦克风)? @GameOfThrows 现在我将音频驱动程序从 ASIO 更改为“Direct Sound”,并且能够通过两个不同的名称识别两个 Audiorecorder 对象并在线处理它们。 !以上是关于是否可以使用 DSP System Toolbox(MATLAB) 实时处理两个麦克风输入?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 Visual Studio Code 上使用 Docker Toolbox?
markdown matlab_robotics_system_toolbox