interpolateHRTF

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

Синтаксис

interpolatedHRTF = interpolateHRTF(HRTF,sourcePositions,desiredSourcePositions)
interpolatedHRTF = interpolateHRTF(___,Name,Value)

Описание

пример

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

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

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

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

Введенный в R2018b