Интерполяция амплитуды закона панорамирования с помощью Octave

Я работаю над проектом, в котором используется закон касательной для локализации фантомного источника в типичной стереоустановке (два громкоговорителя под углом 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)), также используя таблицу, но либо это дает мне ошибку, либо отображает только одну точку, я явно что-то здесь упускаю.


person Community    schedule 22.01.2019    source источник
comment
g(2) может быть только одним значением. Это единый индекс. Вы не можете ожидать, что один индекс будет хранить что-либо, кроме скаляра, и, следовательно, у вас есть ошибки.   -  person Sardar Usama    schedule 22.01.2019
comment
Я думаю, вы также намеревались использовать g = g./sqrt(...), а не g = g/sqrt(...) для разделения по элементам.   -  person Wolfie    schedule 23.01.2019


Ответы (1)


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

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

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

Итак, используйте то же количество индексов, которое требуется для 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));
person Sardar Usama    schedule 23.01.2019
comment
Вы используете одну и ту же координату y (рассчитанную только для g(2)) для всех точек. Какой еще результат вы ожидаете, кроме получения того же значения по оси Y? g(2) - это одна точка. Это не вектор. Вы должны сделать: plot(theta, 20*log(g(2:end)), '*'); - person Sardar Usama; 24.01.2019