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