Ambisonic бинауральное декодирование

Этот пример показывает, как декодировать ambisonic аудио в бинауральное аудио с помощью виртуальных громкоговорителей. Виртуальный громкоговоритель является источником звука, расположенным на поверхность сферы с прослушивателем, расположенным в центре сферы. Каждый виртуальный громкоговоритель имеет пару Функций моделирования восприятия звука (HRTF), сопоставленных с ним: один для оставленного уха и один для правого уха. Виртуальные местоположения громкоговорителя наряду с порядком ambisonic используются, чтобы вычислить ambisonic матрицу декодера. Вывод декодера отфильтрован соответствием HRTFs виртуальному положению громкоговорителя. Сигналы слева HRTFs суммируются вместе и питаются левое ухо и сигналы справа, HRTFs суммируются вместе и питаются правое ухо. Блок-схему потока звукового сигнала показывают здесь.

Загрузите набор данных АРИ HRTF

ARIDataset = load('ReferenceHRTF.mat');
% Get the HRTF data in the required dimension of
% [NumOfSourceMeasurements x 2 x LengthOfSamples]
hrtfData = ARIDataset.hrtfData;
sourcePosition = ARIDataset.sourcePosition(:,[1,2]);

Базы данных АРИ HRTF, используемые в этом примере, основаны на работе Научно-исследовательским институтом Акустики http://www.kfs.oeaw.ac.at/hrtf. Данные HRTF и исходное положение в ReferenceHRTF.mat от предмета ARI NH2.

Базы данных HRTF Научно-исследовательским институтом Акустики, австрийской Академии наук лицензируют при Приписывании-ShareAlike Creative Commons 3.0 Непортированных Лицензии: http://creativecommons.org/licenses/by-sa/3.0/

Выберите Points from ARI HRTF Dataset

Теперь, когда Набор данных HRTF загружается, определите который точки выбрать для виртуальных громкоговорителей. Этот пример выбирает случайные точки, распределенные на поверхности сферы, и выбирает точки набора данных HRTF, самого близкого к выбранным точкам.

  1. Выберите случайные точки от сферического распределения

  2. Сравните сферу с точками от набора данных HRTF

  3. Выберите точки с кратчайшим расстоянием между ними

% Create a sphere with a distribution of points
nPoints = 24;   % number of points to pick
rng(0);         % seed randcom number generator
sphereAZ = 360*rand(1,nPoints);
sphereEL = rad2deg(acos(2*rand(1,nPoints)-1))-90;
pickedSphere = [sphereAZ' sphereEL'];

% Compare distributed points on the sphere to points from the HRTF dataset
pick = zeros(1, nPoints);
d = zeros(size(pickedSphere,1), size(sourcePosition,1));
for i = 1:size(pickedSphere,1)
    for j = 1:size(sourcePosition,1)
        % Calculate arc length
        d(i,j) = acos( ...
            sind(pickedSphere(i,2))*sind(sourcePosition(j,2)) + ...
            cosd(pickedSphere(i,2))*cosd(sourcePosition(j,2)) * ...
            cosd(pickedSphere(i,1) - sourcePosition(j,1)));
    end
    [~,Idx] = sort(d(i,:)); % Sort points
    pick(i) = Idx(1);       % Pick the closest point
end

Создайте декодер Ambisonic

Задайте желаемый порядок ambisonic, и желал виртуальных исходных позиций громкоговорителя входных параметров к функции помощника audioexample.ambisonics.ambidecodemtrx. Функция возвращает матрицу декодера звукозаписи с эффектом присутствия.

order = 7;
devices = sourcePosition(pick,:)';
dmtrx = audioexample.ambisonics.ambidecodemtrx(order, devices);

Создайте фильтры HRTF

Создайте массив КИХ-фильтров, чтобы выполнить бинауральный HRTF, фильтрующий на основе положения виртуальных громкоговорителей.

FIR = cell(size(pickedSphere));
for i=1:length(pick)
    FIR{i,1} = dsp.FrequencyDomainFIRFilter(hrtfData(:,pick(i),1)');
    FIR{i,2} = dsp.FrequencyDomainFIRFilter(hrtfData(:,pick(i),2)');
end

Создайте объекты аудиовхода и вывода

Загрузите ambisonic звуковой файл вертолетного звука. Задайте ambisonic формат звукового файла.

Читатель файла настройки и средство записи устройства

fileName = fullfile(matlabroot, 'toolbox','audio','samples','Heli_16ch_ACN_SN3D.wav');
format = 'acn-sn3d';
samplesPerFrame = 2048;
fileReader = dsp.AudioFileReader(fileName, ...
                    'SamplesPerFrame', samplesPerFrame);
sampleRate = fileReader.SampleRate;
deviceWriter = audioDeviceWriter('SampleRate', sampleRate);
audioFiltered = zeros(samplesPerFrame, size(FIR,1), 2);

Аудио процесса

while ~isDone(fileReader)
    audioAmbi = fileReader();
    audioDecoded = audioexample.ambisonics.ambidecode(audioAmbi, dmtrx, format);
    for i=1:size(FIR,1)
        audioFiltered(:,i,1) = step(FIR{i,1}, audioDecoded(:,i)); % Left
        audioFiltered(:,i,2) = step(FIR{i,2}, audioDecoded(:,i)); % Right
    end
    audioOut = 10*squeeze(sum(audioFiltered,2));   % Sum at each ear
    numUnderrun = deviceWriter(audioOut);
end

% Release resources
release(fileReader)
release(deviceWriter)

Смотрите также

Пример генерации плагина Ambisonic

Ссылки

[1] Kronlachner, M. (2014). Пространственные Преобразования для Изменения Записей Ambisonic (Магистерская диссертация).

[2] Noisternig, Маркус. и др. "3D Ambisonic Основанная Бинауральная Система Воспроизведения звука". Представленный на 24-й Международной конференции AES: Многоканальное Аудио, Новая Действительность, Альберта, июнь 2003.

Для просмотра документации необходимо авторизоваться на сайте