exponenta event banner

interpolateHRTF

3D интерполяция связанной с головой функции перемещения (HRTF)

Описание

пример

interpolatedHRTF = interpolateHRTF(HRTF,sourcePositions,desiredSourcePositions) возвращает интерполированную передаточную функцию, связанную с головкой (HRTF), в требуемом положении.

пример

interpolatedHRTF = interpolateHRTF(___,Name,Value) указывает параметры, использующие один или несколько Name,Value аргументы пары.

Примеры

свернуть все

Измените 3-D аудиоизображение звукового файла путем фильтрации его с помощью функции передачи, связанной с головкой (HRTF). Задайте местоположение источника звука, указав требуемый азимут и отметку.

load 'ReferenceHRTF.mat' hrtfData sourcePosition

hrtfData = permute(double(hrtfData),[2,3,1]);

sourcePosition = sourcePosition(:,[1,2]);

Вычислите импульсную характеристику, связанную с головкой (HRIR), с использованием алгоритма VBAP в требуемом положении источника. Разделите выходной сигнал, interpolatedIR, в импульсные отклики для левого и правого ушей.

desiredAz = 110;
desiredEl = -45;
desiredPosition = [desiredAz desiredEl];

interpolatedIR  = interpolateHRTF(hrtfData,sourcePosition,desiredPosition, ...
                                  "Algorithm","VBAP");

leftIR = squeeze(interpolatedIR(:,1,:))';
rightIR = squeeze(interpolatedIR(:,2,:))';

Создать dsp.AudioFileReader объект для чтения в кадре файла по кадрам. Создание audioDeviceWriter объект для воспроизведения звука в кадре звуковой карты. Создать два dsp.FIRFilter и задают коэффициенты фильтра с использованием интерполяционных импульсных откликов передаточной функции, связанной с головкой.

fileReader = dsp.AudioFileReader('RockDrums-48-stereo-11secs.mp3');
deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate);

leftFilter = dsp.FIRFilter('Numerator',leftIR);
rightFilter = dsp.FIRFilter('Numerator',rightIR);

В цикле аудиопотока:

  1. Считывание в кадре аудиоданных.

  2. Подача аудиоданных через левый и правый фильтры HRIR соответственно.

  3. Соедините левый и правый каналы и запишите звук на устройство вывода.

while ~isDone(fileReader)
    audioIn = fileReader();
    
    leftChannel = leftFilter(audioIn(:,1));
    rightChannel = rightFilter(audioIn(:,2));
    
    deviceWriter([leftChannel,rightChannel]);
end

Рекомендуется по завершении деблокировать системные объекты.

release(deviceWriter)
release(fileReader)

Создайте массивы связанных с головкой импульсных откликов, соответствующих требуемым позициям источника. Фильтрация моновходов для моделирования движущегося источника.

Загрузите набор данных ARI HRTF. Бросьте hrtfData ввести двойное и изменить его форму до требуемых размеров: (количество исходных позиций) - по-2-по-( количество образцов HRTF). Используйте первые два столбца sourcePosition только матрицы, которые соответствуют азимуту и отметке источника в градусах.

load 'ReferenceHRTF.mat' hrtfData sourcePosition

hrtfData = permute(double(hrtfData),[2,3,1]);

sourcePosition = sourcePosition(:,[1,2]);

Укажите требуемые исходные позиции и затем рассчитайте HRTF в этих местоположениях с помощью interpolateHRTF функция. Разделите выходной сигнал, interpolatedIR, в импульсные отклики для левого и правого ушей.

desiredAz = [-120;-60;0;60;120;0;-120;120];
desiredEl = [-90;90;45;0;-45;0;45;45];
desiredPosition = [desiredAz desiredEl];

interpolatedIR  = interpolateHRTF(hrtfData,sourcePosition,desiredPosition);

leftIR = squeeze(interpolatedIR(:,1,:));
rightIR = squeeze(interpolatedIR(:,2,:));

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

desiredFs = 48e3;
[audio,fs] = audioread('Counting-16-44p1-mono-15secs.wav');
audio = 0.8*resample(audio,desiredFs,fs);
audiowrite('Counting-16-48-mono-15secs.wav',audio,desiredFs);

Создать dsp.AudioFileReader объект для чтения в кадре файла по кадрам. Создание audioDeviceWriter объект для воспроизведения звука в кадре звуковой карты. Создать два dsp.FIRFilter объекты с NumeratorSource установить в значение Input port. Настройка NumeratorSource кому Input port позволяет изменять коэффициенты фильтра во время потоковой передачи.

fileReader = dsp.AudioFileReader('Counting-16-48-mono-15secs.wav');
deviceWriter = audioDeviceWriter('SampleRate',fileReader.SampleRate);

