3-D интерполяция функции моделирования восприятия звука (HRTF)
возвращает интерполированную функцию моделирования восприятия звука (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-48-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,:));
Создайте звуковой файл, произведенный на уровне 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');
В цикле аудиопотока:
Читайте в системе координат аудиоданных.
Питайте аудиоданные через левые и правые фильтры 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
имя аргумента и Value
соответствующее значение. Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN
.
'Algorithm','VBAP'
interpolatedHRTF
— Интерполированный HRTFИнтерполированный 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.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.