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