Ваш подход может быть использован для создания одного и того же результата, выраженного по-разному. Однако theta += theta_increment;
будет более простым выражением (для расчета), чем то, что вы предлагаете.
Домен фазы переносится в sin'
s область логических параметров. Этот шаг действительно не нужен для коротких образцов. Из-за ограничений в хранении с плавающей запятой ваша частота может в конечном итоге изменяться и в конечном итоге никогда не будет увеличиваться, если значение не будет перенесено, в зависимости от того, сколько сэмплов вы генерируете и используете ли вы float
или double
. Подумайте об этом так: что произойдет, если у вас есть огромное положительное число с плавающей запятой (значение вашего фазового аккумулятора), и вы попытаетесь добавить к нему 0.000004
? Ошибка с плавающей запятой будет округлять ее, чтобы она соответствовала числу с плавающей запятой или двойному, и ошибка приведет к фазовой нестабильности и, в конечном счете, к нестабильности основного тона. Для коротких выборок (например, некоторых циклов) в этом случае обертка не понадобится, но для многих многих циклов она служит для стабилизации основного тона и фазового аккумулятора с течением времени.
Наконец, тэта будет использоваться для хранения последнего значения линейного изменения фазы, чтобы возобновить генерацию с того места, где оно остановилось при следующем вызове рендеринга. Без этого выход перезапустится с 0 на границах вызова рендера, что приведет к очень неприятным шумам и неправильным частотам.
С учетом всех обстоятельств: скорее всего, это была простая демонстрация и быстрый способ создания синуса в этом контексте. Ваш подход имеет несколько «дорогостоящих» преобразований, но он не требует разветвлений - он может быть быстрее, чем оригинал, особенно для более высоких частот.