Амплитудная интерполяция по закону панорамирования с октавой

Я работаю над проектом, который использует касательный закон для локализации фантомного источника в типичной стереосистеме (два динамика под углом 60º). Поскольку закон тангенса показывает связь между углом фантомного изображения и усилением громкоговорителей, моя цель состоит в том, чтобы построить амплитудный отклик в дБ одного громкоговорителя под разными углами источника фантома, вот код, который отлично работает с позиционированием источника:

%-----stereo panning------%
%variables:
Fs = 44100;
theta = 25;       %virtual source
phi = 30;         %loudspeaker
g(1) = 1;         %L gain
g(2) = -(tan(theta)-tan(phi)) / (tan(theta)+tan(phi));
%sum of gains has to be normalized
g = g/sqrt(sum(g.^2));
signal=mod([1:20000]',200)/200;          %signal
loudsp_sig=[signal*g(1) signal*g(2)];    %panning
soundsc(loudsp_sig,Fs);                  %play audio

Я попытался создать тэта-вектор и попытался построить график (тета, 20*log(g(2)), также используя таблицу, но либо он выдает ошибку, либо отображает только одну точку, я явно что-то здесь упускаю.

1 ответ

Решение

g(2) может быть только одно значение. Это единый индекс. Вектор не может быть сохранен в одной ячейке памяти. Если theta является вектором, то результирующее выражение

   tan θ – tan ϕ 
– ——————————————
   tan θ + tan ϕ

также должен быть вектор, рассчитанный для каждого элемента в theta и поэтому будет необходимо Wolfie разделение (как указал Wolfie).

Таким образом, используйте такое же количество индексов, как требуется theta хранить все доходы g:

g(2:numel(theta)+1) = -(tan(theta)-tan(phi)) ./ (tan(theta)+tan(phi));

Также обратите внимание, что tan Функция вычисляет тангенс аргумента в радианах. Если вы хотите указать угол в градусах, используйте tand т.е.

g(2:numel(theta)+1) = -(tand(theta)-tand(phi)) ./ (tand(theta)+tand(phi));
Другие вопросы по тегам