В этом примере показано, как настроить непрерывную генерацию аудио с помощью нескольких аудиоканалов. Сигнал, выборка «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