Как генерировать синусоидальную волну? Доброго времени суток! Суть вопроса такова. Необходимо написать функцию генерирования синусоидальной волны с определенной частотой, амплитудой и длительностью. У меня есть уже работающий код, но сделан он методом перебора, а хотелось бы понять суть.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 < size; i++) { sine[i] = amp * INT16_MAX * sin(2 * M_PI * i * x); } return sine; } Формула синусоидальной волны: x(t) = Asin(wt + ph). Хотелось бы понять, как прийти к формуле x(n), где n - индекс массива. Где я туплю? :)
Ваш текущий код уже содержит правильную формулу для генерации синусоидальной волны. Формула 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.
Ваш текущий код уже содержит правильную формулу для генерации синусоидальной волны. Формула 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.