Как генерировать синусоидальную волну? Доброго времени суток!
Суть вопроса такова. Необходимо написать функцию генерирования синусоидальной волны с определенной частотой, амплитудой и длительностью. У меня есть уже работающий код, но сделан он методом перебора, а хотелось бы понять суть.int16_t *sine_gen(float amp, float freq, float sec) {
int16_t *sine;
int size;
int i;
double period;
size = 44100 * sec;
x = freq / 44100;
sine = malloc(size * sizeof(int16_t));
for(i = 0; i

21 Авг 2019 в 06:23
241 +1
0
Ответы
1

Ваш текущий код уже содержит правильную формулу для генерации синусоидальной волны. Формула x(t) = Asin(wt + ph) может быть преобразована в дискретную формулу x(n) = Asin(2πfn), где n - индекс массива, f - частота волны в Гц, A - амплитуда и w = 2πf. Ваш код правильно использует эту формулу.

Единственное, что можно улучшить в вашем коде, это вынести вычисление x за пределы цикла for, и использовать его напрямую в формуле для уменьшения вычислительной нагрузки. Вот как это можно сделать:

int16_t *sine_gen(float amp, float freq, float sec) {
int16_t *sine;
int size;
int i;
double period = 1 / freq;
size = 44100 * sec;
sine = malloc(size * sizeof(int16_t));
for(i = 0; i < size; i++) {
sine[i] = amp * INT16_MAX * sin(2 * M_PI * freq * i / 44100);
}
return sine;
}

Этот код будет эффективнее по производительности, так как избавляется от лишнего вычисления переменной x.

20 Апр 2024 в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир