3-D интерполяция функции моделирования восприятия звука (HRTF)
interpolatedHRTF = interpolateHRTF(HRTF,sourcePositions,desiredSourcePositions)
interpolatedHRTF = interpolateHRTF(___,Name,Value)
возвращает интерполированную функцию моделирования восприятия звука (HRTF) в желаемом положении.interpolatedHRTF
= interpolateHRTF(HRTF
,sourcePositions
,desiredSourcePositions
)
задает опции с помощью одного или нескольких аргументов пары 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);
В цикле аудиопотока:
Читайте в кадре аудиоданных.
Питайте аудиоданные стерео через левые и правые фильтры HRIR, соответственно.
Конкатенация левых и правых каналов и записи аудио к вашему устройству вывода.
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);
В цикле аудиопотока:
Читайте в кадре аудиоданных.
Питайте аудиоданные через левые и правые фильтры HRIR.
Конкатенация левых и правых каналов и записи аудио к вашему устройству вывода. Если у вас есть выходное оборудование стерео, такое как наушники, можно услышать, что источник переключает положение в зависимости от времени.
Измените желаемое исходное положение в 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
— Значения HRTF измеряются в исходных положенияхЗначения HRTF измеряются в исходных положениях, заданных как N-by-2-by-M массив.
N Количество известных пар HRTF
M Количество выборок в каждом известный HRTF
Если вы задаете HRTF
с вещественными числами, функция принимает, что вход представляет импульсный ответ, и M соответствует продолжительности импульсного ответа. Если вы задаете HRTF
с комплексными числами, функция принимает, что вход представляет передаточную функцию, и M соответствует количеству интервалов в частотной характеристике. Вывод функции interpolateHRTF
имеет ту же сложность и интерпретацию как вход.
Типы данных: single | double
Поддержка комплексного числа: Да
sourcePositions
— Исходные положения, соответствующие, измерили значения HRTFИсходные положения, соответствующие, измерили значения HRTF, заданные как N-by-2 матрица. N является количеством известных пар HRTF. Эти два столбца соответствуют азимуту и повышению источника в градусах, соответственно.
Азимут должен быть в области значений [−180,360]. Можно использовать −180 для 180 соглашений или от 0 до 360 соглашений.
Повышение должно быть в области значений [−90,180]. Можно использовать −90 для 90 соглашений или от 0 до 180 соглашений.
Типы данных: single | double
desiredSourcePositions
— Желаемые исходные положения для интерполяции HRTFЖелаемое исходное положение для интерполяции 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'
'Algorithm'
— Алгоритм интерполяции'Bilinear'
(значение по умолчанию) | 'VBAP'
interpolatedHRTF
— Интерполированный HRTFИнтерполированный 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.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.