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-44p1-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. Бросьте hrtfData вводить дважды, и изменять его к необходимым размерностям: (количество исходных положений)-by-2-by-(количество выборок 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,:));

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

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

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

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

  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] Ф.П. Фрилэнд, L.W.P. Biscainho и P.S.R. Диниц, "Интерполяция Функций моделирования восприятия звука (HRTFS): мультиисходный подход". 2 004 12-х европейских Конференции по Обработке сигналов. Вена, 2004, стр 1761–1764.

[2] Pulkki, Ville. "Виртуальная Установка Источника звука Используя Векторное Основное Амплитудное Панорамирование". Журнал Общества звукоинженеров. Издание 45. Выпуск 6, стр 456–466.

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

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

Введенный в R2018b