Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2018, 17:57   #1
ZenBooster
Пользователь
 
Регистрация: 10.05.2018
Сообщений: 13
По умолчанию [C++] Синусоида убывающей частоты

Пишу сирену на с++ Столкнулся с тем, что на отрезке от верхней частоты к нижней, синусоида замедляется до нулевой частоты, а затем частота вновь растет до некоторого значения! С чем это может быть связано, и как это побороть?

Код:
#define FREQUENCY 44100
#define MAX_SAMPLE_VAL 0xff

#define FMIN 400.0
#define FMAX 1400.0

cWail::cWail(void)
{
	double i, j;

	//int dt_i = 16;
	//int dt_j = 4;
	double dt_i = 0.04;
	int max_j = 1;

	sz_pdata += 2 * (max_j * (FMAX - FMIN + dt_i) / dt_i);
	p_data = new char[sz_pdata];
	ZeroMemory(p_data, sz_pdata);
	char *p = p_data;

	double t = 0;
	/*for (i = FMIN; i < FMAX; i+= dt_i)
	{
		for (int j = 0; j < max_j; j++)
		{
			double v = sin(2.0 * PI * t / ((double)FREQUENCY / i));
			//*p++ = (v > 0) ? MAX_SAMPLE_VAL : 0; // meander
			*p++ = (1 + v) * 0.5 * MAX_SAMPLE_VAL; // sine
			t += 1.0;
		}
	}*/

	for (i = FMAX; i > FMIN; i-= dt_i)
	{
		for (int j = 0; j < max_j; j++)
		{
			double v = sin(2.0 * PI * t / ((double)FREQUENCY / i));
			//*p++ = (v > 0) ? MAX_SAMPLE_VAL : 0; // meander
			*p++ = (1+v) * 0.5 * MAX_SAMPLE_VAL; // sine
			t += 1.0;
		}
	}
	/*FILE *f;
	errno_t e = fopen_s(&f, "sine.bin", "wb");
	if (!e)
	{
		fwrite(p_data, 1, sz_pdata, f);
		fclose(f);
	}*/
	sound_data.SetSource(p_data, 0, sz_pdata);
}
Изображения
Тип файла: jpg sine.jpg (63.3 Кб, 37 просмотров)
ZenBooster вне форума Ответить с цитированием
Старый 11.05.2018, 09:28   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Я не вижу здесь на осциллограмме нулевой частоты. Уменьшилась до минимальной и затем в точке, близкой к минимуму, начала зеркально увеличиваться (если спроецировать на механику, то колесо в нижней точке замерло на миг и начало повораитваться в обратную сторону).
digitalis вне форума Ответить с цитированием
Старый 11.05.2018, 12:05   #3
ZenBooster
Пользователь
 
Регистрация: 10.05.2018
Сообщений: 13
По умолчанию

В итоге вот так все работает:

Код:
cWail::cWail(void)
{
	double i, j;

	double dt_i = 0.02;
	double phase = 0.0;
	int t = 0;

	//sz_pdata += 2 * ((FMAX - FMIN + dt_i) / dt_i);
	for (i = FMIN; i <= FMAX; i += dt_i)
	{
		double v = sin(phase);
		phase = fmod((phase + 2.0 * PI * i / (double)FREQUENCY), (2 * PI));
		t++;
	}
	for (i = FMAX; i >= FMIN || phase > 0.01; i -= dt_i)
	{
		double v = sin(phase);
		phase = fmod((phase + 2.0 * PI * i / (double)FREQUENCY), (2 * PI));
		t++;
	}
	sz_pdata = t;

	p_data = new char[sz_pdata];
	ZeroMemory(p_data, sz_pdata);
	char *p = p_data;
	phase = 0.0;
	t = 0;

	for (i = FMIN; i <= FMAX; i+= dt_i)
	{
		double v = sin(phase);
		phase = fmod((phase + 2.0 * PI * i / (double)FREQUENCY), (2 * PI));
		//*p++ = (v > 0) ? MAX_SAMPLE_VAL : 0; // meander
		*p++ = (1 + v) * 0.5 * MAX_SAMPLE_VAL; // sine
		t++;
	}
	for (i = FMAX; i >= FMIN || phase > 0.01; i-= dt_i)
	{
		double v = sin(phase);
		phase = fmod((phase + 2.0 * PI * i / (double)FREQUENCY), (2 * PI));
		//*p++ = (v > 0) ? MAX_SAMPLE_VAL : 0; // meander
		*p++ = (1 + v) * 0.5 * MAX_SAMPLE_VAL; // sine
		t++;
	}

	/*FILE *f;
	errno_t e = fopen_s(&f, "sine.bin", "wb");
	if (!e)
	{
		fwrite(p_data, 1, sz_pdata, f);
		fclose(f);
	}*/
	sound_data.SetSource(p_data, 0, sz_pdata);
}
Спектр:
Изображения
Тип файла: jpg sine_spectr.jpg (55.4 Кб, 131 просмотров)

Последний раз редактировалось Вадим Мошев; 17.05.2018 в 19:27.
ZenBooster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синусоида: анимация iFlash66 Общие вопросы Delphi 2 19.02.2013 08:36
Преобразователь частоты Sparky Помощь студентам 1 15.12.2012 11:50
Конкретные частоты БПФ Krendel' Помощь студентам 6 24.01.2011 20:12
Генератор звуковой частоты doober Общие вопросы .NET 3 11.09.2010 22:35
Синусоида jone Мультимедиа в Delphi 1 31.05.2009 10:19