leftFilter = dsp.FIRFilter('NumeratorSource','Input port');
rightFilter = dsp.FIRFilter('NumeratorSource','Input port');

В цикле аудиопотока:

  1. Считывание в кадре аудиоданных.

  2. Подача аудиоданных через левый и правый фильтры HRIR.

  3. Соедините левый и правый каналы и запишите звук на устройство вывода. Если имеется аппаратное обеспечение стереовыхода, например наушники, то со временем можно услышать положение переключения источника.

  4. Измените требуемую позицию источника через 2-секундные интервалы, обновив коэффициенты фильтра.

durationPerPosition = 2;
samplesPerPosition = durationPerPosition*fileReader.SampleRate;
samplesPerPosition = samplesPerPosition - rem(samplesPerPosition,fileReader.SamplesPerFrame);

sourcePositionIndex = 1;
samplesRead = 0;
while ~isDone(fileReader)
    audioIn = fileReader();
    samplesRead = samplesRead + fileReader.SamplesPerFrame;
    
    leftChannel = leftFilter(audioIn,leftIR(sourcePositionIndex,:));
    rightChannel = rightFilter(audioIn,rightIR(sourcePositionIndex,:));
    
    deviceWriter([leftChannel,rightChannel]);
    
    if mod(samplesRead,samplesPerPosition) == 0
        sourcePositionIndex = sourcePositionIndex + 1;
    end
end

Рекомендуется по завершении деблокировать системные объекты.

release(deviceWriter)
release(fileReader)

Входные аргументы

свернуть все

Значения HRTF, измеренные в исходных позициях, указаны как массив N-by-2-by-M.

  • N -- Количество известных пар HRTF

  • M - количество образцов в каждом известном HRTF

При указании HRTF при вещественных числах функция предполагает, что вход представляет импульсную характеристику, а М соответствует длине импульсной характеристики. При указании HRTF с комплексными числами функция предполагает, что вход представляет передаточную функцию, а М соответствует числу ячеек в частотной характеристике. Выходные данные interpolateHRTF функция имеет ту же сложность и интерпретацию, что и вход.

Типы данных: single | double
Поддержка комплексного номера: Да

Исходные позиции, соответствующие измеренным значениям HRTF, указанным как матрица N-by-2. N - число известных пар HRTF. Два столбца соответствуют азимуту и отметке источника в градусах соответственно.

Азимут должен находиться в диапазоне [− 180 360]. Можно использовать условное обозначение от − 180 до 180 или условное обозначение от 0 до 360.

Отметка должна быть в диапазоне [− 90 180]. Можно использовать условное обозначение от − 90 до 90 или условное обозначение от 0 до 180.

Типы данных: single | double

Требуемая исходная позиция для интерполяции HRTF, заданная как матрица P-by-2. P - количество требуемых исходных позиций. Столбцы соответствуют требуемому азимуту и отметке источника в градусах соответственно.

Азимут должен находиться в диапазоне [− 180 360]. Можно использовать условное обозначение от − 180 до 180 или условное обозначение от 0 до 360.

Отметка должна быть в диапазоне [− 90 180]. Можно использовать условное обозначение от − 90 до 90 или условное обозначение от 0 до 180.

Типы данных: single | double

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'Algorithm','VBAP'

Алгоритм интерполяции, указанный как "Bilinear" или "VBAP".

  • Bilinear - 3-D билинейная интерполяция, как указано в [1].

  • VBAP - интерполяция панорамирования базовой амплитуды вектора, как указано в [2].

Типы данных: char | string

Выходные аргументы

свернуть все

Интерполированный HRTF, возвращаемый как массив P-by-2-by-M.

  • P -- Количество требуемых исходных позиций, определяемое количеством строк в desiredSourcePositions входной аргумент.

  • M - Количество образцов в каждом известном HRTF, определенное количеством страниц в HRTF входной аргумент.

interpolatedHRTF имеет ту же сложность и интерпретацию, что и входные данные. Если указать ввод, HRTFпри вещественных числах функция предполагает, что входной сигнал представляет импульсную характеристику. При указании ввода с комплексными числами функция предполагает, что ввод представляет собой передаточную функцию.

Типы данных: single | double
Поддержка комплексного номера: Да

Ссылки

[1] Ф.П. Фриланд, Л.У.П. Бискаинью и П.С.Р. Диниз, «Интерполяция функций передачи, связанных с головным звеном (HRTFS): подход с множеством источников». 2004 12-я Европейская конференция по обработке сигналов. Вена, 2004, стр. 1761-1764.

[2] Пулкки, Вилле. «Позиционирование виртуального источника звука с использованием векторного панорамирования амплитуды». Журнал Общества аудиотехники. Том 45. Выпуск 6, стр. 456-466.

Расширенные возможности

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2018b