В этом примере показано, как настроить непрерывное формирование звука с использованием нескольких аудиоканалов. Сигнал, образец «Hallelujah Chorus» Генделя, разбивается на смежные отрезки и воспроизводится в двух частях. Первая часть примера воспроизводит каждый сегмент на одном динамике и субвуфере. Вторая часть играет каждый отрезок на разном наборе динамиков (хор голосов).
Загрузить «Аллилуйю» Генделя.
Переменные загрузки:
y представление формы волны Аллилуйя
Fs представление частоты дискретизации
load handel;
Создание объекта DataAcquisition с помощью directsound в качестве идентификатора поставщика.
dq = daq("directsound")
Добавьте шесть каналов вывода звука и установите частоту сканирования генерации в соответствии с частотой дискретизации звука.
addoutput(dq,"Audio7",1:6,"Audio"); dq.Rate = Fs;
Визуально определить аудиосегменты, соответствующие каждому «Hallelujah» в припеве, и выбрать номера образцов, на которых эти сегменты начинаются и останавливаются. Каждому цвету на сюжете соответствует свой сегмент припева.

Визуально определите границы сегмента и отметьте их.
segmentEnd = [20000, 36000, 45000, 55000, length(y)];
Настройка выбора динамиков в массиве ячеек с именем speakerselection играть пять сегментов «Аллилуйя» на шести разных динамиках.
nspeakers = 6; nspeakergroups = 5; speakerselection = cell(1, nspeakergroups);
Каждый выбор громкоговорителя определяет, какие громкоговорители из системы громкоговорителей 5.1 канала воспроизводят каждый аудиосегмент (эти назначения могут различаться для вашей системы громкоговорителей). В первой части примера используются одиночные динамики в паре с субвуфером (4).
Громкоговоритель 1: Левый фронт
Докладчик 2: Правый фронт
Спикер 3: Центр
Спикер 4: Sub-Woofer
Динамик 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: Sub-Woofer
Динамик 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