0

我一直在做我的ANC项目。为此,我有两个麦克风输入和一个扬声器输出,但最初我使用单个麦克风和dspStreamingPassthrough将麦克风输入传递到扬声器。这里是我的代码如何通过MATLAB DSP系统工具箱降低音频延迟?

% 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欧元)

+0

即使可以减少延迟某种程度上你不会要能够把它降低到<1.7毫秒。 –

+0

所以matlab不适合这个!什么是解决方案呢?你能给我一些建议吗? – charansai

+0

这不是MATLAB--它是一个更基本的问题 - 1.7ms @ 44.1kHz采样率是75个采样 - 声卡,驱动程序等中的缓冲区将比这更大。 –

回答

0

由于DirectSound不适合低延迟应用程序,因此DirectSound的延迟比ASIO高出很多。 DSP系统工具箱还不支持WASAPI。

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

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

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

如果得到滴,请增加BufferSize值。丢弃的原因很多: *您正在运行的算法不会比BufferSize/SampleRate更快 *声卡无法在此BufferSize下运行。某些声卡允许您在使用ASIO时修改此项。 *播放机/录像机对象的限制。

希望这会有所帮助。

迪内希

+0

我使用MATLAB 2015b学生版。使用ASIO驱动程序,只需dspStreamingPassThrough即可,MATLAB每次'for'循环迭代需要约50毫秒。它比DirectSound好得多,但问题是如果我使用两个麦克风和一个带ASIO的扬声器(如果我使用scr1.DeviceName ='然后选项卡我只能选择ASIO4ALL v2),我无法访问各个设备名称。 – charansai

+0

我试图使用devinfo命令就像在你提到的线程,但我只得到以下输出。 '>> ddevinfo = dspAudioDeviceInfo ddevinfo = 名称: 'ASIO4ALL V2(ASIO)' maxInputs:2个 maxOutputs:2 '' 我怎样才能访问单个设备名称? – charansai

+0

该设备有2个输入通道和2个输出通道。因此,如果将一个麦克风连接到一个通道,将第二个麦克风连接到另一个通道,则可以将两个输入都录制为此设备的两个通道。我不确定当你说“单个设备名称”时你的期望是什么? –