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

📄 smad.cpp

📁 声音采集源程序
💻 CPP
字号:
#include <dos.h>
#include <bios.h>
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#define  SIZE 2
#define SIZE1 4
#define   N  4500
#define   KG 2.184
unsigned int offset1,seg1;
void far s1aq10();//远程调用函数(采集声音数据汇编程序)
unsigned int far *buf=(unsigned int *)0x40000000;//分配一个缓冲区,地址固定
 //unsigned int *buf=NULL,*buff;
 unsigned int *buff;
int mem;


void sample()//声音信号采样函数
{
	int  f1,sa,wc;
	int b,b1,b2;

	f1=0x3f;
	sa=4;//采样频率为4K
	wc=0x10;


//      8254-2 INITIALIZATION
	//对采集板进行初始化

	b=(5000/sa);
	b2=b/256;
	b1=b-b2*256;
	outp(0x34c,f1);

	outp(0x34d,0x0);  //   SAMPLING CLOCK INITIALIZATION 先让采样停止

	outp(0x34b,0x34);  // COUNTER 0 MODE 2 * WRITE CONTROL WORD
	                   //计数器0为模式2,0x34b为8254控制口,0x34为控制字
	outp(0x348,b1);    //写计数器0,低字节
	outp(0x348,b2);    //写计数器0,高字节
	outp(0x34b,0x74);  // COUNTER 1 MODE 2 * WRITE CONTROL WORD,计数器1模式2,0x74为控制字
	outp(0x349,b1);        //计数器1,低字节
	outp(0x349,b2);       //计数器1,高字节
	outp(0x34b,0xb0);    // COUNTER 2 MODE 0 * WRITE CONTROL WORD
	outp(0x34a,b1);     //计数器2,低字节
	outp(0x34a,b2);    //计数器2,高字节
	outp(0x34f,0x1);  // FROM 1 WAY BEGIN ( COUNTER Clear 0 )

//  SECOND  INITIALIZATION WAY COUNTROL
	 outp(0x34d,wc);       //  SAMPLING CLOCK START

//     printf("\n s1ad1 CALL s1aq10\n ");

//     printf("   run  interrupt routine  s1aq10\n\n");

	s1aq10();//调用汇编采集声音数据程序
}
//////////////////////////////////////////////
////    显示一个平均值,仅供参考        //////
////////////////////////////////////////////
float countG(int gg[])
{ FILE *fp;
  float G;
  int i,j;//,gg[N],ss[N];
 G=0.0;
   for(i=0;i<500;i++){
	   G=G+(float)(gg[i])/500.0;
	  }
 G=G/KG;
// printf("G=%f,gg[]=%d\n",G,gg[2]);
 return G;
}
//////////////////////////////////////////////
void main()
{   float GG;
	FILE *fp;
	FILE *fp_TrueData;
	int count=20480,i,m,bb[5001];
	/*
	buf=(unsigned int *)malloc(45*1024);
	 if(buf==NULL)
	 {
	     printf("not enough memory to allocate buf\n");
	     return ;
	 }
	 */
	 mem=biosmemory(); //use Bios interrupt OX12 to return the size of RAM
	 printf("ram=%d",mem);
	 //---------------------把缓冲区与数据段联系起来
	 seg1=FP_SEG(buf);   //get buf's segment  to segment
	 offset1=FP_OFF(buf);    //get buf's offset to offset
//-------------------------------------------------------

	 if((fp=fopen("smad.bin","wb"))==NULL)//两路采集的声音数据文件名及其路径
	 {
		printf("Cannot open file smad.bin in main()\n");
		free(buf);
		return;
	 }
	sample();//调用采样函数
	buff=buf+600;//缓冲区前面的数据不稳定,空出600个点的位置(600为个人设定,可修改)
	fwrite(buf,sizeof(int),count,fp);//写入两路采集的声音数据
	for(m=0;m<5000;m++)//把缓冲区的数据(两路)中抽取第二路采集的数据,并把其放在整形数组bb[m]中
	{
			buff++; // modefied(修改)
			bb[m]=(int)(*buff);
			buff++;
			//buff++; // added later
	}
	//GG=countG(bb);

	if((fp_TrueData = fopen("data.bin","wb")) == NULL)//采集数据的文件名及其路径(存储在执行采集程序所在的文件夹中)
	{
	    printf("cant create output data file!\n");
	    return;
	}
	int *buf_bb;//定义一个整形指针,指向分配的缓冲区
	buf_bb =  (int *)malloc(5000*sizeof(int));//为缓冲区分配内存,大小为:点数*每个点占的字节数
	if(buf_bb == NULL)
	{
	    printf("can not malloc memory!\n");
	    return;
	}
	for(m=0;m<5000;m++)//把整形数组中的第二路数据放入buf_bb中
	{
	   *(buf_bb+m) = bb[m];
	   printf("buf_bb[%d] = %d\n",m,*(buf_bb+m));//显示最终存储的数据以查看(如不需要显示可以不用)

	    /* 显示格式:每20行显示一次,
	    if((m>0) && (m % 20) == 0)
	    {
		printf("\n");
		getch();//敲任何键显示下一页
	    }
	    */
	}
	fwrite(buf_bb,sizeof(int),5000,fp_TrueData);//向buf_bb中写入采集的声音数据(5000点)
	fclose(fp_TrueData);//关闭文件句柄
	free(buf_bb);//释放内存

	fclose(fp);//关闭文件句柄
	 //free(buf);
	 //printf("G=%f\n",GG);
	 printf("\nEND.");

}

⌨️ 快捷键说明

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