exponenta event banner

Амбисоническое бинауральное декодирование

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

Загрузить набор данных ARI HRTF

ARIDataset = load('ReferenceHRTF.mat');

Получите данные HRTF в требуемом измерении: [NumOfSourceMeasurements x 2 x LengthOfSamples]

hrtfData = ARIDataset.hrtfData;
sourcePosition = ARIDataset.sourcePosition(:,[1,2]);

Базы данных ARI HRTF, используемые в этом примере, основаны на работе Научно-исследовательского института акустики. Данные HRTF и позиция источника в ReferenceHRTF.mat из ARI NH2 субъект.

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

Выбор точек из набора данных ARI HRTF

Теперь, когда набор данных 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 ii = 1:size(pickedSphere,1)
    for jj = 1:size(sourcePosition,1)
        % Calculate arc length
        d(ii,jj) = acos( ...
            sind(pickedSphere(ii,2))*sind(sourcePosition(jj,2)) + ...
            cosd(pickedSphere(ii,2))*cosd(sourcePosition(jj,2)) * ... 
            cosd(pickedSphere(ii,1) - sourcePosition(jj,1)));
    end
    [~,Idx] = sort(d(ii,:)); % Sort points
    pick(ii) = Idx(1);       % Pick the closest point
end

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

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

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

Создание фильтров HRTF

Создайте массив фильтров FIR для выполнения бинауральной фильтрации HRTF на основе положения виртуальных громкоговорителей.

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

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

Загрузите ambisonic аудиофайл звука вертолета и преобразуйте его в 48 кГц для совместимости с набором данных HRTF. Укажите ambisonic формат аудиофайла.

Создайте аудиофайл с частотой 48 кГц для совместимости с набором данных HRTF.

desiredFs = 48e3;
[audio,fs] = audioread('Heli_16ch_ACN_SN3D.wav');
audio = resample(audio,desiredFs,fs);
audiowrite('Heli_16ch_ACN_SN3D_48.wav',audio,desiredFs);

Укажите ambisonic формат аудиофайла. Настройте объекты ввода и вывода звука.

format = 'acn-sn3d';
samplesPerFrame = 2048;
fileReader = dsp.AudioFileReader('Heli_16ch_ACN_SN3D_48.wav', ...
                    'SamplesPerFrame',samplesPerFrame);
deviceWriter = audioDeviceWriter('SampleRate',desiredFs);
audioFiltered = zeros(samplesPerFrame,size(FIR,1),2);

Обработка звука

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

% Release resources
release(fileReader)
release(deviceWriter)

См. также

Пример создания Ambisonic Plugin

Ссылки

[1] Кронлахнер, М. (2014). Пространственные преобразования для изменения амбисонических записей (магистерская диссертация).

[2] Нойстерниг, Маркус. et al. «3D Ambisonic основанная бинауральная система воспроизведения звука». Представлен на 24-й Международной конференции AES: многоканальное аудио, The New Reality, Альберта, июнь 2003 года.