如何通过 MATLAB DSP System Toolbox 降低音频延迟?

Posted

技术标签:

【中文标题】如何通过 MATLAB DSP System Toolbox 降低音频延迟?【英文标题】:How to reduce Audio Latency by MATLAB DSP System Toolbox? 【发布时间】:2015-10-07 08:18:30 【问题描述】:

我一直在从事我的 ANC 项目。为此,我有两个麦克风输入和一个扬声器输出,但最初我使用单个麦克风和 dspStreamingPassthrough 将麦克风输入传递到扬声器。这是我的代码

% Initialization
numIterations = 500;
% Construct sources (for all inputs)
src1 = dsp.AudioRecorder('DeviceName','Mikrofon (USB-Audiogerät)','NumChannels',1);
% Construct sinks (for all outputs)
sink1_1 = dsp.SpectrumAnalyzer('SampleRate',44100, ...
'PlotAsTwoSidedSpectrum',false, ...
'ShowLegend',true);
sink1_2 = dsp.TimeScope('BufferLength',44100, ...
'SampleRate',44100, ...
'TimeSpan',1, ...
'ShowLegend',true, ...
'ShowGrid',true, ...
'YLimits',[-0.5 0.5]);
sink1_3 =
dsp.AudioPlayer('BufferSizeSource','Property','BufferSize',1024,...
'QueueDuration',0,'OutputNumUnderrunSamples',true);
sink1_3.DeviceName = 'Lautsprecher (USB-Audiogerät)';
 % Stream processing loop
clear dspStreamingPassthrough;
for i = 1:numIterations
% Sources
in1 = step(src1);
% User Algorithm
out1 = dspStreamingPassthrough(in1);
% Sinks
step(sink1_3,out1);
step(sink1_1,out1);
step(sink1_2,out1);
nUnderrun=step(sink1_3,out1);
end
% Clean up
release(src1);
release(sink1_1);
release(sink1_2);

我正在使用 Windows DirectSound 音频驱动程序(我无法使用 ASIO 驱动程序,因为我无法访问单个音频设备名称。!)现在我有 1.2 秒的音频延迟,即如果我现在在麦克风中说“你好”,之后1.2 秒扬声器说“你好”(这绝对没有任何音频输入数据处理,只是“dspStreamingPassthrough”)。如何减少这种令人难以置信的延迟?

对于我的 1 米长管道(风管)项目,我应该能够在 1.7 毫秒或更短的时间内处理数据!我尝试过尽可能低的“BufferSize”和最低的“QueueDuration”!!

还有哪些其他参数可以影响加速这个过程?是否可以使用 MATLAB?

PS:-对不起整个代码。 -我使用的是便宜的声卡(7 欧元)

【问题讨论】:

即使你能以某种方式减少延迟,你也无法将其降低到 所以matlab不适合这个!?那有什么解决办法!?你能给我一些建议吗! 这不是 MATLAB - 这是一个更根本的问题 - 1.7 ms @ 44.1 kHz 采样率为 75 个样本 - 您的声卡、驱动程序等中的缓冲区将比这更大。 我可以处理数据的最短时间是多少?我在 wiki 上读过,DirectSound 是 500 毫秒。 ASIO 需要多少钱? 将上面的脚本转换为 MEX 文件会给出一些结果吗? 【参考方案1】:

DirectSound 的延迟比 ASIO 高得多,因为 DirectSound 不适合低延迟应用。 DSP System Toolbox 尚不支持 WASAPI。

从 15a 开始,这些对象的延迟性能得到了极大改善。我不确定您运行的是哪个版本,但请尝试升级到 15a 或更高版本。

至于调整延迟,请尝试以下方法: * 将播放器和记录器的队列持续时间属性设置为 0 秒。 * 对于记录器,匹配 SamplesPerFrame 和 BufferSize 属性。 * 对于播放器,确保数据的大小与 BuferSize 属性匹配。

BufferSize 属性是声卡运行的大小。

如果你得到滴,增加 BufferSize 值。下降的原因可能有很多: * 你运行的算法不比 BufferSize/SampleRate 快 * 声卡无法在此 BufferSize 下运行。一些声卡允许您在使用 ASIO 时对其进行修改。 * 播放器/记录器对象的限制。

希望这会有所帮助。

饭菜

【讨论】:

我使用的是 MATLAB 2015b 学生版。使用 ASIO 驱动程序,仅 dspStreamingPassThrough 没有任何处理,MATLAB 每次“for”循环迭代大约需要 50 毫秒。它比 DirectSound 好得多,但问题是如果我使用两个麦克风和一个带有 ASIO 的扬声器,我将无法访问单个设备名称(如果我使用 scr1.DeviceName=' 然后选项卡我只能选择 ASIO4ALL v2)。 我尝试使用你提到的线程中的 devinfo 命令,但我只得到以下输出。 ''>> ddevinfo=dspAudioDeviceInfo ddevinfo = name: 'ASIO4ALL v2 (ASIO)' maxInputs: 2 maxOutputs: 2'' 如何访问各个设备名称?? 该设备有 2 个输入通道和 2 个输出通道。因此,如果您将一个麦克风连接到一个通道,将第二个麦克风连接到另一个通道,您可以将两个输入记录为该设备的两个通道。当您说“单个设备名称”时,我不确定您在期待什么? 对不起,我可能没有正确理解你。如何用一个 dsp.audioplayer 对象的两个不同通道映射(或连接)两个不同的麦克风?我有麦克风连接,如下所示link。 PS:我尝试使用“ChannelMapping”属性,但无法选择两个单独的麦克风。 当我说单个设备名称时,我指的是单个麦克风名称,您可以在发布的代码中看到(第 4 行和第 18 行)。问题是,如果我使用 ASIO,我会得到之前讨论过的设备。link。

以上是关于如何通过 MATLAB DSP System Toolbox 降低音频延迟?的主要内容,如果未能解决你的问题,请参考以下文章

如何在仅预测模式下运行 Matlab 的卡尔曼滤波器(DSP 工具箱)?

《DSP using MATLAB》示例9.1

毕设题目:Matlab数字信号处理

DSP视频教程DSP视频教程第6期:Matlab和VSCode联调,使用贼舒服,大大方便测试验证,全程无需打开Matlab(2022-04-09)

定点 MATLAB DSP 算法

DSP视频教程DSP视频教程第7期:Matlab的wifi通信实现,大大方便波形数据远程分析(2022-04-22)