interpolateHRTF

3-D интерполяция передаточной функции, связанной с головой (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)

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

Загрузите набор данных HRTF ARI. Приведите hrtfData чтобы ввести double, и изменить его на необходимые размерности: (количество исходных позиций) -на-2-by- (количество выборки). Используйте первые два столбца 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 с вещественными числами функция принимает, что вход представляет импульсную характеристику, и M соответствует длине импульсной характеристики. Если вы задаете HRTF с комплексными числами функция принимает, что вход представляет передаточную функцию, и M соответствует количеству интервалов в частотной характеристики. Выходные выходы 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] Ф.П. Фриланд, Л.В.П. Бискаиньо и П.С. Р. Diniz, «Interpolation of Head-related Передаточные Функции (HRTFS): A multi-source approach». 2004 12-я Европейская конференция по обработке сигналов. Вена, 2004, с. 1761-1764.

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

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

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.
Введенный в R2018b