⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fft.c

📁 Vc中关于FFT算法的编程
💻 C
📖 第 1 页 / 共 2 页
字号:

	/* settup graphics mode */

	registerbgidriver(CGA_driver);
	registerbgidriver(EGAVGA_driver);

	initgraph(&GraphDriver, &GraphMode, "");

	if (graphresult() != grOk)  {
		fprintf(stderr, "fft: %s\n", grapherrormsg(graphresult()));
		exit(1);
	}

	if ((i_size = getgraphmode()) != CGAHI)
		setbkcolor(BLACK);

	switch (i_size)  {
	case CGAHI:
		Primary = WHITE;
		Cursor  = WHITE;
		Length  = 100.0;
		Bottom  = 150;
		break;
	case EGAHI:
		Primary = LIGHTGRAY;
		Cursor  = LIGHTGREEN;
		Length  = 250.0;
		Bottom  = 300;
		break;
	case VGAHI:
		Primary = LIGHTGRAY;
		Cursor  = LIGHTGREEN;
		Length  = 380.0;
		Bottom  = 430;
	}

	setcolor(Primary);
	setfillstyle(SOLID_FILL, Primary);
	settextjustify(LEFT_TEXT, TOP_TEXT);
	settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);

	cleardevice();

	outtextxy(TEXTX, TEXTY, "Computing FFT");

	/* Draw ruler line */

	line(LEFT, Bottom + 5, RIGHT, Bottom + 5);
	for (i_size = LEFT; i_size <= RIGHT ; i_size += 10)  {
		line(i_size, Bottom + 5, i_size, Bottom + 10);
		line(i_size + 1, Bottom + 5, i_size + 1, Bottom + 10);
	}

	/* create under-cursor memory */

	i_size = imagesize(LEFT, TOP, LEFT + 1, Bottom);
	Save   = malloc(i_size);
}

void commands()
{
	int	key, filter;
	char	string[4];

	setcolor(BLACK);	/* erase text */
	outtextxy(TEXTX, TEXTY, "Computing FFT");
	setcolor(Primary);

	Left   = 320;
	filter = 128;
	strcpy(string, "128");
	outtextxy(TEXTX, TEXTY, "Filter # 128");
	getimage(Left, TOP, Left + 1, Bottom, Save);
	setfillstyle(SOLID_FILL, Cursor);
	bar(Left, TOP, Left + 1, Bottom);

	for (;;)  {
		while (bioskey(1) == 0)		/* wait for key press */
			;
		key = getkey();

		switch(key)  {		/* find out which key was pressed */
		case HOMEKEY:
j1:			putimage(Left, TOP, Save, COPY_PUT);
			filter = 0;
			Left = LEFT;
			getimage(Left, TOP, Left + 1, Bottom, Save);
			bar(Left, TOP, Left + 1, Bottom);

			setcolor(BLACK);	/* erase old text */
			outtextxy(TEXTXN, TEXTY, string);
			setcolor(Primary);

			sprintf(string, "%d", filter);
			outtextxy(TEXTXN, TEXTY, string);
			break;
		case ENDKEY:
j2:			putimage(Left, TOP, Save, COPY_PUT);
			filter = 255;
			Left = RIGHT - 1;
			getimage(Left, TOP, Left + 1, Bottom, Save);
			bar(Left, TOP, Left + 1, Bottom);

			setcolor(BLACK);	/* erase old text */
			outtextxy(TEXTXN, TEXTY, string);
			setcolor(Primary);

			sprintf(string, "%d", filter);
			outtextxy(TEXTXN, TEXTY, string);
			break;
		case CTRLLEFTKEY:
			if (filter <= 9)
				goto j1;

			putimage(Left, TOP, Save, COPY_PUT);
			Left -= 20;
			filter -= 10;
			getimage(Left, TOP, Left + 1, Bottom, Save);
			bar(Left, TOP, Left + 1, Bottom);

			setcolor(BLACK);	/* erase old text */
			outtextxy(TEXTXN, TEXTY, string);
			setcolor(Primary);

			sprintf(string, "%d", filter);
			outtextxy(TEXTXN, TEXTY, string);
			break;
		case LEFTKEY:
			if (filter <= 0)  {
				beep();
				break;
			}

			putimage(Left, TOP, Save, COPY_PUT);
			Left -= 2;
			filter--;
			getimage(Left, TOP, Left + 1, Bottom, Save);
			bar(Left, TOP, Left + 1, Bottom);

			setcolor(BLACK);	/* erase old text */
			outtextxy(TEXTXN, TEXTY, string);
			setcolor(Primary);

			sprintf(string, "%d", filter);
			outtextxy(TEXTXN, TEXTY, string);
			break;
		case CTRLRIGHTKEY:
			if (filter >= 245)
				goto j2;

			putimage(Left, TOP, Save, COPY_PUT);
			Left += 20;
			filter += 10;
			getimage(Left, TOP, Left + 1, Bottom, Save);
			bar(Left, TOP, Left + 1, Bottom);

			setcolor(BLACK);	/* erase old text */
			outtextxy(TEXTXN, TEXTY, string);
			setcolor(Primary);

			sprintf(string, "%d", filter);
			outtextxy(TEXTXN, TEXTY, string);
			break;
		case RIGHTKEY:
			if (filter >= 255)  {
				beep();
				break;
			}

			putimage(Left, TOP, Save, COPY_PUT);
			Left += 2;
			filter++;
			getimage(Left, TOP, Left + 1, Bottom, Save);
			bar(Left, TOP, Left + 1, Bottom);

			setcolor(BLACK);	/* erase old text */
			outtextxy(TEXTXN, TEXTY, string);
			setcolor(Primary);

			sprintf(string, "%d", filter);
			outtextxy(TEXTXN, TEXTY, string);
			break;
		case F1:
			if (PrintScreen())
				bee_bop();
			break;
		case ESC:
			quit();
		default:
			beep();
		}
	}
}

