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

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