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 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');
В цикле аудиопотока:
Чтение в систему координат аудио данных.
Пропустите аудио данных через левый и правый фильтры 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] Ф.П. Фриланд, Л.В.П. Бискаиньо и П.С. Р. Diniz, «Interpolation of Head-related Передаточные Функции (HRTFS): A multi-source approach». 2004 12-я Европейская конференция по обработке сигналов. Вена, 2004, с. 1761-1764.
[2] Пулкки, Вилле. «Виртуальное позиционирование источника звука с использованием панорамирования амплитуды на основе векторов». Журнал Общества Аудиотехники. Том 45. Выпуск 6, стр. 456-466.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.