void beep()
{
	sound(200);
	delay(125);
	nosound();
}

void bee_bop()
{
	sound(1000);
	delay(80);
	sound(200);
	delay(160);
	sound(1000);
	nosound();
}

/*
 *	Return to MS-DOS operating system
 */

void quit()
{
	sound(1000);
	delay(250);
	nosound();

	closegraph();

	free((char *)Save);

	exit(0);
}

/*
 *	Dumps a screen to printer in Double Density landscape format.
 *	This routine is from the Borland Programming Forum on CompuServe.
 *
 *	returns TRUE on error
 */

int PrintScreen()
{
	int			X,Y,YOfs;
	int			BitData,MaxBits;
	unsigned int		Height,Width;
	struct viewporttype 	Vport;

	getviewsettings(&Vport);
	Width  = Vport.bottom - Vport.top;
	Height = (Vport.right + 1) - Vport.left;

	if (PrintChar(27))
		return (1);

	if (PrintChar('3'))
		return (1);

	if (PrintChar(24))	/* 24/216 inch line spacing */
		return (1);

	Y = 0;
	while (Y < Height)  {
		if (PrintChar(27))
			return (1);

		if (PrintChar('L'))	/* Double Density */
			return (1);

		if (PrintChar(Width & 0xff))
			return (1);

		if (PrintChar(Width >> 8))
			return (1);

		for (X = Width - 1; X >= 0; X--)  {
			BitData = 0;
			if ((Y + 7) <= Height)
				MaxBits = 7;
			else
				MaxBits = Height - Y;

			for (YOfs = 0; YOfs <= MaxBits; YOfs++)  {
				BitData = BitData << 1;
				if (getpixel(YOfs + Y, X) > 0)
					BitData++;
			}

			if (PrintChar(BitData))
				return (1);
		}

		if (PrintChar('\r'))
			return (1);

		if (PrintChar('\n'))
			return (1);

		Y += 8;
	}

	PrintChar(12);		/* formfeed */

	return (0);
}

/*
 *	returns TRUE on error
 */

int PrintChar(out)
int	out;
{
	unsigned char	ret;

	ret = biosprint(0, out, 0);
	if ((ret & 0x29) || !(ret & 0x10))
		return 1;
	else
		return 0;
}

int getkey()
{
	int	key, lo, hi;

	key = bioskey(0);
	lo = key & 0x00FF;
	hi = (key & 0xFF00) >> 8;

	return((lo == 0) ? hi + 256 : lo);
}

/* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -