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

时间:2014-11-28 23:26:03

标签: matlab audio signals

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

这是麦克风初始化

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);

接下来的步骤是什么?

1 个答案:

答案 0 :(得分:1)

通过检查代码,您有三个音频信号,每个信号有一个通道。如果我理解你想要什么,你想要找到任何一个信号随时间推移产生的最高声音。但是,如果我理解正确,您无法实时执行此操作,因为step AudioWriter只能一次捕获一帧。因为您专门尝试从所有三个音频设备捕获,并且您使用step捕获音频的唯一方法是,您必须为每个信号串行呼叫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并按列操作并找到每个时间点的最大值,然后找出所有这些中的最大值。

因此:

%// 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);

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

因此:

time_it_happened = (loc-1)*(1/48000);

time_it_happened将包含发生最高振幅的时间。

祝你好运!