如何在matlab中实时处理多个mics输入音频流

如何在matlab中实时处理多个mics输入音频流,matlab,audio,signals,Matlab,Audio,Signals,我需要得到3个输入音频流到matlab同时使用3个USB麦克风,并找出实时的最高振幅 这是mics初始化 mic1= dsp.AudioRecorder('DeviceName','ÇáãíßÑæÝæä (10- USB PnP Sound Device)', 'SampleRate', 48000, 'NumChannels', 1); mic2= dsp.AudioRecorder('DeviceName','ÇáãíßÑæÝæä (9- USB PnP Sound Device)', 'S

我需要得到3个输入音频流到matlab同时使用3个USB麦克风,并找出实时的最高振幅

这是mics初始化

mic1= dsp.AudioRecorder('DeviceName','ÇáãíßÑæÝæä (10- USB PnP Sound Device)', 'SampleRate', 48000, 'NumChannels', 1);
mic2= dsp.AudioRecorder('DeviceName','ÇáãíßÑæÝæä (9- USB PnP Sound Device)', 'SampleRate', 48000, 'NumChannels', 1);
mic3= dsp.AudioRecorder('DeviceName','ÇáãíßÑæÝæä (8- USB PnP Sound Device)', 'SampleRate', 48000, 'NumChannels', 1);



frame1=step(mic1);
frame2=step(mic2);
frame3=step(mic3);


接下来的步骤是什么?

通过检查您的代码,您有三个音频信号,每个信号有一个通道。如果我正确地理解了您想要的,那么您希望找到随时间推移任何一个信号发出的最高声音。但是,如果我理解正确,您不能实时执行此操作,因为
AudioWriter
step
一次只能捕获一帧。由于您专门尝试从所有三个音频设备捕获音频,并且捕获音频的唯一方法是使用
步骤
,因此您必须连续调用
步骤

因此,您需要分别捕获所有三个音频信号,然后进行分析。您还需要在某一点后剪辑声音,因此可能需要5秒左右的时间。因此,您可以这样做:

time_end = 5;

%// Capture audio signal 1
tic;    
frame1 = [];
while toc < time_end
  audio_in = step(mic1);
  frame1 = [frame1; audio_in(:)];
end

%// Capture audio signal 2
tic;    
frame2 = [];
while toc < time_end
  audio_in = step(mic2);
  frame2 = [frame2; audio_in(:)];
end


%// Capture audio signal 3
tic;    
frame3 = [];
while toc < time_end
  audio_in = step(mic3);
  frame3 = [frame3; audio_in(:)];
end

max_振幅
将包含三个信号中每个信号在特定时间点的整体最高点,
loc
将告诉您在阵列中找到它的位置。如果您想找到实际发生的时间,只需取
loc
并乘以采样时间
(1/48000)
。请记住,
loc
将被1索引而不是0索引,因此您需要在乘以采样率之前减去1

因此:

%// Find lengths for all three signals
l1 = numel(frame1);
l2 = numel(frame2);
l3 = numel(frame3);
max_length = max([l1, l2, l3]);

%// Zero pad signals to make same length
frame1_pad = zeros(max_length,1);
frame2_pad = zeros(max_length,1);
frame2_pad = zeros(max_length,1);
frame1_pad(1:l1) = frame1;
frame2_pad(1:l2) = frame2;
frame3_pad(1:l3) = frame3;

%// Find maximum among each sample
max_signal = max([frame1_pad, frame2_pad, frame3_pad], [], 1);

%// Find the maximum amplitude overall and location
[max_amplitude, loc] = max(max_signal);
time_it_happened = (loc-1)*(1/48000);
发生的时间
将包含发生最大振幅的时间


祝你好运

我很难理解这句话:
实时找出最高振幅
。您想单独查看每个音频信号,并找到它们的最高振幅吗?请解释。我想在三个音频信号输入系统时比较它们,找出特定时间最高的一个(最大的声音)。非常感谢。我想投票支持你的答案,但我没有足够的声誉。@senox-没问题:)你的接受足够好。谢谢你,祝你好运!