Генерация многоканального аудио

В этом примере показано, как настроить непрерывную аудио генерацию с помощью нескольких звуковых каналов. Сигнал, выборка "Хора Аллилуйи Генделя", разбит в непрерывные сегменты и воспроизведен в двух частях. Первая часть примера проигрывает каждый сегмент на одном динамике и сабвуфере. Вторая часть проигрывает каждый сегмент на различном наборе динамиков (хор речи).

Загрузите аудиоданные

Загрузите "Аллилуйю" Генделя.

Переменные загрузки:

  • y представление формы волны Аллилуйи

  • Fs представление частоты дискретизации

load handel;

Создайте сбор данных

Создайте объект DataAcquisition с помощью directsound как ID поставщика.

dq = daq("directsound")

Добавьте каналы и настройте частоту развертки генерации, чтобы совпадать с аудио частотой дискретизации

Добавьте шесть каналов аудиовыхода и установите частоту развертки генерации на аудио частоту дискретизации.

addoutput(dq,"Audio7",1:6,"Audio");
dq.Rate = Fs;

Графическое изображение аудиоданных

Визуально идентифицируйте аудио сегменты, которые соответствуют каждой "Аллилуйе" в хоре и избранных демонстрационных числах, в которых эти сегменты запускаются и останавливаются. Каждый раскрашивает график, соответствует различному сегменту хора.

Идентифицируйте конец каждого сегмента

Визуально идентифицируйте узлы сегментов и отметьте их.

segmentEnd = [20000, 36000, 45000, 55000, length(y)];

Задайте параметры динамика

Настройте выбор динамиков в массиве ячеек под названием speakerselection проигрывать пять сегментов "Аллилуйи" на шести различных динамиках.

nspeakers = 6;
nspeakergroups = 5;
speakerselection = cell(1, nspeakergroups);

Присвойте динамики группам

Каждый выбор динамика задает, какие докладчики от 5,1 акустических систем канала проигрывают каждый аудио сегмент (эти присвоения могут варьироваться для вашей акустической системы). Для первой части примера используйте один динамики, соединенные с сабвуфером (4).

  • Динамик 1: Левый фронт

  • Динамик 2: Правильная Передняя сторона

  • Динамик 3: Центр

  • Динамик 4: сабвуфер

  • Динамик 5: лево-задняя часть

  • Динамик 6: Правильная Задняя часть

speakerselection{1} = [4, 6]; 
% Segment 1; speakers 4 and 6
speakerselection{2} = [4, 5];
% Segment 2; speakers 4 and 5
speakerselection{3} = [1, 4];
% Segment 3; speakers 1 and 4
speakerselection{4} = [2, 4];
% Segment 4; speakers 2 and 4
speakerselection{5} = [3, 4];
% Segment 5; speakers 3 and 4

[singleChannelOutputs] = ...
    surroundSoundVoices(y, segmentEnd, nspeakers, nspeakergroups, speakerselection);

Запишите одному каналу Выходные параметры

Запишите последовательность одного канала выходные параметры и затем pause прежде, чем перейти к следующему разделу.

write(dq, singleChannelOutputs);
pause(3);

Присвойте динамики группам

Каждый выбор динамика задает, какие докладчики от 5,1 акустических систем канала проигрывают каждый аудио сегмент (эти присвоения могут варьироваться для вашей акустической системы). Для второй части примера используйте группы динамиков. Обратите внимание на то, что сабвуфер (4) включен во все выборы динамика

  • Динамик 1: Левый фронт

  • Динамик 2: Правильная Передняя сторона

  • Динамик 3: Центр

  • Динамик 4: сабвуфер

  • Динамик 5: лево-задняя часть

  • Динамик 6: Правильная Задняя часть

speakerselection{1} = [4, 5, 6];          % Segment 1; speakers 4, 5, 6
speakerselection{2} = [1, 2, 4];          % Segment 2; speakers 1, 2, 4
speakerselection{3} = [3, 4];             % Segment 3; speakers 3, 4
speakerselection{4} = [1, 2, 3, 4];       % Segment 4; speakers 1, 2, 3, 4
speakerselection{5} = [1, 2, 3, 4, 5, 6]; % Segment 5; all speakers

[multiChannelOutput] = ...
    surroundSoundVoices(y, segmentEnd, nspeakers, nspeakergroups, speakerselection);

Запишите многоканальные Выходные параметры

write(dq, multiChannelOutput);
function [multiChannelOutput] = surroundSoundVoices(audioOut, segmentEnds, numSpeakers, numSpeakerGroups, speakerGroups)
% Distribute contiguous segments of an output waveform to multiple groups 
% of speakers in a one-to-one relationship. The input waveform is broken up 
% into contiguous segments. Each segment is output by one and only one 
% group of speakers, with each group being visited in turn.

% Break up the input waveform into segments to be played by various groups
% of speakers. In this demonstration, we would like to slowly add "voices"
% by incrementally having more speakers generate the output waveform.
% In particular, we will regard the output waveform as a contiguous
% sequence of segments (one segment per group of speakers). For example, if
% we have 3 groups of speakers, we can think of breaking up the output
% waveform into 3 segments: output = [s1 s2 s3]
% Speaker group 1 outputs: s1 0  0
% Speaker group 2 outputs: 0  s2 0
% Speaker group 3 outputs: 0  0  s3

multiChannelOutput = repmat(0.01, length(audioOut), numSpeakers);
startOfSegment = [1 (segmentEnds(1:end-1)+1)];

for i = 1:numSpeakerGroups
    speakergroup = speakerGroups{i};
    n = numel(speakergroup);
    for j = 1:n
        range = startOfSegment(i):segmentEnds(i);
        multiChannelOutput(range, speakergroup(j)) = audioOut(range);
    end
end

end