Это функция (а не сценарий), и ей нужны некоторые входные аргументы для запуска (в данном случае A
и x
), поэтому вы не можете нажать кнопку запуска и ожидать ее запуска.
Вместо этого вы можете использовать окна команд в MATLAB и ввести команду:
A = rand(3,3); % define A here
x = ones(3,1); % define x here
test(A,x) % then run the function with its arguments
помните, что необходимо определить A
и x
Также вы можете нажать маленький треугольник, кроме кнопки зеленого запуска (см. рисунок ниже), и он покажет вам еще один вариант, type command to run
. И там вы можете напрямую ввести ту же команду test(A,x)
. После этого каждый раз вы просто нажимаете enter для этой функции и запускаете эту команду вместо команды test
без каких-либо аргументов.
[/g2]
Необходимо добавить их вместе, но отсечь результат к допустимому диапазону для предотвращения.
В случае появления отсечения, Вы будете вводить искажение в аудио, но это неизбежно. Можно использовать код отсечения для "обнаруживания" этого условия, и сообщить об этом пользователю/оператору (эквивалентный из красного света 'клипа' на микшере...)
Вы могли реализовать более "надлежащий" компрессор/ограничитель, но не зная Ваше точное приложение, трудно сказать, стоило ли это того.
при выполнении большой обработки аудиоданных Вы могли бы хотеть представить свои уровни звука как значения с плавающей точкой и только вернуться к 16-разрядному пространству в конце процесса. Высокопроизводительные системы цифрового аудио часто прокладывают себе путь.
Я сказал бы, просто добавляют их вместе. При переполнении пространства PCM на 16 битов то звуки, которые Вы используете, являются уже невероятно громкими для начала, и необходимо ослабить их. Если это заставило бы их быть слишком мягкими собой, ищите другой способ увеличение полное производство объема, такое как установка OS или превращение кнопки на Ваших динамиках.
Я думаю, что, пока потоки являются некоррелироваными, у Вас не должно быть слишком много для волнения о, необходимо смочь обойтись отсечением. Если бы Вы действительно обеспокоены искажением в точках клипа, мягкий ограничитель, вероятно, работал бы хорошо.
Вы правы относительно добавления их вместе. Вы могли всегда сканировать сумму этих двух файлов для точек максимума и уменьшать масштаб всего файла, если они поражают некоторый порог (или если среднее число его и его окружающих пятен поразило порог)
"Более тихий наполовину" не довольно корректно. Из-за логарифмического ответа уха, разделяя образцы пополам сделает это на 6 дб более тихим - конечно, примечательный, но не имеющий катастрофические последствия.
Вы могли бы хотеть пойти на компромисс путем умножения на 0,75. Это сделает это на 3 дб более тихим, но уменьшит шанс переполнения и также уменьшит искажение, когда это действительно произойдет.
Большинство приложений микширования звука сделает свое смешивание с числами с плавающей точкой (32 бита много достаточно хорошее для смешивания небольшого количества потоков). Переведите образцы на 16 битов в числа с плавающей точкой с диапазоном-1.0 к 1,0 полным масштабам представления в мире на 16 битов. Тогда суммируйте образцы вместе - у Вас теперь есть много высоты. Наконец, если Вы заканчиваете с какими-либо образцами, значение которых пробегается через полный масштаб, можно или ослабить целый сигнал или использовать трудно ограничение (отсекающий значения к 1,0).
Это даст намного лучшие звучащие результаты, чем добавление образцов на 16 битов вместе и разрешение им переполниться. Вот очень простой пример кода, показывающий, как Вы могли бы суммировать два образца на 16 битов вместе:
short sample1 = ...;
short sample2 = ...;
float samplef1 = sample1 / 32768.0f;
float samplef2 = sample2 / 32768.0f;
float mixed = samplef1 + sample2f;
// reduce the volume a bit:
mixed *= 0.8;
// hard clipping
if (mixed > 1.0f) mixed = 1.0f;
if (mixed < -1.0f) mixed = -1.0f;
short outputSample = (short)(mixed * 32768.0f)
Если бы необходимо сделать это правильно, я предложил бы смотреть на реализации микшера программного обеспечения с открытым исходным кодом, по крайней мере, для теории.
Некоторые ссылки:
На самом деле необходимо, вероятно, пользоваться библиотекой.
Здесь есть статья о смешивании здесь . Мне было бы интересно узнать, что другие думают об этом.
преобразовать образцы в значения с плавающей запятой в диапазоне от -1,0 до +1,0, затем:
out = (s1 + s2) - (s1 * s2);