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