Как генерировать синусоидальную волну?

Доброго времени суток!

Суть вопроса такова. Необходимо написать функцию генерирования синусоидальной волны с определенной частотой, амплитудой и длительностью. У меня есть уже работающий код, но сделан он методом перебора, а хотелось бы понять суть.

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 - индекс массива. Где я туплю? :)
  • Вопрос задан
  • 358 просмотров
Решения вопроса 2
si1n3rd
@si1n3rd Автор вопроса
Отвечу сам же на свой вопрос. Отдельное спасибо Борис Сёмов, статьи помогли дойти до понимания решения. Результат, к которому я пришел ранее, оказался верным, но сейчас я уже понимаю, откуда он взялся.

Ответ здесь

Итак, x(t) = A*sin(w*t + phi), для упрощения задачи phi проигнорируем в данном случае. Пусть, t = n*Td, где соответственно Td - период дискретизации, тогда x(n*Td) = A*sin(w*n*Td). w = 2 * pi * f, где f - частота генерируемого сигнала. Так, как частота дискретизации в нашем случае величина константная, то получаем
следующую зависимость x(n) = A * sin(2 * pi * f * Td).


P.S. Вроде как все верно :)
Ответ написан
kotomyava
@kotomyava
Системный администратор
Вам, вероятно для начала помогут вот такие определения:
https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%81%D...
https://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D...
https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D...
Так можно будет понять, как, например, посчитать необходимую частоту дискретизации, чтобы собрать корректный синусоидальный сигнал.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
АКМЭ сервис Санкт-Петербург
от 80 000 до 100 000 руб.
Dioram Санкт-Петербург
от 250 000 руб.